야구와 IT 라이프

KT 위즈 화이팅

IT/이론

리눅스 서버의 보이지 않는 병목: TCP Backlog와 커널 파라미터 최적화 심화 가이드

건도그 2026. 3. 10. 10:00
ON THIS PAGE
반응형

윈도우의 경우는 레지스트리 뭐 이런거 등등으로 되어있지만 실질적으로 커스텀 하기는 쉽지 않은 환경이죠. 리눅스의 경우는 오픈 소스 OS 니까 여러 사람이 수정하는 부분이죠. 그중에서도 가끔 수정 해야하는 경우가 있는데, 왜 해야하는지 이번 포스팅부터 여러 포스트에 걸쳐서 사례들을 들어가지고 이해 해보겠습니다.

소프트웨어 자원이 충분해도 발생하는 '연결 거부'의 미스터리

고성능 네트워크 애플리케이션을 운영하는 엔지니어에게 '접속 지연'이나 '타임아웃'은 가장 까다로운 트러블슈팅 대상 중 하나입니다. CPU 사용률이 $20\%$ 미만이고 메모리 자원이 충분함에도 불구하고 간헐적인 연결 실패가 발생한다면, 이는 리눅스 커널의 네트워크 스택 내부에 존재하는 TCP Backlog 설정 문제일 가능성이 매우 높습니다.

 

네트워크 패킷은 물리적인 랜카드를 지나 커널 스택을 거쳐 애플리케이션으로 전달됩니다. 이 과정에서 커널은 급격히 몰려드는 연결 요청을 일시적으로 보관하는 '대기실'을 운영하는데, 이 대기실의 크기가 너무 작으면 패킷은 애플리케이션 구경도 못 하고 버려지게 됩니다. 본 포스팅에서는 TCP 연결의 메커니즘을 심도 있게 분석하고, 2026년 현재 실무에서 즉시 적용 가능한 커널 튜닝 방안을 단계별로 살펴봅니다.

TCP 3-Way Handshake와 두 가지 큐의 이해

출처: 생성형 이미지, Gemini

리눅스 커널은 TCP 연결을 처리할 때 두 가지 종류의 큐(Queue)를 관리합니다. 이 큐의 동작 방식을 정확히 구분하는 것이 최적화의 핵심입니다.

SYN Backlog (Incomplete Connection Queue)

클라이언트가 $SYN$ 패킷을 보내면 서버는 이를 수신하고 $SYN+ACK$를 응답한 뒤, 클라이언트의 마지막 $ACK$를 기다립니다. 이 '반쯤 열린(Half-open)' 상태의 연결들이 머무는 곳이 바로 SYN Backlog입니다.

  • 관련 파라미터: $net.ipv4.tcp\_max\_syn\_backlog$
  • 특이사항: 이 큐가 가득 차면 서버는 더 이상 새로운 $SYN$ 요청을 받을 수 없으며, 이는 $SYN\ Flooding$ 공격의 주요 타깃이 됩니다.

Listen Backlog (Complete Connection Queue)

3-Way Handshake가 완료되어 ESTABLISHED 상태가 된 연결들은 애플리케이션이 accept() 시스템 콜을 호출하여 가져가기 전까지 Listen Backlog에서 대기합니다.

  • 결정 방식: $min(Application\ backlog,\ net.core.somaxconn)$
  • 특이사항: 애플리케이션의 처리 속도가 느려 이 큐가 가득 차면, 커널은 새로운 연결을 드롭하거나 클라이언트에게 재전송을 요구합니다.

백로그 오버플로우의 징후와 진단 방법

네트워크 패킷이 유실되거나 연결이 거부되는 현상이 발생하면, 커널 통계 수치를 통해 큐의 넘침(Drop) 여부를 데이터로 증명해야 합니다.

nstat을 이용한 통계 확인

가장 명확한 방법은 nstat 명령어를 사용하여 커널의 드롭 카운트를 확인하는 것입니다. TcpExtListenOverflows가 단 하나라도 올라가고 있다면 현재 시스템은 병목 상태입니다.

Bash
 
# Listen Backlog 넘침 확인
nstat -az TcpExtListenDrops TcpExtListenOverflows
  • TcpExtListenOverflows: Listen Backlog가 가득 차서 새로운 연결을 수락할 수 없을 때 증가합니다.
  • TcpExtListenDrops: 백로그 문제뿐만 아니라 메모리 부족 등 다양한 사유로 수신된 패킷이 드롭된 총 횟수입니다.

ss 명령어를 통한 실시간 큐 모니터링

현재 특정 포트에서 대기 중인 큐의 길이를 확인하려면 ss 명령어를 사용합니다.

Bash
 
ss -lnt

출력 결과에서 Send-Q는 해당 포트의 최대 Backlog 크기를 나타내며, Recv-Q는 현재 큐에서 대기 중인 연결의 수를 나타냅니다. Recv-Q > Send-Q인 상황이 지속된다면 애플리케이션이 연결을 가져가는 속도보다 요청이 들어오는 속도가 훨씬 빠르다는 의미입니다.

커널 파라미터 튜닝: 최적화 가이드

병목이 확인되었다면 시스템 환경에 맞춰 커널 파라미터를 조정해야 합니다. 추측입니다: 무조건 값을 크게($65535$ 등) 설정하는 것이 항상 성능 향상을 보장하지는 않으며, 오히려 메모리 단편화나 $CPU$ 캐시 효율 저하를 유발할 수 있습니다.

somaxconn 및 tcp_max_syn_backlog 조정

대규모 트래픽을 처리하는 서버라면 다음과 같이 상향 조정을 고려하십시오.

Bash
 
# /etc/sysctl.conf
net.core.somaxconn = 8192
net.ipv4.tcp_max_syn_backlog = 8192

주의사항: 애플리케이션(Nginx, Tomcat, Go 등) 자체 설정에서도 backlog 값을 커널 설정에 맞춰 함께 높여주어야 합니다. 커널만 높이고 앱 설정을 그대로 두면 앱의 낮은 설정값이 병목 지점이 됩니다.

SYN Cookies의 양날의 검

$net.ipv4.tcp\_syncookies = 1$ 설정은 $SYN\ Backlog$가 가득 찼을 때 $ACK$ 패킷에 암호화된 정보를 담아 핸드쉐이크를 완수하는 훌륭한 방어 기제입니다. 확실하지 않음: 하지만 이 기능은 $TCP$ 옵션 중 일부(Window Scaling 등)를 무시하거나 $CPU$ 연산 부하를 가중시킬 수 있어, 정상적인 고부하 상황에서는 백로그 크기 자체를 충분히 확보하는 것이 우선입니다.

출처: 생성형 이미지, Gemini

 


왜 설정을 바꿔도 지연이 사라지지 않는가? (Step-by-step Thinking)

커널 파라미터를 수정했음에도 불구하고 ListenOverflows가 계속 발생하는 경우, 다음의 논리적 단계를 따라 점검해야 합니다.

  1. 애플리케이션 처리 지연 (Accept Loop): 애플리케이션이 accept()를 호출하는 루틴이 블로킹(Blocking)되어 있는지 확인하십시오. Worker Thread가 모두 점유되어 있으면 큐를 비우지 못합니다.
  2. SoftIRQ 처리 능력: 패킷 수신은 $CPU\ 0$번 등 특정 코어에 집중되는 경향이 있습니다. /proc/net/softnet_stat을 확인하여 sd->dropped 수치가 올라간다면, $RSS(Receive\ Side\ Scaling)$ 설정을 통해 패킷 처리를 여러 코어로 분산해야 합니다.
  3. L4/L7 로드밸런서 타임아웃: 인프라 앞단의 로드밸런서가 서버 커널의 백로그에서 대기 중인 요청을 '죽은 연결'로 판단하고 미리 끊어버릴 수 있습니다. 커널의 Keep-alive 설정과 로드밸런서의 Idle Timeout을 동기화하십시오.

0과 1 사이의 완충 지대 설계

리눅스 네트워크 튜닝은 단순히 값을 높이는 과정이 아니라, 패킷이 흐르는 전체 경로상의 병목 지점을 데이터에 근거해 하나씩 제거해 나가는 과정입니다. 백로그는 일시적인 트래픽 스파이크를 흡수하는 완충 지대이지, 애플리케이션의 처리 용량 자체를 늘려주는 마법의 도구가 아님을 명심해야 합니다.

추측입니다: 향후 2026년 이후의 커널 환경에서는 $eBPF$를 활용하여 큐의 상태를 실시간으로 감시하고, 트래픽 패턴에 따라 백로그 크기를 동적으로 가변하는 지능형 네트워크 스택이 표준이 될 것으로 전망됩니다. 기본에 충실한 튜닝과 정밀한 모니터링을 통해, 보이지 않는 곳에서 발생하는 패킷 드롭으로부터 여러분의 서비스를 보호하십시오.


참고 자료:

  • Linux Kernel Documentation - IP Sysctl: 리눅스 커널의 네트워크 파라미터 공식 명세와 기본 작동 원리를 참고하였습니다.
  • UNIX Network Programming (W. Richard Stevens 저): $TCP$ 상태 전이도와 소켓 프로그래밍 레벨에서의 백로그 처리 메커니즘을 이론적 배경으로 활용했습니다.
  • Cloudflare Tech Blog - 'The Story of One Decibel': 실제 대규모 인프라 운영 환경에서 발생하는 백로그 오버플로우 사례와 대응 전략을 본문에 반영하였습니다.
반응형