CLOSE_WAIT 상태에서 TCP 연결을 누적하고 결코 발생하지 않는 SLES 시스템이 있습니다. 이러한 설명자는 결국 사용 가능한 모든 메모리를 소모합니다. 현재 3037이 있는데 최근 급하게 재부팅하기 전에는 그 숫자가 훨씬 더 많았습니다.
흥미롭게도 이러한 신호는 청취 프로세스가 예상되는 로컬 포트에 대한 연결에서 발생하지 않습니다. 연관된 PID가 없으며 타이머가 만료된 것으로 보입니다.
# netstat -ton | grep CLOSE_WAIT
tcp 176 0 10.0.0.60:54882 10.0.0.12:31663 CLOSE_WAIT off (0.00/0/0)
tcp 54 0 10.0.0.60:60957 10.0.0.12:4503 CLOSE_WAIT off (0.00/0/0)
tcp 89 0 10.0.0.60:50959 10.0.0.12:3518 CLOSE_WAIT off (0.00/0/0)
# netstat -tonp | grep CLOSE_WAIT
tcp 89 0 10.0.0.59:45598 10.0.0.12:1998 CLOSE_WAIT -
tcp 15 0 10.0.0.59:60861 10.0.0.12:1938 CLOSE_WAIT -
tcp 5 0 10.0.0.59:56173 10.0.0.12:1700 CLOSE_WAIT -
나는 TCP 스택이나 커널 네트워킹에 관해서는 블랙 벨트가 아니지만 매뉴얼 페이지에 따르면 다음 값이 기본값이므로 TCP 구성은 괜찮아 보입니다.
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
그러면 무엇이 주어지나요? 타이머가 만료되면 스택이 이러한 항목을 자동으로 지워야 하지 않나요? 이런 일들이 쌓이면서 실제로는 장기간의 서비스 거부를 겪었습니다.
답변1
아니요, 시간 초과가 없습니다 CLOSE_WAIT
. 나는 이것이 off
당신의 결과가 의미하는 바라고 생각합니다.
를 종료하려면 CLOSE_WAIT
애플리케이션이 명시적으로 소켓을 닫거나 종료해야 합니다.
바라보다CLOSE_WAIT를 중단하는 방법.
netstat
프로세스 표시줄에 표시된 경우 :-
- 적절한 권한과 기능(예: 루트로)을 사용하여 실행하고 있습니까?
- 커널 프로세스(예: nfsd)일 수 있습니다.
답변2
CLOSE_WAIT
클라이언트가 연결을 닫고 있지만 애플리케이션이 연결을 닫지 않았거나 클라이언트가 아직 닫지 않았음을 나타냅니다. 어떤 프로그램에 이 문제가 있는지 확인해야 합니다. 사용해 보세요
netstat -tonp 2>&1 | grep CLOSE
어떤 프로그램이 계속 연결되어 있는지 확인합니다.
프로그램이 나열되지 않으면 서비스는 커널에서 제공됩니다. 이는 nfs
또는 와 같은 RPC 서비스일 수 있습니다 rpc.lockd
. 청취 커널 서비스를 나열할 수 있습니다.
netstat -lntp 2>&1 | grep -- -
RPC 서비스가 고정 포트에 바인딩되지 않은 경우 연결에 표시된 임시 포트에 바인딩됩니다. 다른 서버의 프로세스와 설치를 확인할 수도 있습니다.
다음을 수행하여 NFS 서비스를 고정 포트에 바인딩할 수 있습니다.
- 사용되지 않은 NFS 포트 4개를 선택합니다(여기에서는 32763-32766이 사용됨).
- NFS용 고정 포트 추가
/etc/services
rpc.statd-bc 32763/udp # RCP statd 브로드캐스트 rpc.statd-bc 32763/tcp rpc.statd 32764/udp # RCP statd 모니터링 rpc.statd 32764/tcp rpc.mountd 32765/udp # RPC 마운트 rpc.mountd 32765/tcp rpc.lockd 32766/udp # RPC 잠금/nlockmgr rpc.lockd 32766/tcp
- 옵션을 사용하도록 statd 구성
--port 32763 --outgoing-port 32764
- 이 옵션을 사용하려면 rpcmountd를 구성하세요.
--port 32765
- NFS 및 RPC 서비스를 종료하고 다시 시작합니다.
답변3
하지만미켈의 답변NFS와 같은 커널 측 소켓이 이 문제를 일으킬 수 있다는 것도 사실일 수 있습니다. CLOSE_WAIT -
연관된 FD가 없는 항목이 더 일반적입니다.
listen()
로컬 대기열에 있는 동안 상대방이 이전에 닫은 연결을 accept()
호출할 수 있습니다.나의 자세한 답변과 재현은 여기에 있습니다.
CLOSE_WAIT 상태에서는 영원히 지속될 것 같습니다.
그들은 당신이 나올 때까지 영원히 그 상태로 있을 것입니다
accept()
그 다음에는close()
그들, 또는close()
전체 소켓(해결책이 아닐 수도 있음)
이 글에도 자세히 설명되어 있습니다링크 답변.
이러한 설명자는 결국 사용 가능한 모든 메모리를 소모합니다.
man 2 listen
대기열의 길이는 다음에 따라 listen()
제한되므로 이런 일이 발생해서는 안 됩니다.
/proc/sys/net/ipv4/tcp_max_syn_backlog # default 4096
/proc/sys/net/core/somaxconn # default 4096
물론 여러 개의 소켓이 있는 경우를 제외하고 listen()
위의 제한은 각 소켓에 대한 것입니다.