2014-11-24 3 views
3

여러 클라이언트가 websocket을 열고 데이터를 보내야하는 서버가 있습니다. 많은 클라이언트가 접속을 할 수없는 것처럼하지만 서버 시스템에서웹 소켓 연결이 FIN_WAIT1 FIN_WAIT2 상태로 고정되었습니다.

.. 보이는 나는 lsof 또는 netstat -an, 나는 연결의 많은 상태 FIN_WAIT1와의 연결에서 떨어져 FIN_WAIT2에 표시되는 것을 볼 수행 할 때 ESTABLISHED 상태에 있습니다. 열린 파일에 대한 ulimit는 현재 1024입니다. 열린 상태의 파일 목록에서이 두 상태에 걸린 연결이 포함 되나요? 그렇다면 1024 한계가 곧 사라질 것입니다. https://serverfault.com/questions/7689/how-do-i-get-rid-of-sockets-in-fin-wait1-state

하지만 훨씬 이해가 안 :

/proc/sys/net/ipv4/tcp_orphan_retries은 동일합니다 8에 내가이 링크를 협의 한 https://serverfault.com/questions/274212/what-does-tcp-orphan-retries-set-to-0-mean/408882#408882

보인다 0이다. 나는 웹에서이 2 가지 상태에 대해 읽었으며 프로토콜의 테두리가 있다는 것을 알고 있지만 연결이 유용하지 않은 상태에 머물러 있지 않은 것을 선호합니다. 어떻게 든 그럴 수 있습니까? ulimit을 변경해야합니까? 그러나 그것은 문제가 x가 아닌 x + y의 시간에 발생한다는 것을 의미합니다.

답변

2

Fin_Wait 상태 또는 대기 상태가 표시 될 때마다이를 종종 1/2 세션이라고합니다. TCP 스택은 요청 및 응답의 순서에 대해 매우 엄격한 프로토콜을 따릅니다. 이러한 규칙 때문에 재 시도를 보내서 언제 어떻게 복구해야하는지 알 수 있습니다. 모든 대기 상태의 인스턴스에서 스택은 대기중인 것을 알고 있습니다. 이 조건을 충족시킬 수있는 것은 두 가지뿐입니다. 1) 적절한 응답 또는 2) 제한 시간.

물론 가장 좋은 방법은 적절한 응답을받는 것입니다. 너무 많은 대기가있는 이유를 알아 내기 위해 작업을해야합니다. 때로는 불안정한 스위칭, 라우팅 및 기타 네트워크 관련 활동 때문일 수 있습니다. 그러나 DoS (Denial of Service) 공격은 국가를 신경 쓰지 않기 때문에 발생할 수도 있습니다. 응용 프로그램 계층에서 필요한 자원을 해제 할 수있는 유일한 방법은 응용 프로그램이 제어권을 회복 할 때입니다. TCP는 1) 작업 흐름이 정상적이거나 2) 시간 초과 또는 기타 비정상적인 상태가 발생한 경우에만 제어를 제공합니다. 예를 들어, FIN 및 RST는 순서에 관계없이 언제든지 전송할 수 있습니다. 그들은 둘 다 다른 어떤 국가보다 우선 순위가 높은 것으로 간주됩니다. 모든 클라이언트 또는 호스트가 다른 TCP 스택 구현에 대해 이야기하는 것과 같은 방식으로 작동하는 것은 아닙니다.

시스템에 따라 TCP 스택 매개 변수의 일부, 많거나 적음을 구성 할 수 있습니다. Fin Waits 및 RST Wait의 Timeout 값에 대해 구성 가능한 매개 변수가 있습니다. 아마도 당신은 당신의 문제를 해결하기 위해 이것을 조정할 수 있습니다.