ปรับ Linux Kernel Parameters สำหรับ VPS ด้วย sysctl

ปรับ Linux Kernel Parameters สำหรับ VPS ด้วย sysctl

มิถุนายน 2026 · อ่าน 8 นาที

Linux kernel parameters ที่ default มักออกแบบมาสำหรับ desktop ไม่ใช่ server VPS ที่รับ traffic สูงจำเป็นต้อง tune ค่าเหล่านี้เพื่อเพิ่ม network throughput, รองรับ connection พร้อมกันมากขึ้น และลด time_wait ที่ทำให้ port หมด บทความนี้รวม parameters ที่ใช้บ่อยที่สุดพร้อมคำอธิบายว่าปรับค่าใดเพราะอะไร

⚠️ Backup ก่อนปรับ: บางค่าถ้าตั้งผิดทำให้ network ไม่ทำงาน ควร backup ค่าเดิมและทดสอบ apply ทีละค่าแทนการ apply ทุกอย่างพร้อมกัน

ดูค่า 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
Tip: ใช้ 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"
Tip: ใช้ 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 ก่อนและหลังปรับเสมอ