ปรับ Linux Kernel Parameters สำหรับ VPS ด้วย sysctl
Linux kernel parameters ที่ default มักออกแบบมาสำหรับ desktop ไม่ใช่ server VPS ที่รับ traffic สูงจำเป็นต้อง tune ค่าเหล่านี้เพื่อเพิ่ม network throughput, รองรับ connection พร้อมกันมากขึ้น และลด time_wait ที่ทำให้ port หมด บทความนี้รวม parameters ที่ใช้บ่อยที่สุดพร้อมคำอธิบายว่าปรับค่าใดเพราะอะไร
ดูค่า Kernel Parameters ปัจจุบัน
# ดูค่าทั้งหมด
sysctl -a
# ดูค่าเฉพาะหมวด network
sysctl -a | grep net.core
# ดูค่าของ parameter เดียว
sysctl net.ipv4.tcp_max_syn_backlog
Network Optimization (สำหรับ Web Server)
sudo nano /etc/sysctl.d/99-vps-tuning.conf
# TCP Buffer Size
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# Connection Queue
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
# TCP TIME_WAIT (ลด port exhaustion)
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240 65000
# TCP Keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# Disable IPv6 (ถ้าไม่ใช้)
net.ipv6.conf.all.disable_ipv6 = 1
File Descriptor Limits
# เพิ่ม file descriptor system-wide
echo "fs.file-max = 2097152" | sudo tee -a /etc/sysctl.d/99-vps-tuning.conf
# เพิ่ม ulimit สำหรับ process
sudo nano /etc/security/limits.conf
# เพิ่ม:
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
Memory Management
# ลด swappiness (เมื่อมี SSD ไม่ควร swap บ่อย)
vm.swappiness = 10
# Dirty page ratio (buffer write)
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# Disable OOM killer ที่รุนแรงเกินไป
vm.overcommit_memory = 1
Apply Changes
# Apply ทันทีโดยไม่ต้อง reboot
sudo sysctl -p /etc/sysctl.d/99-vps-tuning.conf
# Apply ทุก file ใน sysctl.d
sudo sysctl --system
# ตรวจว่า apply แล้ว
sysctl net.core.somaxconn
sysctl -w net.core.somaxconn=65535 เพื่อ test ค่าทันทีโดยไม่ต้อง reboot ถ้าทดสอบแล้วดี ค่อย append ไปใน .conf เพื่อให้ persistent
ตรวจสอบว่า Kernel Tuning ทำงานถูกต้อง
# ตรวจค่า apply แล้ว
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_fin_timeout
# ตรวจ file descriptor limit
ulimit -n
cat /proc/sys/fs/file-max
# ดู network stat
ss -s
netstat -s | grep -E "overflow|fail|drop"
ss -s ดู TCP connection summary จำนวน ESTABLISHED, TIME-WAIT, CLOSE-WAIT ถ้า TIME-WAIT สูงมากแสดงว่าต้องปรับ tcp_fin_timeout และ tcp_tw_reuse
แก้ปัญหาที่พบบ่อย
Error: "NMAP cannot set parameters" หลัง sysctl -p
บาง VPS provider ไม่ให้แก้ kernel parameters ผ่าน container (OpenVZ) ตรวจ virtualization type:
systemd-detect-virt
# ถ้า "openvz" บาง parameter จะ fail แต่ไม่กระทบ parameter อื่น
Network ไม่ทำงานหลังปรับ sysctl
Rollback ค่าที่เพิ่งแก้ทันที:
# Rollback parameter เดี่ยว
sudo sysctl -w net.ipv4.tcp_tw_reuse=0
# หรือ reboot เพื่อ reset ทุกอย่าง (ค่าใน .conf จะ apply ใหม่)
# ถ้า .conf ผิด ให้แก้ .conf ก่อน reboot
ulimit ไม่ขึ้นแม้แก้ limits.conf แล้ว
ต้อง logout/login ใหม่ หรือ PAM module ต้องตั้งเพิ่ม:
# ตรวจ pam session
grep pam_limits /etc/pam.d/common-session
# ต้องมีบรรทัด:
session required pam_limits.so
Service ยัง "Too many open files" หลังเพิ่ม ulimit
Service ที่รันด้วย systemd มี LimitNOFILE ของตัวเอง:
sudo nano /etc/systemd/system/nginx.service.d/override.conf
[Service]
LimitNOFILE=1048576
sudo systemctl daemon-reload && sudo systemctl restart nginx
คำถามที่พบบ่อย
sysctl parameters reset หลัง reboot ไหม?
ค่าที่ตั้งด้วย sysctl -w โดยตรงจะ reset หลัง reboot ต้องใส่ใน /etc/sysctl.d/ ไฟล์จะ apply อัตโนมัติทุกครั้งที่ boot
BBR TCP Congestion Control เกี่ยวข้องกับ sysctl อย่างไร?
BBR คือ TCP congestion control algorithm ที่ Google พัฒนา เปิดใช้ผ่าน sysctl เช่นกัน: net.core.default_qdisc=fq และ net.ipv4.tcp_congestion_control=bbr ดูบทความ TCP BBR สำหรับรายละเอียด
ค่า sysctl ที่ดีที่สุดสำหรับทุก VPS คืออะไร?
ไม่มีค่า universal ที่ดีที่สุด ขึ้นอยู่กับ workload ค่าสำหรับ web server ที่รับ connection สั้นๆ จำนวนมากต่างกับ database server ที่มี connection ยาวน้อยตัว ควร benchmark ก่อนและหลังปรับเสมอ