Tại sao server chạy ổn định nhưng vẫn chậm?
Mình từng gặp tình huống này: server CentOS mới setup, RAM còn dư, CPU chưa đến 30%, nhưng response time của ứng dụng vẫn cao hơn kỳ vọng. Không phải do code, không phải do network. Sau khi debug một hồi mới biết kernel đang dùng power-saving mode, I/O scheduler không phù hợp với workload, và hàng chục tham số nhỏ lẻ khác mà kernel không tự điều chỉnh theo loại công việc đang chạy.
Đó là lúc mình bắt đầu tìm hiểu về tuned-adm — công cụ có sẵn trên RHEL/CentOS để tự động điều chỉnh hệ thống theo “profile” phù hợp với từng loại workload.
Ba cách tối ưu hiệu suất Linux và ưu nhược của mỗi cách
Có 3 hướng tiếp cận khi tối ưu hiệu suất Linux. Mình nói qua cả ba để bạn thấy tại sao tuned-adm lại là lựa chọn thực tế nhất:
Cách 1: Tuning thủ công qua sysctl và kernel parameters
Bạn tự chỉnh /etc/sysctl.conf, CPU governor, I/O scheduler… Ưu điểm: kiểm soát tuyệt đối từng tham số. Nhược điểm: đòi hỏi hiểu sâu kernel internals, mất nhiều giờ research, và một sai lầm nhỏ có thể khiến cả server mất ổn định.
Cách 2: Script tự viết tích lũy theo năm tháng
Nhiều sysadmin có bộ script “magic” để apply khi setup server mới. Nghe hay đó, nhưng thực tế: script thường không được test kỹ, không cập nhật theo kernel mới, và không ai nhớ tại sao lại có dòng đó. Khi gặp vấn đề, debug gần như không thể.
Cách 3: Dùng tuned-adm với profile có sẵn
Red Hat khuyến nghị cách này cho production — và có lý do cụ thể. Profile được đội kỹ sư Red Hat test kỹ, có tài liệu rõ ràng, và cập nhật theo từng major release của RHEL/CentOS. Không cần nhớ tham số, không lo sai — chỉ cần chọn đúng profile cho workload.
Nếu không có thời gian đào sâu kernel tuning, tuned-adm là điểm bắt đầu hợp lý nhất. Cần fine-tune thêm? Bạn hoàn toàn có thể tạo custom profile kế thừa từ built-in profile — mình sẽ hướng dẫn ở phần sau.
Cài đặt và kiểm tra tuned-adm
Trên CentOS Stream 9, tuned thường đã có sẵn. Nếu chưa:
sudo dnf install tuned -y
sudo systemctl enable --now tuned
Kiểm tra profile hiện tại và xem danh sách profile có sẵn:
# Xem profile đang active
tuned-adm active
# Liệt kê tất cả profile
tuned-adm list
Output thường sẽ là balanced hoặc virtual-guest nếu đang chạy trong VM — cả hai đều không phải optimal cho production server.
Phân tích từng profile và khi nào nên dùng
throughput-performance — Cho Database Server
Phù hợp nhất cho: MySQL, PostgreSQL, MariaDB, batch processing, data pipeline.
Với database server, đây là profile cần thử đầu tiên. Nó tắt power saving hoàn toàn, đặt CPU governor thành performance và tinh chỉnh I/O scheduler. CPU không bao giờ throttle xuống, disk read/write ổn định hơn hẳn. Trade-off duy nhất là tiêu thụ điện nhiều hơn — không phải vấn đề với server vật lý trong datacenter.
sudo tuned-adm profile throughput-performance
# Kiểm tra CPU governor đã chuyển sang performance chưa
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# Output: performance
# Kiểm tra I/O scheduler
cat /sys/block/sda/queue/scheduler
# Thường chuyển sang [mq-deadline] hoặc [none] tùy disk type
network-throughput — Cho Web Server
Phù hợp nhất cho: Nginx, Apache, CDN node, reverse proxy xử lý nhiều connection đồng thời.
Tăng network buffer size (receive/send buffer), điều chỉnh TCP stack để xử lý nhiều connection hơn. Đây là profile mình thường apply đầu tiên cho mọi web server.
sudo tuned-adm profile network-throughput
# Verify network buffer đã tăng
sysctl net.core.rmem_max
sysctl net.core.wmem_max
# Giá trị tăng từ ~212992 lên ~134217728 (khoảng 600x)
network-latency — Cho API Server và Load Balancer
Phù hợp nhất cho: API gateway, load balancer, microservice cần response time thấp per request.
Ngược với network-throughput — profile này giảm TCP buffer để ưu tiên latency thay vì throughput. Phù hợp khi bạn có nhiều request nhỏ, tần suất cao hơn là ít request nhưng payload lớn.
sudo tuned-adm profile network-latency
latency-performance — Cho Real-time Application
Phù hợp nhất cho: Trading system, game server, ứng dụng yêu cầu response time cực thấp và ổn định.
Tắt hoàn toàn CPU C-states (CPU idle states), đảm bảo CPU không bao giờ “ngủ” dù không có task. Kết quả: response time cực kỳ ổn định, không có latency spike do CPU thức dậy từ sleep state. Nhược điểm lớn: CPU luôn tiêu thụ điện tối đa dù idle.
sudo tuned-adm profile latency-performance
hpc-compute — Cho HPC và Machine Learning
Phù hợp nhất cho: Machine learning training, video encoding, simulation, scientific computing.
Profile “ép xung” nhất — CPU luôn ở performance mode, NUMA topology được tối ưu, swap giảm xuống mức tối thiểu để tránh memory thrashing. Nếu bạn chạy workload tính toán nặng, đây là profile thử đầu tiên.
sudo tuned-adm profile hpc-compute
# Verify swap đã giảm (vm.swappiness)
sysctl vm.swappiness
# Output: 10 (thay vì 60 mặc định)
Chọn profile phù hợp theo use case
Bảng tham khảo nhanh:
- Nginx/Apache web server →
network-throughput - MySQL/PostgreSQL database →
throughput-performance - API gateway/load balancer →
network-latency - Real-time / low-latency app →
latency-performance - ML training / HPC →
hpc-compute - VM trên cloud →
virtual-guest(làm base, rồi override)
Tạo custom profile khi built-in không đủ
Mình từng có case: server chạy database và web server cùng lúc (setup monolithic của startup nhỏ). Không profile nào fit hoàn toàn. Giải pháp: tạo profile tùy chỉnh kế thừa từ throughput-performance rồi override thêm một số tham số network.
# Tạo thư mục cho profile mới
sudo mkdir /etc/tuned/my-webdb
# Tạo file config
sudo nano /etc/tuned/my-webdb/tuned.conf
Nội dung file tuned.conf:
[main]
summary=Custom profile for web+database combo server
include=throughput-performance
[sysctl]
# Override: tăng network buffer như network-throughput
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_rmem=4096 87380 134217728
net.ipv4.tcp_wmem=4096 65536 134217728
# Giảm swappiness cho database
vm.swappiness=10
# Áp dụng custom profile
sudo tuned-adm profile my-webdb
# Xác nhận
tuned-adm active
Benchmark để thấy sự khác biệt
Đổi profile xong, benchmark trước và sau để có số liệu cụ thể:
# Web server: dùng wrk (cài nếu chưa có)
sudo dnf install wrk -y
wrk -t4 -c100 -d30s http://localhost/
# Disk I/O: dùng fio
sudo dnf install fio -y
fio --name=randread --ioengine=libaio --iodepth=16 \
--rw=randread --bs=4k --size=1G --numjobs=4 \
--runtime=30 --group_reporting
Theo số liệu mình đo được: database server thường giảm query time 15–25% sau khi chuyển sang throughput-performance, rõ nhất với workload random I/O. Web server test bằng wrk với network-throughput thường tăng throughput khoảng 20%.
Những điểm cần nhớ khi dùng thực tế
Công ty mình đã migrate vài server từ CentOS 7 sang AlmaLinux. Mỗi lần, set tuned profile là thứ làm trong ngày setup đầu tiên — không để sau. Để sau “khi rảnh” thì không bao giờ rảnh.
- Profile persistent qua reboot chỉ khi service
tunedđang enable. Luôn chạy:systemctl enable tuned - Thay profile không cần reboot — tuned apply thay đổi ngay lập tức
- Profile mặc định sau cài đặt là
balanced— không phải optimal cho production - Trên VM cloud (AWS, GCP, Azure), base profile nên là
virtual-guesttrước khi thêm override
# Kiểm tra nhanh tuned có chạy không
systemctl status tuned
# Xem log nếu có vấn đề
journalctl -u tuned -n 50
# Xem chi tiết những gì một profile thay đổi
tuned-adm profile-info throughput-performance
tuned-adm không phải giải pháp cho mọi vấn đề performance, nhưng đây là bước đầu tiên nên làm với mọi server production. Chỉ mất 5 phút để setup và benchmark — đổi lại là hệ thống chạy đúng với workload thực tế của nó, không phải cấu hình mặc định sinh ra để dùng cho laptop văn phòng.

