Tại sao các thiết lập mặc định của Linux là chưa đủ cho lưu trữ hiệu suất cao
Ngay khi mới cài đặt, Linux hoạt động “đủ nhanh”. Nhưng sau khi quản lý 14 node VPS chạy hỗn hợp Ubuntu 22.04 và Debian 12, tôi nhận ra “đủ nhanh” sẽ thất bại khi tải nặng. Các cấu hình mặc định ưu tiên tính tương thích trên hàng ngàn loại phần cứng khác nhau. Chúng không ưu tiên cho chiếc Samsung 990 Pro hay WD Black SN850X cụ thể của bạn. Các nhân (kernel) hiện đại nhận diện ổ lưu trữ flash tốt hơn mười năm trước, nhưng chúng vẫn bỏ lỡ nhiều hiệu suất tiềm năng vì chọn giải pháp an toàn.
Nếu bạn đang chạy cơ sở dữ liệu PostgreSQL hoặc một máy chủ web bận rộn xử lý 5.000 yêu cầu mỗi giây, các nút thắt cổ chai về lưu trữ cuối cùng sẽ làm nghẽn CPU. Chúng ta cần tối ưu hóa cách hệ điều hành giao tiếp với phần cứng vật lý. Thiết lập của tôi giúp giảm tình trạng “metadata thrashing” và đảm bảo ổ đĩa không bị hao mòn các cell NAND quá sớm. Hướng dẫn này bao gồm các tinh chỉnh cụ thể, đã qua thực chiến mà tôi sử dụng để giữ cho hạ tầng luôn phản hồi nhanh nhạy trong khi bảo vệ khoản đầu tư phần cứng của mình.
So sánh các cách tiếp cận: Mặc định vs. Tinh chỉnh chuyên sâu
Hầu hết các quản trị viên rơi vào một trong hai nhóm: những người tin tưởng vào trình cài đặt và những người đào sâu vào các tham số nhân hệ điều hành.
Cách tiếp cận “Thiết lập và Quên đi”
Đây là trải nghiệm tiêu chuẩn với Ubuntu hoặc AlmaLinux. Hệ điều hành nhận diện ổ đĩa không quay và kích hoạt một tiến trình TRIM hàng tuần. Nó thường mặc định sử dụng bộ lập lịch mq-deadline. Đối với máy tính cá nhân thông thường, điều này ổn. Nhưng đối với môi trường DevOps, nó quá hời hợt. Nó thiếu sự chi tiết để xử lý các mô hình I/O có độ đồng thời cao, nơi mỗi micro giây đều có giá trị.
Cách tiếp cận “Tinh chỉnh chuyên sâu”
Tôi ưu tiên việc khớp logic phần mềm với vật lý của chip nhớ. Chúng ta sẽ kiểm tra thủ công xem ổ đĩa là SATA hay NVMe, sau đó điều chỉnh /etc/fstab để loại bỏ các chu kỳ ghi không cần thiết. Chúng ta cũng căn chỉnh bộ lập lịch I/O (I/O scheduler) phù hợp với bộ điều khiển nội bộ của phần cứng. Ổ NVMe tự xử lý việc xếp hàng nội bộ khổng lồ của chúng. Việc thêm một bộ lập lịch ở cấp độ Linux giống như lắp bộ giới hạn tốc độ cho một chiếc Ferrari—nó chỉ làm tăng tải CPU vô ích.
Ưu và nhược điểm của việc tối ưu hóa thủ công
Việc tinh chỉnh các tham số cấp hệ thống luôn đi kèm với sự đánh đổi. Bạn phải cân nhắc giữa mức tăng tốc độ và chi phí bảo trì.
- Lợi ích:
- Tuổi thọ tốt hơn: Giảm “khuếch đại ghi” (write amplification) thông qua các tùy chọn mount thông minh sẽ trực tiếp kéo dài chỉ số TBW (Tổng số byte đã ghi) của ổ đĩa.
- Độ trễ thấp hơn: Trong các thử nghiệm của tôi, việc sử dụng bộ lập lịch
nonetrên NVMe đã giảm độ trễ I/O trung bình từ 0.5ms xuống còn 0.32ms khi đang tải. - Băng thông ổn định: Quản lý TRIM chủ động giúp ngăn chặn tình trạng tụt dốc hiệu suất khi ổ đĩa đạt tới 80% dung lượng.
- Rủi ro:
- Sai lệch cấu hình: Bạn sẽ có thêm các quy tắc udev và cờ fstab tùy chỉnh cần theo dõi trong các script Ansible hoặc Terraform của mình.
- Mất dữ liệu trong trường hợp hy hữu: Các tùy chọn cực đoan như
data=writebackcó thể gây mất dữ liệu khi mất điện đột ngột. Tôi thường tránh các tùy chọn này và ưu tiên các cờ an toàn nhưng hiệu quả cao nhưnoatime.
Cấu hình cơ bản khuyến nghị của tôi để tối ưu hiệu suất
Đây chính xác là cấu hình tôi triển khai cho 90% máy chủ của mình. Nó đạt được sự cân bằng chuyên nghiệp giữa tốc độ thô và tính toàn vẹn của dữ liệu.
- Chiến lược TRIM: Hãy dùng
fstrim.timer. Tránh dùng cờ mountdiscard. TRIM liên tục có thể gây ra những hiện tượng khựng nhỏ khó chịu vì hệ điều hành phải chờ ổ đĩa xác nhận giải phóng block cho mỗi lần xóa. - Cờ Mount: Sử dụng
noatimevàlazytime. Theo mặc định, Linux ghi vào đĩa mỗi khi bạn *đọc* một file chỉ để cập nhật thời gian truy cập. Điều đó thật điên rồ đối với một ổ SSD.noatimeloại bỏ hành vi này, giúp giảm ngay lập tức 10-15% các lượt ghi metadata. - Bộ lập lịch I/O: Sử dụng
nonecho NVMe vàkyber(do Facebook phát triển) hoặcmq-deadlinecho các ổ SSD SATA. - Swappiness: Giảm
vm.swappinessxuống còn10. Điều này buộc Linux sử dụng RAM hiệu quả hơn và ngừng việc ghi quá nhiều vào phân vùng swap trên SSD của bạn.
Hướng dẫn thực hiện: Tinh chỉnh hệ thống của bạn
Chạy các lệnh này với quyền root. Chúng ta sẽ áp dụng các thay đổi này mà không cần khởi động lại toàn bộ hệ thống nếu có thể.
Bước 1: Xác định phần cứng của bạn
Đừng đoán mò. Hãy xác định ổ đĩa nào là dạng flash để bạn không vô tình áp dụng các tinh chỉnh SSD cho một ổ sao lưu HDD cũ.
# 0 = SSD/NVMe, 1 = HDD
lsblk -d -o NAME,ROTA,MODEL,SIZE
Bước 2: Kích hoạt TRIM chủ động
TRIM định kỳ là tiêu chuẩn vàng. Nó cho phép ổ đĩa quản lý việc thu gom rác (garbage collection) trong thời gian rảnh.
# Kiểm tra xem timer có đang hoạt động không
systemctl status fstrim.timer
# Nếu nó đang tắt, hãy kích hoạt nó
sudo systemctl enable --now fstrim.timer
Chạy sudo fstrim -av thủ công một lần. Trên một máy chủ chưa được TRIM trong nhiều tháng, đừng ngạc nhiên nếu bạn thấy nó thu hồi được hơn 50GiB dung lượng “bị mất”.
Bước 3: Chỉnh sửa /etc/fstab để tăng tuổi thọ ổ đĩa
Mở /etc/fstab và tìm các điểm mount của bạn. Chúng ta sẽ thay thế relatime chung chung bằng một tối ưu hóa mạnh mẽ hơn.
# Trước khi sửa:
UUID=abc-123 / ext4 defaults,relatime 0 1
# Sau khi sửa:
UUID=abc-123 / ext4 defaults,noatime,lazytime 0 1
Cờ lazytime chính là “bí kíp”. Nó giữ thời gian truy cập trong RAM và chỉ đẩy chúng xuống đĩa khi dữ liệu của file thực sự thay đổi hoặc trong quá trình đồng bộ hệ thống.
Bước 4: Thiết lập bộ lập lịch chính xác
Đối với NVMe, bộ lập lịch tốt nhất là không có bộ lập lịch nào cả. Chúng ta muốn kernel không can thiệp vào quá trình này. Tôi sử dụng các quy tắc udev để duy trì thiết lập này sau khi khởi động lại.
# Tạo file quy tắc (rule)
sudo nano /etc/udev/rules.d/60-scheduler.rules
Dán các khối logic này vào bên trong:
# Sử dụng 'none' cho NVMe để bỏ qua tải xử lý của kernel
ACTION=="add|change", KERNEL=="nvme*", ATTR{queue/scheduler}="none"
# Sử dụng 'mq-deadline' cho các ổ SSD SATA (không quay)
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
Áp dụng các thay đổi ngay lập tức: sudo udevadm trigger.
Bước 5: Kiểm soát Swap
Linux thường quá ưu tiên sử dụng swap. Trên một ổ SSD, chúng ta muốn giảm thiểu điều này để ngăn ngừa việc hao mòn cell nhớ không cần thiết.
# Thiết lập về 10 để tận dụng RAM tốt hơn
sudo sysctl vm.swappiness=10
# Duy trì thiết lập sau khi khởi động lại
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.d/99-swappiness.conf
Kết luận: Cẩn tắc vô ưu
Tối ưu hóa hiệu suất không phải là việc chạy theo các con số ảo trong các bài kiểm tra benchmark. Đó là việc đảm bảo hệ thống của bạn vẫn vững chắc như bàn thạch khi lưu lượng truy cập tăng vọt lúc 3 giờ sáng. Kinh nghiệm của tôi qua 14 máy chủ VPS đó đã dạy tôi rằng những thay đổi cấu hình nhỏ, có tính toán sẽ ngăn chặn những rắc rối lớn sau này.
Sau khi áp dụng những điều này, hãy sử dụng một công cụ như fio để kiểm chứng xem độ trễ có thực sự giảm hay không. Chỉ cần nhớ sao lưu /etc/fstab trước khi chạm vào nó. Một lỗi đánh máy ở đó có thể biến một buổi tối tối ưu hóa vui vẻ thành một đêm dài vật lộn với bảng điều khiển phục hồi!

