게임 서버는 일반 웹 서비스와 다릅니다. 처리량보다 지연(latency)지터(jitter) 가 사용자 체감에 직결되며, 1프레임(16.7ms)을 늘리는 순간 캐릭터가 미끄러지듯 보이기 시작합니다. 이 글에서는 일본 도쿄 IDC에 위치한 게임 서버에서 적용할 수 있는 네트워크 튜닝 포인트를 정리합니다.


게임 서버에서 중요한 지표

지표 의미 목표
지연(Latency) RTT의 절반, 일방향 시간 한국→일본 ≤ 30ms
지터(Jitter) RTT의 변동폭 ≤ 5ms
패킷 손실 사라진 패킷 비율 ≤ 0.1%
처리량(Throughput) 초당 패킷 수 게임에 따라

웹은 1초가 빠르고 늦고에 민감하지만, 게임은 5ms와 10ms의 차이가 곧 승패에 영향을 줍니다.


1단계 — 데이터센터 위치 선택

같은 일본이라도 도쿄/오사카/후쿠오카에 따라 한국 사용자와의 RTT가 다릅니다.

위치 한국(서울)→일본 RTT 비고
도쿄 (KIX-NRT 우회 경로) 25~35ms 가장 보편적, 가성비
오사카 30~40ms 도쿄보다 약간 길지만 안정적
후쿠오카 20~25ms 한국과 가장 가까움, 한국 게이머 대상 게임에 유리

다만 후쿠오카는 IDC 선택지가 좁아 가용성이 떨어질 수 있습니다. 글로벌 사용자도 함께 받는다면 도쿄가 균형이 좋습니다.


2단계 — NIC 큐와 IRQ 분산

게임 서버처럼 패킷이 많은 워크로드는 단일 CPU에 인터럽트가 몰리면 그 코어만 100%가 되고 다른 코어는 놀게 됩니다. RSS(Receive Side Scaling)로 큐를 늘리고 IRQ를 분산해야 합니다.

# NIC가 지원하는 큐 개수 확인
ethtool -l eth0

# 큐 개수를 코어 수 만큼 설정
sudo ethtool -L eth0 combined 8

# IRQ를 각 코어에 분산
sudo systemctl enable --now irqbalance

수동으로 IRQ를 고정하고 싶다면 set_irq_affinity.sh 스크립트를 사용하거나 /proc/irq/<번호>/smp_affinity를 직접 편집합니다.


3단계 — TCP/UDP 버퍼 튜닝

게임이 UDP를 쓰더라도 백엔드 통신(DB, 인증)은 대부분 TCP입니다. 양쪽 모두 튜닝합니다.

# /etc/sysctl.d/99-game.conf
# 수신/송신 버퍼 (최소 / 기본 / 최대)
net.core.rmem_max = 26214400
net.core.wmem_max = 26214400
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# UDP 수신 버퍼 (대형 게임 패킷에 중요)
net.core.netdev_max_backlog = 5000

# TIME_WAIT 빠르게 재사용
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

# 동시 연결 백로그
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096

# 임시 포트 범위 확장 (클라이언트 연결이 많을 때)
net.ipv4.ip_local_port_range = 10240 65535
sudo sysctl --system

주의: tcp_tw_recycle은 더 이상 권장되지 않으며 NAT 환경에서 문제를 일으킵니다. tcp_tw_reuse만 사용하세요.


4단계 — 혼잡 제어 알고리즘

기본 알고리즘은 cubic이지만, 한국-일본처럼 RTT가 짧은 회선에서는 BBR이 더 좋은 결과를 내는 경우가 많습니다.

# 현재 알고리즘 확인
sysctl net.ipv4.tcp_congestion_control

# 사용 가능한 알고리즘 확인
sysctl net.ipv4.tcp_available_congestion_control

# BBR 활성화
echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

BBR은 패킷 손실이 아니라 대역폭과 RTT 측정으로 혼잡을 판단해, 짧은 RTT 환경에서 cubic보다 응답성이 좋습니다.


5단계 — UDP 게임 서버 최적화

대부분의 실시간 게임(FPS, MOBA 등)은 UDP를 사용합니다. UDP 특유의 튜닝 포인트가 있습니다.

# UDP 메모리 풀 (16MB)
sysctl -w net.ipv4.udp_mem="65536 131072 262144"

# UDP 수신 큐 깊이
sysctl -w net.core.netdev_max_backlog=10000

게임 서버 프로세스의 소켓 버퍼 크기도 코드에서 직접 늘려야 합니다.

int size = 4 * 1024 * 1024;  // 4MB
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));

6단계 — MTU와 패킷 단편화

기본 MTU는 1500입니다. PPPoE 회선이 섞이면 1492로 떨어지며, 단편화가 일어나면 한 패킷의 손실이 두 배 영향을 줍니다.

# MTU 확인
ip link show eth0

# 경로상 단편화가 일어나는지 테스트
ping -c 3 -M do -s 1472 example.com   # 1472 + 28 = 1500

Frag needed가 보이면 경로상 MTU가 1500보다 작은 구간이 있습니다. 게임 서버에서는 페이로드를 1400 이하로 유지하는 것이 안전합니다.


7단계 — DDoS 보호

게임 서버는 일반 사이트보다 DDoS 표적이 되기 쉽습니다. 특히 UDP 서비스는 reflection 공격 발생 시 응답을 못 보내게 됩니다.

# UDP 응답 속도 제한 (서비스 포트 외)
iptables -A INPUT -p udp -m limit --limit 1000/s --limit-burst 2000 -j ACCEPT
iptables -A INPUT -p udp -j DROP

# SYN Flood 방어
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_synack_retries=2

L3/L4 단의 대형 공격은 호스팅사 네트워크에서 막아야 합니다. TCP-80.NET의 전용서버는 모두 L3/L4 DDoS 방어가 무료 기본 포함이며, 전용 DDoS 보호 서비스로 L7까지 강화할 수 있습니다.


8단계 — 모니터링

지연/손실은 자주 측정해야 의미가 있습니다.

# 실시간 RTT/손실
mtr --report --report-cycles 100 client-ip

# 인터페이스 패킷 통계
ip -s link show eth0

# 드롭 발생 여부
netstat -s | grep -i drop

# softirq 부하 (특정 코어가 100%인지)
mpstat -P ALL 1

지속적인 모니터링은 모니터링 가이드를 참고하세요. Netdata로 NIC 큐별 RX/TX, softirq, CPU 분포까지 한 화면에서 볼 수 있습니다.


마무리

게임 서버 튜닝은 “어느 한 가지 설정으로 모든 게 빨라지는” 마법이 없습니다. 위치 선정 → 인터럽트 분산 → 버퍼/혼잡제어 → DDoS 보호 의 단계를 차례로 점검하면, 같은 하드웨어에서 1~3ms를 줄일 수 있습니다.

TCP-80.NET은 도쿄 IDC 직영으로 한국 회선까지의 경로가 짧고 안정적입니다. 게임 서버용 전용서버 구성에 대한 문의는 @tcp80net으로 부탁드립니다.