Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

성능웹소켓·실시간

SSE 동시 접속 한도는 CPU보다 파일 서술자 한도에서 먼저 막힌다

스트림 하나가 소켓 하나와 Redis 구독 하나, 서술자 2개를 쓴다. 컨테이너 기본 soft 한도 1024면 약 500명에서 Too many open files가 난다.

SSE 연결 1,500개를 한꺼번에 붙여 보니 505개만 성공하고 나머지는 500 오류였다. 그동안 CPU와 메모리는 거의 놀고 있었고, 로그에는 Too many open files가 남았다.

SSE 스트림 하나는 클라이언트 소켓 하나와 Redis pub/sub 구독 하나, 파일 서술자 2개를 쓴다. 컨테이너의 기본 soft 한도가 1024면 약 500명에서 서술자가 바닥난다. 자원이 아니라 한도에서 먼저 막히는 것이다.

compose의 ulimits로 soft 한도를 올린다. hard 한도는 보통 이미 넉넉하니(이 경우 524288) soft만 올리면 된다.

services:
  api:
    ulimits:
      nofile:
        soft: 65536   # 예시 값
        hard: 524288

적용됐는지는 컨테이너 안에서 실제 프로세스의 한도로 확인한다.

docker compose exec api sh -c 'grep "open files" /proc/1/limits'

이런 한도는 평소 지표에 잡히지 않고 부하 시험에서만 보인다. 동시 접속이 늘 기능이라면 실제 연결 수를 붙여 보는 부하 시험을 한 번은 돌린다.

문의 →