Linux sysctl 커널 파라미터 튜닝 설정

웹 서버, 데이터베이스 서버 등 프로덕션 환경을 위한 Linux 커널 파라미터 최적화 설정 템플릿입니다. 네트워크 성능, 보안 강화, 메모리 관리, 파일 디스크립터 제한 등을 포함합니다.

Gist
# /etc/sysctl.d/99-production-tuning.conf
# 프로덕션 서버 커널 파라미터 최적화 설정
#
# 적용 방법:
#   sudo sysctl -p /etc/sysctl.d/99-production-tuning.conf   # 즉시 적용
#   sudo sysctl --system                                       # 모든 설정 파일 재로드
#
# 현재 값 확인: sysctl <파라미터명>
# 전체 값 확인: sysctl -a
# 특정 패턴 검색: sysctl -a | grep net.core


# ══════════════════════════════════════════════════
# 네트워크 성능 최적화
# ══════════════════════════════════════════════════

# ──────────────────────────────────────────────────
# 소켓 연결 큐 및 백로그
# ──────────────────────────────────────────────────

# listen() 소켓의 최대 연결 대기 큐 크기
# nginx/apache의 backlog 옵션과 함께 설정 (기본값: 128)
net.core.somaxconn = 65535

# SYN 백로그 큐 크기 (TCP handshake 중 연결 저장, DDoS 방어에도 효과)
net.ipv4.tcp_max_syn_backlog = 65535

# 네트워크 인터페이스 수신 큐 최대 패킷 수 (트래픽 폭주 시 패킷 손실 방지)
net.core.netdev_max_backlog = 262144

# ──────────────────────────────────────────────────
# TCP 소켓 버퍼 크기 (처리량 최적화)
# ──────────────────────────────────────────────────

# TCP 소켓 수신 버퍼: 최솟값, 기본값, 최댓값 (bytes)
# 기본값 87380 → 고대역폭 환경에서 4MB~16MB 권장
net.core.rmem_max = 16777216
net.core.rmem_default = 262144
net.ipv4.tcp_rmem = 4096 87380 16777216

# TCP 소켓 송신 버퍼: 최솟값, 기본값, 최댓값 (bytes)
net.core.wmem_max = 16777216
net.core.wmem_default = 262144
net.ipv4.tcp_wmem = 4096 65536 16777216

# UDP 소켓 버퍼
net.core.optmem_max = 65536

# ──────────────────────────────────────────────────
# TCP 연결 유지 (Keepalive)
# ──────────────────────────────────────────────────

# 마지막 데이터 전송 후 keepalive 프로브 시작까지 대기 시간 (초)
# 기본값 7200초(2시간) → 60초로 단축하여 죽은 연결 빠르게 감지
net.ipv4.tcp_keepalive_time = 60

# keepalive 프로브 전송 간격 (초)
net.ipv4.tcp_keepalive_intvl = 10

# keepalive 프로브 최대 횟수 (이 횟수 초과 시 연결 종료)
net.ipv4.tcp_keepalive_probes = 6

# ──────────────────────────────────────────────────
# TIME_WAIT 소켓 최적화
# ──────────────────────────────────────────────────

# 동시에 허용하는 최대 TIME_WAIT 소켓 수 (초과 시 즉시 삭제)
net.ipv4.tcp_max_tw_buckets = 1440000

# TIME_WAIT 소켓 재사용 허용 (동일 포트 빠른 재사용)
net.ipv4.tcp_tw_reuse = 1

# FIN_WAIT2 상태 타임아웃 단축 (기본 60초)
net.ipv4.tcp_fin_timeout = 15

# ──────────────────────────────────────────────────
# TCP 혼잡 제어 및 성능
# ──────────────────────────────────────────────────

# TCP 혼잡 제어 알고리즘 (bbr: Google BBR, cubic: 기본값)
# BBR은 고속/고지연 네트워크에서 throughput 대폭 향상
# 확인: sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_congestion_control = bbr

# BBR 사용 시 fq(Fair Queue) 스케줄러 필요 (패킷 레이트 제한)
# 적용: tc qdisc add dev eth0 root fq
net.core.default_qdisc = fq

# TCP Fast Open: 3-way handshake 없이 첫 패킷에 데이터 전송 (지연 감소)
# 3 = 클라이언트+서버 모두 활성화
net.ipv4.tcp_fastopen = 3

# Nagle 알고리즘 비활성화는 소켓 옵션(TCP_NODELAY)으로 처리 (여기서 불가)

# 로컬 포트 범위 확장 (더 많은 아웃바운드 연결 허용)
net.ipv4.ip_local_port_range = 1024 65535


# ══════════════════════════════════════════════════
# 네트워크 보안 강화
# ══════════════════════════════════════════════════

# SYN Flood 공격 방어: SYN cookies 활성화
# SYN 백로그 오버플로우 시 쿠키 방식으로 연결 처리
net.ipv4.tcp_syncookies = 1

# IP 소스 라우팅 비활성화 (패킷 경로 위조 방지)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# Reverse Path Filtering: 소스 IP가 올바른 인터페이스에서 왔는지 검증 (IP 스푸핑 방지)
# 1=엄격 모드, 2=완화 모드 (멀티홈 서버는 2 권장)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# ICMP 리다이렉트 수신/전송 비활성화 (라우팅 테이블 변조 공격 방지)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# ICMP 브로드캐스트 핑 무시 (Smurf 공격 방지)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 잘못된 ICMP 오류 메시지 무시
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 패킷 포워딩 비활성화 (라우터가 아닌 경우. 라우터/컨테이너 호스트는 1)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# Martian 패킷 로깅 (비정상 출처 패킷 기록, 디버깅 용도)
# 트래픽이 많은 서버에서는 로그 폭주 가능 — 주의
# net.ipv4.conf.all.log_martians = 1


# ══════════════════════════════════════════════════
# 메모리 관리
# ══════════════════════════════════════════════════

# 스왑 사용 적극성 (0-100, 낮을수록 RAM 우선 사용)
# 데이터베이스/고성능 서버: 10 이하 권장
# 기본값: 60
vm.swappiness = 10

# 더티 페이지(쓰기 대기 중인 메모리) 비율 제한
# 전체 메모리 중 더티 페이지 허용 비율 (기본값: 20%)
vm.dirty_ratio = 15

# 백그라운드 동기화 시작 비율 (기본값: 10%)
vm.dirty_background_ratio = 5

# 메모리 오버커밋 정책
# 0=휴리스틱(기본), 1=항상 허용, 2=엄격 제한
vm.overcommit_memory = 1

# 대용량 페이지(HugePage) 사용 — 데이터베이스 서버에서 TLB 미스 감소
# PostgreSQL, Redis, Java 힙에 효과적
# 페이지 수 = (DB 공유 메모리 GB × 1024) / 2
# vm.nr_hugepages = 512


# ══════════════════════════════════════════════════
# 파일 디스크립터 및 프로세스 한도
# ══════════════════════════════════════════════════

# 시스템 전체 최대 열린 파일 수 (inode 기반)
# 확인: cat /proc/sys/fs/file-max
fs.file-max = 2097152

# 파일시스템 감시 인스턴스 최대 수 (inotify 사용 서비스: VS Code, webpack 등)
fs.inotify.max_user_instances = 8192

# inotify 감시 가능한 최대 파일 수 (기본값: 8192, Node.js 프로젝트에서 부족)
fs.inotify.max_user_watches = 524288

# 비동기 I/O 최대 수 (aio: io_uring 사용 애플리케이션)
fs.aio-max-nr = 1048576

# 코어 덤프 패턴 (크래시 시 덤프 파일 위치 및 이름)
# kernel.core_pattern = /var/crash/core.%e.%p.%t


# ══════════════════════════════════════════════════
# 커널 보안 (추가 강화)
# ══════════════════════════════════════════════════

# dmesg 접근 제한 (일반 사용자의 커널 메시지 열람 차단)
kernel.dmesg_restrict = 1

# /proc/PID 접근 제한 (자신의 프로세스만 접근 가능)
kernel.hidepid = 2

# 주소 공간 배치 무작위화 (ASLR): 2=완전 랜덤화 (기본값)
kernel.randomize_va_space = 2

# ptrace 범위 제한 (디버거 attach 제한)
# 0=무제한, 1=부모 프로세스만, 2=CAP_SYS_PTRACE 필요, 3=완전 비활성화
kernel.yama.ptrace_scope = 1