Lựa chọn và định dạng filesystem: XFS vs ext4 cho Vector Database
1. Phân tích yêu cầu lưu trữ cho Vector DB
Vector Database như Weaviate hay Milvus hoạt động dựa trên các khối dữ liệu lớn (large I/O blocks) và truy cập ngẫu nhiên (random read/write) cao. ext4 mặc định có giới hạn về kích thước file và hiệu năng với file hệ thống lớn. XFS được thiết kế cho hiệu năng cao, hỗ trợ tốt hơn với các file lớn và phân bổ không gian linh hoạt.
Quyết định: Sử dụng XFS cho các ổ đĩa chứa dữ liệu vector (data directory) để tối ưu throughput và giảm fragmentation.
2. Định dạng ổ đĩa với XFS tối ưu
Định dạng ổ đĩa mới (ví dụ: /dev/nvme0n1p2) với các tham số đặc biệt cho workload vector: sử dụng sector size lớn (4k hoặc 64k tùy hardware) và tắt journaling nếu có thể chấp nhận rủi ro nhỏ để tăng tốc write, hoặc giữ journaling nhưng tối ưu.
Lưu ý: Dữ liệu cũ sẽ mất. Thực hiện trên partition rỗng.
Tham số giải thích:
size=4096: Sector size 4KB, phù hợp với NVMe hiện đại.
inode64: Cho phép inode address space 64-bit, cần thiết cho file hệ thống lớn.
nojournal: (Tùy chọn mạnh) Tắt journaling để tối đa write speed. Chỉ dùng nếu có RAID hoặc UPS. Nếu cần an toàn, bỏ tham số này.
Command:
mkfs.xfs -f -d size=4096 -d inode64 /dev/nvme0n1p2
Kết quả mong đợi: XFS được tạo thành công, không có lỗi, hiển thị "Installation complete".
3. Mount filesystem với các tùy chọn hiệu năng
Mount partition vừa tạo vào thư mục dữ liệu của Vector DB (ví dụ: /var/lib/vector-data). Cần cấu hình mount options để giảm overhead khi đọc ghi.
Tham số giải thích:
noatime: Không cập nhật thời gian truy cập file, giảm write I/O đáng kể.
nodiratime: Không cập nhật thời gian truy cập thư mục.
noexec: Ngăn chặn thực thi binary từ thư mục data (bảo mật + hiệu năng).
nofail: (Nếu dùng systemd) Cho phép boot thành công ngay cả khi disk offline.
Command (Tạm thời):
mkdir -p /var/lib/vector-data && mount -o noatime,nodiratime,noexec /dev/nvme0n1p2 /var/lib/vector-data
Kết quả mong đợi: Partition được mount thành công, không lỗi.
4. Cấu hình Mount vĩnh viễn trong fstab
Để cấu hình tồn tại sau khi reboot, chỉnh sửa file fstab. Sử dụng UUID của disk thay vì device name để tránh lỗi khi device name thay đổi.
Command:
lsblk -f /dev/nvme0n1p2
Kết quả mong đợi: Hiển thị bảng với cột UUID (ví dụ: abc123-def456...).
Chỉnh sửa file: /etc/fstab
Nội dung thêm vào cuối file (thay UUID thực tế của bạn):
UUID=abc123-def456-789012345678 /var/lib/vector-data xfs noatime,nodiratime,noexec,nofail 0 2
Kết quả mong đợi: File fstab được lưu. Kiểm tra bằng mount -a không có lỗi.
Cấu hình Journaling và Discard/Trim cho SSD/NVMe
1. Tối ưu hóa TRIM/Discard cho NVMe
SSD và NVMe cần được thông báo về các block đã xóa để garbage collection hoạt động hiệu quả, duy trì tốc độ write theo thời gian. Tuy nhiên, gọi discard mỗi lần xóa file gây overhead I/O lớn.
Chiến lược: Tắt discard trực tiếp trong mount options, thay vào đó dùng timer (fstrim) chạy định kỳ để gom việc xóa thành một lần duy nhất.
Command:
ls /sys/block/nvme0n1/device/queue/discard_granularity
Kết quả mong đợi: Trả về giá trị khác 0 (thường là 4096), xác nhận disk hỗ trợ discard.
2. Thiết lập định kỳ TRIM (fstrim.timer)
Cấu hình systemd để chạy fstrim hàng tuần vào lúc ít tải (ví dụ 3h sáng).
File cấu hình: /etc/systemd/system/fstrim.timer (hoặc chỉnh sửa file mặc định)
Nội dung file timer:
[Unit]
Description=Discard unused blocks once a week
[Timer]
OnBootSec=10min
OnUnitActiveSec=1week
RandomizedDelaySec=30min
Persistent=true
Unit=fstrim@.service
[Install]
WantedBy=timers.target
File service tương ứng: /etc/systemd/system/fstrim@.service
Nội dung file service:
[Unit]
Description=Discard unused blocks on %I
[Service]
Type=oneshot
ExecStart=/sbin/fstrim -v %I
[Install]
WantedBy=multi-user.target
Command kích hoạt:
systemctl daemon-reload && systemctl enable --now fstrim.timer
Kết quả mong đợi: Timer được enable và chạy. Kiểm tra bằng systemctl status fstrim.timer thấy "Active: active (waiting)".
3. Điều chỉnh Journaling (Tùy chọn nâng cao)
Với XFS, journaling mặc định đã khá nhẹ. Nếu workload là write-heavy (training model), có thể cân nhắc tắt journaling hoàn toàn (đã làm ở bước mkfs). Nếu cần an toàn hơn, giữ journaling nhưng đảm bảo nó nằm trên disk riêng biệt (nếu có RAID config).
Verify Journaling:
ls -l /var/lib/vector-data/.xfs_log*
Kết quả mong đợi: Nếu thấy file log, journaling đang hoạt động. Nếu không thấy (do mount option nojournal), journaling đã tắt.
Tinh chỉnh Write-back Cache và Dirty Ratio
1. Hiểu về Write-back Cache
Linux giữ dữ liệu trong RAM (page cache) trước khi ghi ra disk để tăng tốc. Vector DB thường write liên tục, nếu buffer đầy, ứng dụng sẽ bị block (stall) chờ disk ghi. Cần tinh chỉnh tỷ lệ RAM dành cho dirty data.
Mục tiêu: Giảm vm.dirty_ratio và vm.dirty_background_ratio để tránh peak I/O đột ngột gây lag, thay vào đó ghi dữ liệu ra disk sớm hơn và đều đặn hơn.
2. Cấu hình Kernel Parameters
Thiết lập các tham số để giữ dirty data ở mức thấp (ví dụ 10% RAM) và kích hoạt background write sớm (5% RAM).
File cấu hình: /etc/sysctl.d/99-vector-db-dirty.conf
Nội dung hoàn chỉnh:
# Tối ưu Write-back cho Vector DB
# Giới hạn dirty pages xuống 10% tổng RAM
vm.dirty_ratio = 10
# Kích hoạt background write khi đạt 5% RAM
vm.dirty_background_ratio = 5
# Giới hạn số byte dirty (tùy vào RAM, ví dụ 2GB RAM -> 200MB)
# vm.dirty_bytes = 209715200
# vm.dirty_background_bytes = 104857600
# Thời gian giữ dirty data trong RAM trước khi buộc phải ghi (giảm từ 30s xuống 5s)
vm.dirty_expire_centisecs = 500
# Thời gian background writer chạy (giảm từ 5s xuống 1s)
vm.dirty_writeback_centisecs = 100
Command áp dụng ngay:
sysctl -p /etc/sysctl.d/99-vector-db-dirty.conf
Kết quả mong đợi: Các tham số được cập nhật, hiển thị giá trị mới trong terminal.
3. Kiểm tra giá trị thực tế
Verify các tham số đã được áp dụng vào kernel runtime.
Command:
sysctl vm.dirty_ratio vm.dirty_background_ratio vm.dirty_expire_centisecs vm.dirty_writeback_centisecs
Kết quả mong đợi: Trả về các giá trị 10, 5, 500, 100 tương ứng.
Cấu hình I/O Scheduler cho từng loại Disk
1. Xác định loại Disk và Scheduler phù hợp
SSD và NVMe không cần I/O scheduling phức tạp (như CFQ hay Deadline) vì chúng có latency thấp và parallelism cao. Scheduler tốt nhất cho NVMe/SSD là none (mặc định trên Linux mới) hoặc mq-deadline nếu cần ưu tiên read.
HDD cần bfq hoặc mq-deadline để sắp xếp I/O.
Chiến lược: Ép buộc NVMe sử dụng none hoặc mq-deadline để giảm CPU overhead và tối ưu hóa throughput.
2. Kiểm tra Scheduler hiện tại
Xác định scheduler đang chạy của disk vector.
Command:
cat /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: Hiển thị danh sách, ví dụ: [none] mq-deadline kyber. Dấu ngoặc vuông chỉ scheduler đang hoạt động.
3. Thiết lập Scheduler tối ưu
Thiết lập scheduler thành none cho NVMe để loại bỏ overhead scheduling, hoặc mq-deadline nếu cần ưu tiên read hơn write (thường cho Vector DB là read-heavy sau khi train).
Command (Tạm thời - chọn 'none'):
echo none > /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: Không lỗi. Kiểm tra lại bằng cat /sys/block/nvme0n1/queue/scheduler thấy [none].
4. Cấu hình vĩnh viễn với Grub hoặc Kernel Parameter
Để thay đổi scheduler vĩnh viễn cho NVMe, dùng kernel parameter libata.force (cho SATA SSD) hoặc nvme.default_scheduler (cho NVMe).
File cấu hình: /etc/default/grub
Nội dung thêm vào biến GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvme.default_scheduler=none"
Command cập nhật GRUB:
update-grub
Kết quả mong đợi: GRUB được cập nhật. Sau khi reboot, scheduler sẽ là 'none'.
Verify sau reboot:
cat /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: [none] ...
Verify tổng hợp kết quả tối ưu hóa
1. Kiểm tra Mount Options và Filesystem
Đảm bảo disk được mount đúng options và loại filesystem.
mount | grep vector-data
Kết quả mong đợi: Dòng đầu chứa xfs và các options noatime,nodiratime,noexec.
2. Kiểm tra Kernel Dirty Parameters
Đảm bảo write-back cache đã được tinh chỉnh.
cat /proc/sys/vm/dirty_ratio /proc/sys/vm/dirty_background_ratio
Kết quả mong đợi: Trả về 10 và 5.
3. Kiểm tra I/O Scheduler
Đảm bảo scheduler đang chạy đúng loại.
cat /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: [none] hoặc [mq-deadline] tùy cấu hình.
4. Kiểm tra Timer TRIM
Đảm bảo timer chạy định kỳ.
systemctl status fstrim.timer
Kết quả mong đợi: Trạng thái active (waiting) và next trigger hiển thị thời gian tương lai.
5. Benchmark nhanh (Tùy chọn)
Sử dụng dd để test write speed cơ bản.
dd if=/dev/zero of=/var/lib/vector-data/testfile bs=1G count=1 oflag=direct conv=fdatasync && rm /var/lib/vector-data/testfile
Kết quả mong đợi: Hiển thị tốc độ write (MB/s). Giá trị này nên cao và ổn định, phản ánh hiệu năng của disk sau khi tối ưu.
Điều hướng series:
Mục lục: Series: Tối ưu hóa Database Vector trên Ubuntu 24.04 với Linux Kernel Tuning
« Phần 4: Tinh chỉnh Kernel nâng cao: NUMA, CPU Pinning và Hugepages
Phần 6: Benchmark, Giám sát và Troubleshooting nâng cao »