우분투 서버 10.04.1 x86
nginx 뒤에 FCGI HTTP 서비스가있는 시스템이 있는데, 많은 다른 클라이언트에게 많은 작은 HTTP 요청을 제공합니다. (피크 타임에 초당 약 230 건의 요청으로, 헤더가있는 평균 응답 크기는 650 바이트이며 하루에 수백만 개의 다른 클라이언트입니다.)
결과적으로 TIME_WAIT에 많은 소켓이 걸려 있습니다 (그래프는 아래의 TCP 설정으로 캡처됩니다).
소켓 수를 줄이고 싶습니다.
이 외에 무엇을 할 수 있습니까?
$ cat / proc / sys / net / ipv4 / tcp_fin_timeout 1 $ cat / proc / sys / net / ipv4 / tcp_tw_recycle 1 $ cat / proc / sys / net / ipv4 / tcp_tw_reuse 1
업데이트 : 머신의 실제 서비스 레이아웃에 대한 세부 사항 :
클라이언트 ----- TCP 소켓-> nginx (로드 밸런서 리버스 프록시) ----- TCP 소켓-> nginx (작업자) -도메인 소켓-> fcgi-software -단일 지속성 TCP 소켓-> Redis -단일 지속성 TCP 소켓-> MySQL (다른 시스템)
로드 밸런서-> 작업자 연결을 도메인 소켓으로 전환해야하지만 TIME_WAIT 소켓에 대한 문제가 남아있을 것입니다. 곧 별도의 컴퓨터에 두 번째 작업자를 추가 할 계획입니다. 이 경우 도메인 소켓을 사용할 수 없습니다.
답변
시작하기 위해해야 할 한 가지는를 수정하는 것 net.ipv4.tcp_fin_timeout=1
입니다. 그것은 낮게하는 방법입니다. 아마 30보다 훨씬 낮게는 안될 것입니다.
이것은 nginx 뒤에 있습니다. 이것은 nginx가 리버스 프록시로 작동한다는 것을 의미합니까? 이 경우 연결은 2 배입니다 (하나는 클라이언트에, 하나는 웹 서버에). 이 소켓이 어느쪽에 속하는지 알고 있습니까?
업데이트 :
fin_timeout은 FIN-WAIT-2에 머무르는 시간입니다 ( networking/ip-sysctl.txt
커널 설명서에서).
tcp_fin_timeout - INTEGER
Time to hold socket in state FIN-WAIT-2, if it was closed
by our side. Peer can be broken and never close its side,
or even died unexpectedly. Default value is 60sec.
Usual value used in 2.2 was 180 seconds, you may restore
it, but remember that if your machine is even underloaded WEB server,
you risk to overflow memory with kilotons of dead sockets,
FIN-WAIT-2 sockets are less dangerous than FIN-WAIT-1,
because they eat maximum 1.5K of memory, but they tend
to live longer. Cf. tcp_max_orphans.
아마 당신은 리눅스가 TIME_WAIT 소켓 번호를 32k 캡처럼 유지하도록해야한다고 생각합니다. 이곳에서 리눅스가 그것들을 재활용합니다. 이 링크 에서이 32k가 언급됩니다 .
또한 / proc / sys / net / ipv4 / tcp_max_tw_buckets가 혼동되는 것을 발견했습니다. 기본값은 180000으로 설정되어 있지만 최대 tw 버킷에 관계없이 시스템에 32K TIME_WAIT 소켓이 있으면 TCP 중단이 발생합니다.
이 링크는 또한 TIME_WAIT 상태가 60 초이며 proc을 통해 조정할 수 없음을 나타냅니다.
임의의 재미있는 사실 :
각 소켓마다 netstat를 사용하여 타임 대기 시간에 타이머를 볼 수 있습니다 .netstat -on | grep TIME_WAIT | less
재사용 대 재활용 :
이것들은 흥미 롭습니다. 재사용은 time_Wait 소켓을 재사용 할 수 있고 재활용은 TURBO 모드에 넣습니다.
tcp_tw_recycle - BOOLEAN
Enable fast recycling TIME-WAIT sockets. Default value is 0.
It should not be changed without advice/request of technical
experts.
tcp_tw_reuse - BOOLEAN
Allow to reuse TIME-WAIT sockets for new connections when it is
safe from protocol viewpoint. Default value is 0.
It should not be changed without advice/request of technical
experts.
NAT 클라이언트에 문제가 발생하므로 net.ipv4.tcp_tw_recycle을 사용하지 않는 것이 좋습니다 .
어쩌면 둘 다 켜지 말고 어떤 효과가 있는지보십시오 (한 번에 하나씩 시도하고 어떻게 작동하는지 확인하십시오)? netstat -n | grep TIME_WAIT | wc -l
Munin보다 빠른 피드백을 위해 사용 합니다.
답변
tcp_tw_reuse는 TIME_WAIT 연결을 재사용 할 수 있으므로 비교적 안전합니다.
또한 포트가 부족한 경우로드 밸런서 뒤의 다른 포트에서 수신 대기하는 더 많은 서비스를 실행할 수 있습니다.