socket.io를 쓰고 있는데 사용 중인 소켓 개수가 줄어들지 않습니다.


nodejs 와 socket.io로 실시간 서비스를 구현했습니다.

socket.io connection은 100개 안팍으로 생기는데

터미널에서 사용중인 소켓을 보면

cat /proc/20807/net/sockstat

터미널

100개가 훨씬 넘고 시간이 지나면서 계속해서 증가합니다. 그래서 process당 파일 디스크립터 할당 최대 개수를 넘어가서 결국 더 이상 소켓 연결이 불가능해지고 app.js를 restart해줘야하는 문제가 생깁니다.

어떻게 이 문제를 해결할 수 있을까요?

  • 2016년 04월 12일에 작성됨

조회수 248


2 답변


좋아요
2
싫어요
채택취소하기

저도 같은 문제를 겪고 있습니다. 우선 클라이언트가 어떤 환경인가요? 저의 경우 클라이언트가 안드로이드인데 안드로이드에서 정상 종료해도 해당 소켓 연결이 정상적으로 종료되지 않더군요. 이게 제가 사용한 라이브러리의 문제인지 안드로이드의 문제인지는 더 확인을 해 보지 못했습니다. 안드로이드에서 종료할 때 System.exit(0) 으로 종료하면 바로 연결이 끊기는 걸 확인해서 그렇게 종료를 시켜서 쓰레기 연결이 많이 없어지긴 했지만 그래도 완전히 해결된 것은 아니라서 저도 일정 시간마다 node.js app 을 재시작 하는걸로 문제를 회피하고 있습니다. 현재 동접 2000 까지는 서비스에 문제 없이 운영중입니다.

  • 2016년 04월 13일에 작성됨

  • 모바일의 경우 통신사 네트워크를 사용하는데 socket을 close해도 서버에서 인식하지 못하는 경우가 있습니다. 그래서 서버에서 주기적으로 ping 메시지를 보내고 응답이 없는 경우 서버에서 close하는 방식을 사용합니다.    이확영   2016.4.13 09:26     
  • 다들 비슷한 문제를 겪고 계셨군요 답변 감사합니다!    bowbowbow   2016.4.13 16:19     
  • 이확영님 socket.io 에서 heartbit 으로 주기적으로 체크해서 처리해 주는 줄 알았는데 추가적으로 처리를 해줘야 하나 보군요. 저도 더 확인해 봐야겠네요.    kdh   2016.4.23 13:54     

노드는 기본적으로 많은 커넥션이 붙어 있어도 잘 버티도록 설계가 되어 있기 때문에 따라서 정리가 조금 늦게 되어도 보통은 문제가 없습니다.

하지만 재시작으로 문제를 처리하는건 미봉책이라 분명 다시 문제가 생기실 겁니다.

(매 재시작마다 접속중인 사용자들의 접속이 모두 끊기는것 역시 큰 문제겠죠)

가장 먼저 클라이언트-서버에 접속을 종료해 보면서 어디에서 소켓이 정리되지 않는지 코드상에서 확인을 해 주셔야 하고,

다음으로는 위 답변에 있는것 처럼 주기적으로 핑을 보내서 해서 정리가 되지 않은 소켓을 처리해 주어야 합니다.

max open file수가 넘어가는 문제의 경우는 리눅스 커널 파라미터 튜닝으로 어느정도 해결이 가능합니다.

아래 링크나 ulimit관련 내용으로 검색하셔서 설정을 변경해 주세요.

set max open files

  • 2016년 04월 13일에 작성됨
    프로그래밍 언어를 좋아하는 프로그래머

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close