Sự thật về chuyện phân mảnh trên Linux
“Linux không bao giờ bị phân mảnh” là một trong những lời đồn phổ biến nhất trong giới kỹ thuật. Thực tế, các hệ thống file như EXT4, XFS hay Btrfs quản lý block rất thông minh. Chúng cố gắng sắp xếp dữ liệu liền kề để tối ưu tốc độ. Tuy nhiên, thông minh không đồng nghĩa với hoàn hảo.
Mình từng xử lý một cụm server chạy database SQL và ghi log 24/7 trên CentOS 7. Sau 2 năm, tốc độ I/O giảm từ 150MB/s xuống còn chưa đầy 40MB/s, dù ổ đĩa mới đầy 80%. Khi kiểm tra, các file log bị chia nhỏ thành hơn 5.000 mảnh (fragments). Đầu đọc HDD phải nhảy liên tục, khiến độ trễ (latency) tăng vọt, làm ứng dụng phản hồi cực chậm.
Bạn cần bắt tay vào chống phân mảnh khi:
- Dung lượng trống còn dưới 15%, khiến hệ thống khó tìm được các block trống liền mạch.
- Server thực hiện các tác vụ ghi/xóa dữ liệu cường độ cao như Mail server hoặc Log server.
- Hệ thống đang chạy trên ổ cứng HDD truyền thống.
Chuẩn bị công cụ
Đa số các bản phân phối như Ubuntu, Debian hay AlmaLinux đều có sẵn các công cụ này. Nếu chưa có, bạn chỉ mất vài giây để cài đặt gói e2fsprogs (cho EXT4) và xfsprogs (cho XFS).
Với Ubuntu/Debian:
sudo apt update && sudo apt install e2fsprogs xfsprogs -y
Với RHEL/CentOS/AlmaLinux:
sudo yum install e2fsprogs xfsprogs -y
Đo lường mức độ “rối” của ổ đĩa
Đừng vội vàng chạy lệnh chống phân mảnh ngay lập tức. Việc này tiêu tốn tài nguyên CPU và I/O đáng kể. Hãy kiểm tra tình trạng thực tế trước để quyết định có nên can thiệp hay không.
1. Đối với hệ thống EXT4
Để xem bức tranh tổng thể về các khoảng trống trên đĩa, hãy dùng e2freefrag:
sudo e2freefrag /dev/sda1
Nếu muốn soi kỹ một file quan trọng (như file database), filefrag là lựa chọn tốt nhất:
sudo filefrag -v /var/lib/mysql/ibdata1
Hãy nhìn vào cột extents. Nếu con số này lên đến hàng trăm cho một file duy nhất, đó là tín hiệu báo động đỏ về hiệu suất.
2. Đối với hệ thống XFS
XFS cung cấp công cụ xfs_db để kiểm tra nhanh ở chế độ chỉ đọc:
sudo xfs_db -c frag -r /dev/sdb1
Kinh nghiệm thực tế cho thấy: dưới 10% là ổn định, nhưng nếu con số này vượt ngưỡng 20%, bạn sẽ thấy hệ thống bắt đầu ì ạch.
Cách chống phân mảnh an toàn
Một lưu ý sống còn: Không bao giờ chống phân mảnh cho SSD theo cách của HDD. Việc di chuyển dữ liệu liên tục trên SSD chỉ làm tốn số lần ghi (P/E cycles) và giảm tuổi thọ ổ cứng. Với SSD, chúng ta chỉ cần dùng lệnh fstrim.
Xử lý EXT4 bằng e4defrag
Điểm cộng lớn nhất của e4defrag là khả năng chạy online. Bạn không cần unmount ổ đĩa hay dừng dịch vụ, cực kỳ phù hợp cho các server cần uptime cao.
Kiểm tra mức độ phân mảnh của một thư mục cụ thể:
sudo e4defrag -c /var/www/html/
Nếu chỉ số “Fragmentation score” vượt quá 30, hãy tiến hành gom mảnh:
# Chống phân mảnh một file nặng
sudo e4defrag /var/lib/mysql/data_file.dbf
# Chống phân mảnh toàn bộ phân vùng
sudo e4defrag /dev/sda1
Xử lý XFS bằng xfs_fsr
XFS sử dụng xfs_fsr (Filesystem Reorganizer). Công cụ này rất thông minh, nó sẽ tạo ra một file tạm thời chứa dữ liệu đã được sắp xếp, sau đó mới tráo đổi với file cũ để đảm bảo an toàn dữ liệu.
# Tối ưu toàn bộ phân vùng XFS
sudo xfs_fsr /dev/sdb1
Tự động hóa và Giám sát
Thay vì đợi đến khi server treo mới xử lý, hãy thiết lập một script kiểm tra định kỳ vào giờ thấp điểm. Dưới đây là cách mình thường cấu hình cron job chạy vào 3 giờ sáng.
Tạo script optimize_disk.sh:
#!/bin/bash
# Lấy điểm số phân mảnh của thư mục log
SCORE=$(e4defrag -c /var/log | grep "Fragmentation score" | awk '{print $3}')
# Nếu score > 30 thì mới thực hiện chống phân mảnh
if [ "$SCORE" -gt 30 ]; then
echo "$(date): Score $SCORE quá cao. Đang tối ưu..." >> /var/log/defrag_history.log
e4defrag /var/log
fi
Đừng quên kích hoạt fstrim nếu bạn dùng SSD để hệ thống tự dọn dẹp các block dữ liệu thừa:
sudo systemctl enable --now fstrim.timer
Quản trị hệ thống không chỉ là cài đặt mà còn là duy trì hiệu suất lâu dài. Hiểu rõ cách vận hành của hệ thống file sẽ giúp bạn xử lý những ca “bệnh” về tốc độ mà đôi khi việc nâng cấp RAM hay CPU cũng không thể giải quyết được.

