it-swarm-ko.tech

Linux 서버에서 최대 연결 수를 제한하는 것은 무엇입니까?

Linux 서버에서 열 수있는 최대 TCP 소켓 수)를 제어하는 ​​커널 매개 변수 또는 기타 설정은 무엇입니까? 더 많은 연결을 허용하는 단점은 무엇입니까?

ab 을 사용하여 Apache 서버를로드 테스트하는 동안 서버에서 열린 연결을 최대한 쉽게 확장 할 수 있음을 알았습니다. 연결 재사용을 허용하는 ab의 -k 옵션을 그대로두고 약 10,000 개가 넘는 요청을 보내면 Apache는 첫 번째 11,000 정도의 요청을 처리 한 다음 60 초 동안 정지합니다. netstat 출력을 보면 TIME_WAIT 상태에서 11,000 개의 연결이 표시됩니다. 분명히 이것은 정상입니다. TCP 안정성 이유로 때문에 클라이언트와의 연결이 완료된 후에도 연결은 기본적으로 60 초 동안 열려 있습니다.

이것이 서버를 DoS하는 쉬운 방법 인 것처럼 보이며 일반적인 튜닝 및 예방 조치가 무엇인지 궁금합니다.

내 테스트 출력은 다음과 같습니다.

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> Apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.Apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

테스트 중에 실행하는 netstat 명령은 다음과 같습니다.

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab
91
Ben Williams

마침내 연결 수를 제한하는 설정 인 net.ipv4.netfilter.ip_conntrack_max를 찾았습니다. 이것은 11,776로 설정되었으며 내가 설정 한 것은 더 많은 연결을 사용할 수있게되기 위해 tcp_fin_timeout 초 동안 대기하기 전에 테스트에서 처리 할 수있는 요청 수입니다. conntrack 테이블은 커널이 연결 상태를 추적하기 위해 사용하는 것이므로 일단 가득 차면 커널은 패킷을 삭제하고이를 로그에 인쇄하기 시작합니다.

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

다음 단계는 커널이 패킷을 삭제하지 않고 TIME_WAIT 상태의 모든 연결을 재활용하도록하는 것입니다. tcp_tw_recycle를 켜거나 ip_conntrack_maxip_local_port_range에 의해 연결에 사용 가능한 로컬 포트 ​​수보다 크게 늘리면 이런 일이 발생할 수 있습니다. 커널이 로컬 포트를 벗어나면 연결을 재활용하기 시작합니다. 이것은 더 많은 메모리 추적 연결을 사용하지만 문서가 위험하다는 것을 암시하기 때문에 tcp_tw_recycle를 켜는 것보다 더 나은 솔루션 인 것 같습니다.

이 구성을 사용하면 하루 종일 ab를 실행할 수 있으며 연결이 부족하지 않습니다.

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_Orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

tcp_max_orphans 설정은 테스트에 영향을 미치지 않았으며 그 이유를 모르겠습니다. 8192가 있으면 TIME_WAIT 상태에서 연결을 닫을 것이라고 생각하지만 그렇게하지는 않습니다.

66
Ben Williams

당신은 정말로/proc 파일 시스템이 이와 관련하여 당신에게 제공하는 것을보고 싶어합니다.

마지막 페이지에서 다음 사항에 관심이있을 수 있습니다.

  • / proc/sys/net/ipv4/tcp_max_orphans 시스템에 보유 된 최대 소켓 수를 제어합니다 not 이것을 올리면 스왑 불가능한 64kbyte의 메모리를 사용할 수 있습니다. 고아 소켓 당.
  • / proc/sys/net/ipv4/tcp_Orphan_retries 소켓이 분리되고 닫히기 전에 재시도 횟수를 제어합니다. 이 페이지에는 귀하가 관심을 갖고있는 웹 서버에 대한 특정 참고 사항이 있습니다 ...
24
Avery Payne

직접 설정할 수있는 튜너 블이 없다고 생각합니다. 이것은 TCP/IP 조정 범주에 속합니다. 조정할 수있는 것을 찾으려면 'man 7 tcp'를 시도하십시오. sysctl ( 'man 8 sysctl')을 사용하여이를 설정합니다. 'sysctl -a | grep tcp '는 조정할 수있는 대부분을 보여 주지만, 모두 보여줄지 잘 모르겠습니다. 또한 이것이 변경되지 않으면 TCP/IP 소켓은 파일 디스크립터처럼 보입니다. 따라서 this 및 해당 링크의 다음 섹션이 원하는 것일 수 있습니다.

3
Kyle Brandt

Tcp_fin_timeout을 설정하고 다음을 설정하십시오. TIME_WAIT가 더 빨리 종료됩니다.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
2
Jauder Ho

재고 Apache (1)는 250 개의 동시 연결 만 지원하도록 사전 정의되어 제공되었습니다. 더 많은 것을 원한다면 더 많은 동시 세션을 허용하도록 수정해야 할 헤더 파일이 하나 있습니다. 이것이 Apache 2에서도 여전히 사실인지 모르겠습니다.

또한 Apache를 실행하는 계정에 대해 더 많은 열린 파일 설명자를로드 할 수있는 옵션을 추가해야합니다. 이전 설명에서 지적하지 못한 부분입니다.

작업자 설정과 Apache 자체에있는 어떤 종류의 keepalive 시간 초과, 한 번에 실행중인 여분의 서버 수 및 이러한 추가 프로세스가 얼마나 빨리 종료되는지에주의하십시오.

2
rasjani

TIME_WAIT 상태에서 소요되는 시간을 줄일 수 있습니다 (net.ipv4.tcp_fin_timeout 설정). Apache를 YAWS 또는 nginx 또는 이와 유사한 것으로 바꿀 수 있습니다.

더 많은 연결에 대한 절충은 일반적으로 메모리 사용과 관련이 있으며, 포크 프로세스가있는 경우 CPU를 손상시키는 많은 하위 프로세스가 있습니다.

1
Devdas

2.4 버전의 Apache HTTP 서버 벤치마킹 도구 인 ab 에는 -s timeout 옵션이 있습니다. ab (Apache Bench) 오류 : apr_poll : 지정된 시간 초과가 Windows에서 만료 됨 (70007).

이 옵션은 문제를 해결합니다.

0
Dzwiedziu-nkg

단일 IP 주소에서 열 수있는 절대 소켓 수는 2 ^ 16이며 커널이 아닌 TCP/UDP에 의해 정의됩니다.

0
Jason Tan