4 min read

Linux 마인크래프트 서버 구동기(최적화)

Linux 마인크래프트 서버 구동기(최적화)

친구들이 서버 좀 열어달라고 해서... 마침 심심해진김에 서버를 하나 열기로 했다. 남는 서버로.

서버 환경: Xeon E5-2620 v4, 64GB RAM, NVMe SSD
핵심 목표: 싱글 스레드 게임의 한계를 OS 레벨의 I/O 스케줄링과 메모리 관리 최적화로 속도 확보

​부족한 서버의 성능을 끌어올리기 위해 이것저것 튜닝을 진행하였는데, 실제 운영 서버에 적용된 /etc/sysctl.d/ 설정값들을 기반으로 각 파라미터가 게임 서버 성능에 어떤 영향을 미치는지 기록했다.

1. Dirty Page Writeback 튜닝 (오토세이브 렉 제거)

마인크래프트 서버 운영의 최대 적은 '월드 저장' 시 발생하는 I/O 병목이다. 리눅스는 기본적으로 데이터를 메모리(Page Cache)에 많이 모았다가 한 번에 디스크로 쓴다. 이때 I/O 대역폭이 포화되면서 순간적인 멈춤(Lag Spike)이 발생한다.

이를 방지하기 위해 "데이터를 모으지 말고, 조금씩 자주자주 기록하게" 강제한다.

# /etc/sysctl.d/99-minecraft-optimization.conf

# 5%만 변경되어도 백그라운드에서 기록 시작 (기본값보다 낮게 설정하여 I/O 분산)
vm.dirty_background_ratio = 5

# 10%가 차면 프로세스가 직접 쓰기를 강제함 (절대 10% 넘게 쌓아두지 마라)
vm.dirty_ratio = 10

# 데이터가 메모리에 머무는 시간을 단축 (10초 지나면 무조건 디스크로)
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 1000

효과: 거대한 '쓰기 작업'을 잘게 쪼개어 지속적으로 처리함으로써, 월드 저장 시 TPS가 급락하는 현상을 방지했다.

2. 메모리 및 캐시 관리 (VFS & Swappiness)

파일 시스템의 메타데이터(inode, dentry)를 캐싱하는 VFS Cache는 마인크래프트처럼 수많은 청크 파일에 접근하는 애플리케이션에 중요하다. 하지만 그렇다고 애플리케이션 메모리(Heap)를 밀어내면 안 된다.

# /etc/sysctl.d/99-minecraft.conf

# 스왑 사용 성향을 극도로 낮춤 (물리 메모리가 터지기 직전까지 스왑 금지)
# Java Heap이 스왑으로 빠지는 순간 서버는 사망이다.
vm.swappiness = 1

# VFS 캐시 반환 비율 조정 (기본값 100 -> 50)
# 파일 시스템 캐시를 좀 더 오래 쥐고 있게 하여 디스크 접근을 줄임
vm.vfs_cache_pressure = 50

3. 네트워크 프로토콜 최적화 (TCP Low Latency)

반응 속도가 생명인 게임 서버에서, TCP 연결의 유휴 상태(Idle) 처리는 매우 중요하다. 연결이 잠시 쉬었다고 해서 속도를 다시 0부터 올리는(Slow Start) 멍청한 짓을 못 하게 막아야 한다.

# [Network Tuning] - 연결을 빠릿하게 유지하라

# 유휴 상태 후에도 윈도우 사이즈(속도)를 초기화하지 않음 (즉시 최고 속도 전송)
net.ipv4.tcp_slow_start_after_idle = 0

# 좀비 커넥션 조기 정리 및 연결 상태 자주 확인
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6

# TCP Fast Open 활성화 (3-Way Handshake 과정에서 데이터 전송 허용)
# 클라이언트와 서버 양쪽 지원 시 RTT(왕복 시간) 감소 효과
net.ipv4.tcp_fastopen = 3

물론 기본적으로 BBR 혼잡 제어 알고리즘(net.ipv4.tcp_congestion_control = bbr)은 적용된 상태여야 한다.

4. CPU 및 메모리 아키텍처 대응

  • CPU Governor: performance 모드 고정. (CPU가 쉴 틈을 주지 않음)
  • THP (Transparent Huge Pages): always로 설정하되 defrag는 반드시 never. (메모리 단편화 정리로 인한 멈춤 방지)

모드도 꽤 많이 올리고, 유저가 14~15명이 돼도 별다른 끊김 없이 무난하게 즐길 수 있었다.

전문적으로 게임 서버 호스팅 하는 분들은 어떻게 진행했을지 모르지만 나름 만족할만한 결과가 나왔어서 기록해둔다.