2016-06-13 7 views
0

Linux RedHat ES 5 서버에 연결된 약 500 개의 클라이언트가 있습니다. 최근에는 서버와 통신하는 응용 프로그램을 중지하지 않고 다시 부팅 한 클라이언트에 대한 연결이 서버에 유지됩니다. 클라이언트의 netstat은 항상 서버에 설정된 연결을 하나만 반환합니다. 클라이언트 재부팅 후 통신은 새로운 설정된 연결을 통해 실행됩니다. 서버 측에서는 이전 연결이 닫히는 경우가 있으며 때로는 설정된 상태로 유지되어 각 클라이언트에 대해 확립 된 연결 수가 늘어납니다. 다양한 클라이언트 운영 체제가 영향을 받기 때문에이 문제는 응용 프로그램 문제가 아니라 서버의 Linux OS 중 하나라고 생각합니다. 제가지속적인 TCP 연결이 너무 많습니다.

  • net.ipv4.tcp_keepalive_time의 조정 값을 시도 = 600
  • net.ipv4.tcp_keepalive_intvl = 10
  • net.ipv4.tcp_keepalive_probes = 성공하지
  • 9

. 또한 최대 파일 핸들 수 값을 1024에서 2048로 설정하려고 시도했지만 TCP keepalive 시간이 만료 된 후에도 연결이 닫히지 않습니다. 누군가 그 이상한 행동을 일으킬 수있는 아이디어가 있습니까?

답변

1

이러한 설정을 통해 기본 연결 유지 동작 (: 연결 유지가 활성화 된 경우)을 구성 할 수 있습니다. 그러나 그들은 keep-alives를 자동으로 만들지 않습니다. 이 기능은 소켓 옵션 인 SO_KEEPALIVE을 통해 명시 적으로 활성화해야합니다.

자세한 내용은 http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/을 참조하십시오. 섹션 3에서 :

커널에서 구성된 경우에도 keepalive 지원은 Linux의 기본 동작이 아닙니다. 프로그램은 setsockopt 인터페이스를 사용하여 소켓에 대해 킵 얼라이브 제어를 요청해야합니다.

+0

안녕 Gil, 답변 해 주셔서 감사합니다! keepalive 매개 변수는 TIMED_WAIT 상태의 연결에 대해서만 작동하지만 연결은 계속 유지됩니다. FIN 등을 보내기 전에 클라이언트가 종료 되었기 때문에 서버가 연결을 닫는 신호를받지 못하는 것 같습니다. 그러나 나는 그것을 어떻게 피할 수 있습니까? – Airogat

+0

번호 Keepalives는 ESTABLISHED 상태의 연결을 종료하기위한 것입니다. 하지만 활성화해야합니다. –

관련 문제