TIME_WAIT에서 소켓 수를 줄이는 방법은 무엇입니까?


36

우분투 서버 10.04.1 x86

nginx 뒤에 FCGI HTTP 서비스가있는 시스템이 있는데, 많은 다른 클라이언트에게 많은 작은 HTTP 요청을 제공합니다. (피크 타임에 초당 약 230 건의 요청으로, 헤더가있는 평균 응답 크기는 650 바이트이며 하루에 수백만 개의 다른 클라이언트입니다.)

결과적으로 TIME_WAIT에 많은 소켓이 걸려 있습니다 (그래프는 아래의 TCP 설정으로 캡처됩니다).

TIME_WAIT

소켓 수를 줄이고 싶습니다.

이 외에 무엇을 할 수 있습니까?

$ 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 소켓에 대한 문제가 남아있을 것입니다. 곧 별도의 컴퓨터에 두 번째 작업자를 추가 할 계획입니다. 이 경우 도메인 소켓을 사용할 수 없습니다.


무닌이 뻔뻔스럽게 거짓말을하고있는 것 같습니다. 카일의 답변에 대한 의견을 참조하십시오. 지금 조사 중입니다.
Alexander Gladysh


이제 Munin이 거짓말을하지 않는 것 같지만 오히려 잘못된 음모를보고 있습니다 ...
Alexander Gladysh

답변:


28

시작하기 위해해야 ​​할 한 가지는를 수정하는 것 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 -lMunin보다 빠른 피드백을 위해 사용 합니다.


1
@Kyle : 어떤 값을 net.ipv4.tcp_fin_timeout추천 하시겠습니까?
Alexander Gladysh

1
@Kyle : 클라이언트 --tcp-소켓 ->의 nginx (부하 분산 역방향 프록시) --tcp-소켓 -> nginx를 (근로자) --domain 소켓 ->있는 fcgi - 소프트웨어
알렉산더 Gladysh

2
나는 말할 3020입니다. 사용해보십시오. 많은 부하가 있으므로 많은 TIME_WAIT 종류가 의미가 있습니다.
Kyle Brandt

1
@Kyle : 바보 같은 질문에 대해 유감스럽게 생각합니다 (불행히도 지금까지화물 컬트 레벨에 있습니다). net.ipv4.tcp_fin_timeout에서 1로 변경하면 정확히 무엇을 기대해야 20합니까?
Alexander Gladysh

4
아, 여기 좋은 라이너가 있습니다 : netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c. 따라서 @Alex는 Munin이 마음에 들지 않으면이 통계를 모니터링하는 방법을 자세히 설명합니다. 어쩌면 유일한 문제는 Munin은 :-) 당신에게 잘못된 데이터를주고 있다는 것입니다
카일 브랜

1

tcp_tw_reuse는 TIME_WAIT 연결을 재사용 할 수 있으므로 비교적 안전합니다.

또한 포트가 부족한 경우로드 밸런서 뒤의 다른 포트에서 수신 대기하는 더 많은 서비스를 실행할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.