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

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

← 팁

성능웹소켓·실시간

Django async(웹소켓) 서버 성능 점검 목록

DB 연결 수명, thread_sensitive, 전달 경로에서 저장 떼기, 채널 용량, 코어 수만큼 프로세스. 부하 때 지연이 튀면 이 다섯 곳부터 본다.

Django Channels 웹소켓 서버가 평소엔 괜찮다가 사람이 몰리면 지연이 수 초로 튀고 연결이 끊긴다. 하나의 큰 원인보다 작은 병목 여럿이 겹친 경우가 많다. 다음 다섯 곳을 차례로 본다.

  1. DB 연결 수명: CONN_MAX_AGE가 0이면 작업마다 DB 연결을 새로 연다. 연결을 재사용하거나 풀을 쓴다.
  2. thread_sensitive: sync_to_async의 기본값 thread_sensitive=True는 모든 호출을 스레드 하나에 줄 세운다. 연결별로 독립적인 DB 작업은 False로 풀어 준다.
  3. 전달 경로에서 저장 떼기: 실시간 메시지를 전달하기 전에 저장을 기다리지 않는다. 변경은 모아서 주기적으로 저장하고, 종료나 동기화 요청 때만 먼저 저장한다.
  4. 채널 용량: 채널 레이어의 capacity(기본 100)를 넘으면 ChannelFull이 난다. 용량을 늘리고, 버려도 되는 메시지(커서 위치 등)는 버리되 연결은 유지한다.
  5. 코어 수만큼 프로세스: 파이썬 프로세스 하나는 사실상 1코어만 쓴다. 코어 수만큼 프로세스를 두고, 같은 상태를 보는 연결은 같은 프로세스로 모은다.
from asgiref.sync import sync_to_async

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": ["redis://redis:6379/0"], "capacity": 1000},
    }
}

load_room = sync_to_async(_load_room, thread_sensitive=False)

하나씩 고칠 때마다 같은 부하로 p95 지연을 다시 재서, 어느 것이 효과가 있었는지 남긴다.

문의 →