Tối ưu hiệu suất VPS NVMe với kernel tuning

Bạn vừa SSH vào một VPS NVMe mới, chạy dd thử thấy tốc độ ghi vài trăm MB mỗi giây, vậy mà truy cập website hay chạy database vẫn cứ giật cục. Vấn đề không nằm ở phần cứng, mà ở chỗ kernel Linux đang cấu hình mặc định cho ổ cứng cơ học, không dành cho NVMe. Bài này mình sẽ chỉ bạn cách tối ưu hiệu suất VPS NVMe bằng kernel tuning: thay đổi I/O scheduler, chỉnh tham số sysctl, kiểm soát swap và bộ nhớ đệm. Toàn bộ thao tác làm trên Ubuntu 24.04 LTS với quyền root hoặc sudo, nhưng phần lớn áp dụng được cho Debian 12, AlmaLinux 9 và nhiều bản phân phối khác.
Yêu cầu trước khi bắt đầu
- Một VPS Linux chạy Ubuntu 24.04 LTS (hoặc Debian 12, AlmaLinux 9) với quyền
roothoặc user sudo. - Ổ đĩa NVMe hoặc SSD chuẩn NVMe trên hạ tầng ảo hóa KVM. Máy chủ của bạn cần có VPS Linux full root để chỉnh kernel, không phải loại hosting dùng chung.
- Hiểu cơ bản về SSH: đăng nhập, chạy lệnh với sudo, sửa file bằng nano hoặc vim.
- Kiến thức tối thiểu về way Linux quản lý bộ nhớ: swap, page cache, dirty pages. Không cần quá sâu, mình sẽ giải thích từng bước.
Vì sao VPS NVMe vẫn chạy chậm dù tốc độ đọc ghi cao?
Ổ NVMe có độ trễ đọc ghi rất thấp, nhưng kernel Linux mặc định cấu hình I/O scheduler cho ổ đĩa quay truyền thống. Với NVMe, cơ chế điều phối I/O kiểu cũ gần như không còn tác dụng, thậm chí còn thêm một lớp xử lý không cần thiết.
Thêm nữa, tham số vm.swappiness mặc định là 60, nghĩa là kernel có xu hướng đẩy các trang bộ nhớ ít dùng xuống swap khá sớm. Trên VPS NVMe, việc ghi vào swap làm mòn ổ và tăng độ trễ khi ứng dụng cần truy cập lại dữ liệu đã bị đẩy đi. Với VPS RAM thấp (2-4 GB), điều này càng rõ rệt. Đó là lý do vì sao nhiều bài viết về tối ưu Linux và NVMe cho workload I/O cao luôn nhắc đến việc chỉnh các tham số này trước tiên.
Bước 1 - Kiểm tra I/O scheduler đang dùng và loại ổ đĩa
Trước khi thay đổi gì, bạn cần biết ổ đĩa của mình tên gì và scheduler nào đang được áp dụng.
lsblk -d -o NAME,ROTA,TRAN,MODEL
cat /sys/block/vda/queue/scheduler
Lệnh lsblk hiển thị ổ đĩa, cột ROTA = 1 nghĩa là ổ quay (HDD), = 0 là SSD/NVMe. Cột TRAN cho biết loại kết nối, ví dụ nvme hoặc virtio (trên máy ảo KVM thì thường là virtio dù đĩa vật lý là NVMe). Thay vda bằng tên ổ thực tế bạn thấy.
Output mong đợi với NVMe thường là:
NAME ROTA TRAN MODEL
vda 0 virtio Virtio Block Device
[mq-deadline] none
Scheduler đang là mq-deadline hoặc none. Với NVMe, lựa chọn tối ưu là none (còn gọi là noop), vì ổ NVMe tự tối ưu hàng đợi I/O của riêng nó, kernel không cần can thiệp thêm.
Bước 2 - Đổi I/O scheduler sang none cho NVMe
Có thể đổi scheduler ngay lập tức mà không cần khởi động lại:
echo none > /sys/block/vda/queue/scheduler
cat /sys/block/vda/queue/scheduler
Output mong đợi:
none [none]
Cách này chỉ có hiệu lực đến khi khởi động lại. Để áp dụng lâu dài, dùng systemd-tmpfiles. Tạo file cấu hình:
sudo tee /etc/tmpfiles.d/nvme-scheduler.conf <<EOF
w /sys/block/vda/queue/scheduler - - - - none
EOF
Sau đó khởi động lại và kiểm tra lại lệnh cat /sys/block/vda/queue/scheduler để chắc chắn scheduler được giữ nguyên.
Với AlmaLinux hoặc Rocky Linux 9, bạn có thể dùng tuned hoặc grub command line. Cách đơn giản là chạy lệnh grubby --update-kernel=ALL --args="elevator=none" rồi khởi động lại.
Bước 3 - Tinh chỉnh sysctl để giảm áp lực swap và tăng hiệu quả bộ nhớ
Sau khi xử lý I/O scheduler, đến phần ảnh hưởng rõ rệt nhất với VPS RAM thấp: các tham số sysctl. Bạn chỉnh trong file /etc/sysctl.conf, một số bản phân phối dùng /etc/sysctl.d/99-tuning.conf.
sudo nano /etc/sysctl.conf
Thêm các dòng sau:
vm.swappiness=10
vm.vfs_cache_pressure=50
vm.dirty_ratio=10
vm.dirty_background_ratio=5
net.core.somaxconn=4096
Giải thích từng tham số:
vm.swappiness=10: kernel chỉ bắt đầu dùng swap khi bộ nhớ thực sự cạn, giảm tình trạng đẩy tiến trình ra swap sớm. Máy chủ có NVMe không sợ swap chậm, nhưng tránh ghi swap vô ích vẫn tốt hơn.vm.vfs_cache_pressure=50: giữ cache của inode và dentry trong RAM lâu hơn. Rất có lợi cho web server, nơi phải mở nhiều file nhỏ.vm.dirty_ratio=10,vm.dirty_background_ratio=5: giới hạn lượng dữ liệu chờ ghi xuống đĩa. Trên NVMe, việc ghi rất nhanh, nên giữ mức này thấp giúp dữ liệu được ghi thường xuyên hơn, giảm rủi ro mất dữ liệu khi mất điện và giảm xung đột I/O.net.core.somaxconn=4096: tăng hàng đợi kết nối TCP, cần thiết khi bạn chạy Nginx hoặc ứng dụng có nhiều kết nối đồng thời.
Sau khi sửa, áp dụng ngay:
sudo sysctl -p
Kiểm tra giá trị đã được áp dụng:
sysctl vm.swappiness vm.vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio net.core.somaxconn
Output mong đợi hiển thị đúng các giá trị vừa đặt. Nếu bạn muốn kiểm tra mức độ hiệu quả, hãy so sánh thời gian phản hồi của ứng dụng trước và sau khi chỉnh. Cụ thể hơn về cách đo tốc độ đọc ghi, xem bài kiểm tra tốc độ đọc ghi ổ NVMe trên VPS.
Bước 4 - Chỉnh tham số dirty page cho VPS theo đặc thù workload
Nếu VPS của bạn chạy database, đặc biệt là MariaDB hay PostgreSQL, mình khuyên nên đặt vm.dirty_ratio thấp hơn nữa, khoảng 5, và vm.dirty_background_ratio là 2. Lý do: database ghi giao dịch rất nhạy cảm với độ trễ, nếu kernel gom quá nhiều dữ liệu rồi ghi một lúc, thời gian chờ đợi sẽ tăng vọt.
sudo sysctl -w vm.dirty_ratio=5
sudo sysctl -w vm.dirty_background_ratio=2
Ngược lại, nếu VPS dùng làm máy chủ web tĩnh, cache CDN hoặc máy chạy ứng dụng ghi log liên tục, bạn có thể giữ mặc định của bước 3. Không có một giá trị phù hợp với mọi trường hợp, bạn phải thử và quan sát.
Lưu ý quan trọng: trên VPS ảo hóa KVM, các tham số dirty page nên đặt thấp hơn so với máy chủ vật lý, vì hypervisor cũng có một lớp cache riêng. Đừng sao chép mù quáng cấu hình từ bài viết về dedicated server.
Bài viết về cấu hình swap và tối ưu bộ nhớ cho VPS RAM thấp cho thấy rõ vì sao việc chỉnh swappiness quan trọng hơn là tăng dung lượng swap, đặc biệt với VPS dưới 2 GB RAM.
Bước 5 - Kiểm tra và xử lý lỗi thường gặp
Không phải lúc nào mọi thứ cũng chạy đúng ngay. Dưới đây là các lỗi phổ biến và cách xử lý.
I/O scheduler không đổi được, báo permission denied
Kiểm tra bạn đã dùng sudo chưa. Nếu vẫn lỗi, có thể VPS của bạn không cho phép thay đổi scheduler từ bên trong máy ảo. Trên một số hạ tầng KVM, scheduler bị khóa cứng ở một giá trị nhất định. Lúc này chỉ còn cách liên hệ nhà cung cấp hoặc chấp nhận scheduler mặc định.
cat /sys/block/vda/queue/scheduler
Nếu output chỉ hiển thị một giá trị trong ngoặc vuông và không có giá trị nào khác, nghĩa là scheduler bị khóa.
sysctl -p báo lỗi "No such file or directory"
Lệnh này xảy ra khi bạn gõ sai tên tham số hoặc kernel không hỗ trợ tham số đó. Kiểm tra lại chính tả, đặc biệt là dấu chấm giữa các phần của tên tham số. Ví dụ vm.vfs_cache_pressure đúng, vm.vfs_cachepressure sai.
VPS bị chậm hơn sau khi chỉnh swappiness xuống 10
Điều này thường xảy ra khi VPS có RAM rất ít (dưới 1 GB) và workload thường xuyên vượt quá dung lượng RAM. Khi swappiness quá thấp, kernel không đẩy trang bộ nhớ xuống swap, dẫn đến thiếu RAM trầm trọng và dùng cơ chế OOM killer. Bạn cần bật swap trước đã, xem hướng dẫn bật swap trên VPS ít RAM. Nếu máy đã có swap rồi, nâng swappiness lên 30 hoặc 40 cho cân bằng.
Câu hỏi thường gặp
Tối ưu kernel tuning có làm mất dữ liệu không?
Không. Các tham số như swappiness, dirty_ratio, vfs_cache_pressure chỉ thay đổi cách kernel quản lý bộ nhớ đệm và swap, không tác động trực tiếp đến dữ liệu trên đĩa. Tuy nhiên, nếu bạn đặt dirty_ratio quá cao và máy mất điện đột ngột, lượng dữ liệu chưa ghi xuống đĩa có thể lớn hơn. Đặt tham số thấp giúp giảm rủi ro này.
Có cần cài thêm công cụ nào để kernel tuning không?
Không. Tất cả thao tác trong bài này dùng lệnh có sẵn trong mọi bản phân phối Linux: echo, cat, sysctl, nano. Đây là điểm mạnh của việc tối ưu bằng kernel tuning, bạn không phải phụ thuộc vào phần mềm bên thứ ba.
Phân biệt tối ưu kernel và tối ưu ứng dụng, cái nào quan trọng hơn?
Cả hai đều quan trọng nhưng khác phạm vi. Kernel tuning giúp hệ điều hành sử dụng tài nguyên hiệu quả hơn ở tầng nền, còn tối ưu ứng dụng là điều chỉnh cách phần mềm hoạt động, ví dụ cấu hình buffer pool của MySQL hay worker của Nginx. Nên làm kernel tuning trước, sau đó mới tinh chỉnh ứng dụng. Bài tối ưu MariaDB trên VPS 2GB RAM là ví dụ điển hình cho bước tiếp theo sau khi chỉnh kernel.
Chỉnh kernel tuning có giúp VPS tăng tốc độ mạng không?
Không trực tiếp. Các tham số kernel về mạng (như net.core.somaxconn, net.ipv4.tcp_rmem) giúp xử lý nhiều kết nối hơn và ổn định hơn, nhưng băng thông thực tế phụ thuộc vào hạ tầng mạng của nhà cung cấp. Với VPS Linux tại Việt Nam, băng thông trong nước mặc định 100 Mbps trên port 1 Gbps, tốc độ quốc tế là pool dùng chung. Kernel tuning không thay đổi con số đó.
Bao lâu thì nên kiểm tra lại cấu hình kernel tuning?
Mỗi lần bạn nâng cấp kernel lên phiên bản mới, hãy kiểm tra lại các tham số trong /etc/sysctl.conf và scheduler. Lý do là bản kernel mới có thể đổi tên tham số hoặc thay đổi hành vi mặc định. Ngoài ra, khi bạn chuyển workload từ web server sang database, cũng nên xem lại các giá trị dirty page cho phù hợp.
Kết luận
Việc tối ưu hiệu suất VPS NVMe không khó và không tốn thêm chi phí. Chỉ cần đổi I/O scheduler sang none, giảm swappiness xuống 10, cân chỉnh dirty page, VPS của bạn đã phản hồi nhanh hơn rõ rệt so với cấu hình mặc định. Đây là những bước đầu tiên mình luôn làm trên bất kỳ VPS NVMe nào trước khi cài đặt ứng dụng. Nếu bạn đang chạy VPS trên hạ tầng có ổ đĩa NVMe thật và muốn kiểm tra hiệu quả, hãy thử ngay hôm nay, đo thời gian phản hồi trước và sau khi chỉnh, bạn sẽ thấy sự khác biệt.
Bài viết liên quan
- Tối ưu Linux và NVMe cho workload I/O cao trên VPS
- Cách kiểm tra tốc độ đọc ghi ổ NVMe trên VPS
- Cấu hình swap và tối ưu bộ nhớ cho VPS RAM thấp
- Benchmark hiệu năng VPS với FIO, sysbench và iperf3


