Cấu hình Scheduler I/O cho hiệu năng cao
Bước đầu tiên là xác định loại Scheduler I/O hiện tại đang chạy trên hệ thống. Mặc định Ubuntu 24.04 thường sử dụng BFQ (Budget Fair Queueing) hoặc Kyber, nhưng cho Database Vector cần tốc độ đọc/ghi ngẫu nhiên cao, ta ưu tiên chuyển sang "None" (deadline scheduler) hoặc giữ Kyber nếu dùng NVMe.
Để xem scheduler hiện tại của các thiết bị block (disk), ta sử dụng lệnh sau:
sudo cat /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: Dòng output sẽ hiển thị tên scheduler đang hoạt động trong dấu ngoặc vuông, ví dụ: [none] mq-deadline kyber bfq.
Chuyển đổi sang Scheduler tối ưu
Nếu đang dùng BFQ, ta sẽ chuyển sang None (deadline) để giảm độ trễ (latency) cho các tác vụ I/O ngẫu nhiên của Vector DB. Lệnh này áp dụng ngay lập tức nhưng sẽ mất khi restart.
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: Không có lỗi (no output), và khi chạy lại lệnh cat ở trên, bạn sẽ thấy [none] nằm trong dấu ngoặc vuông.
Thiết lập cấu hình vĩnh viễn qua GRUB
Để giữ cấu hình này sau khi khởi động lại server, ta cần thêm tham số boot vào GRUB. Ta chỉnh sửa file cấu hình GRUB chính.
sudo nano /etc/default/grub
Trong file này, tìm dòng GRUB_CMDLINE_LINUX_DEFAULT và thêm tham số elevator=none vào bên trong dấu ngoặc kép.
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=none"
Sau khi lưu file, cập nhật GRUB để áp dụng thay đổi vào boot loader.
sudo update-grub
Kết quả mong đợi: Không có lỗi, thông báo "Updating GRUB..." hiện ra. Cần restart server để (có hiệu lực).
Verify kết quả Scheduler
Sau khi restart server, kiểm tra lại xem scheduler có đang là None không.
cat /sys/block/nvme0n1/queue/scheduler
Kết quả mong đợi: Dấu ngoặc vuông bao quanh từ "none", ví dụ: [none] mq-deadline kyber bfq.
Điều chỉnh tham số VM (Virtual Memory)
Tắt Transparent Hugepages
Transparent Hugepages (THP) trên Linux thường gây ra "stuttering" (giật lag) cho các ứng dụng Database do quá trình coalesce memory kéo dài. Ta cần tắt tính năng này hoàn toàn để đảm bảo độ trễ ổn định.
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
Kết quả mong đợi: Giá trị [never] sẽ được in ra hoặc hiển thị trong dấu ngoặc vuông, thay thế cho [always] hoặc madvise.
Thiết lập cấu hình THP vĩnh viễn
Để cấu hình trên không bị reset khi reboot, ta tạo file systemd drop-in hoặc script startup. Cách tốt nhất là dùng systemd để chạy lệnh ngay khi boot.
sudo mkdir -p /etc/systemd/system/systemd-udev-settle.service.d
sudo nano /etc/systemd/system/systemd-udev-settle.service.d/override.conf
Dán nội dung sau vào file override.conf:
[Service]
ExecStartPost=-/usr/bin/bash -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ExecStartPost=-/usr/bin/bash -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
Sau khi lưu, reload systemd để nhận diện file cấu hình mới.
sudo systemctl daemon-reload
Kết quả mong đợi: Không có lỗi, dịch vụ systemd cập nhật thành công.
Điều chỉnh overcommit_memory
Database Vector cần phân bổ bộ nhớ lớn cho các index. Tham số overcommit_memory=2 giúp Linux chỉ cấp phát bộ nhớ khi thực sự cần (overcommit_ratio), tránh việc OOM Killer (Out Of Memory) giết tiến trình DB đột ngột.
sudo sysctl vm.overcommit_memory=2
sudo sysctl vm.overcommit_ratio=90
Kết quả mong đợi: Giá trị overcommit_memory là 2 và overcommit_ratio là 90.
Thiết lập overcommit vĩnh viễn
Thêm tham số vào file sysctl.conf để áp dụng sau mỗi lần khởi động.
sudo nano /etc/sysctl.conf
Cuộn xuống cuối file và thêm 2 dòng sau:
vm.overcommit_memory = 2
vm.overcommit_ratio = 90
Áp dụng thay đổi ngay lập tức mà không cần restart.
sudo sysctl --system
Kết quả mong đợi: Không có lỗi, các tham số được load lại.
Verify kết quả VM
Kiểm tra lại các tham số đã cấu hình.
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
sysctl vm.overcommit_memory
sysctl vm.overcommit_ratio
Kết quả mong đợi: THP là "never", overcommit_memory là 2, overcommit_ratio là 90.
Cấu hình Swap cho môi trường Database
Giảm Swappiness
Swappiness mặc định của Linux là 60, nghĩa là kernel sẽ di chuyển các trang bộ nhớ (page) ra swap khá sớm. Đối với Database, ta cần giữ dữ liệu trong RAM càng lâu càng tốt. Ta giảm swappiness xuống 1 hoặc 0.
sudo sysctl vm.swappiness=1
Kết quả mong đợi: Giá trị swappiness là 1.
Thiết lập Swappiness vĩnh viễn
Thêm tham số vào file cấu hình sysctl để giữ nguyên sau khi reboot.
sudo nano /etc/sysctl.conf
Thêm dòng sau vào cuối file (nếu chưa có):
vm.swappiness = 1
Áp dụng lại cấu hình.
sudo sysctl --system
Kết quả mong đợi: Không có lỗi, tham số được cập nhật.
Quản lý kích thước Swap
Đối với server Vector DB chuyên nghiệp, nếu RAM >= 32GB, ta nên tắt hoàn toàn swap hoặc giữ swap rất nhỏ (2GB) chỉ để xử lý trường hợp khẩn cấp (emergency). Tắt swap giúp tránh việc I/O disk làm chậm hệ thống khi bộ nhớ đầy.
sudo swapoff -a
Nếu muốn giữ lại swap nhỏ, ta cần xóa file swap hiện tại và tạo lại với kích thước mong muốn (ví dụ 2GB).
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Kết quả mong đợi: Swap mới được tạo và kích hoạt.
Thiết lập Swap vĩnh viễn
Thêm file swap vào fstab để tự động mount khi boot.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Kiểm tra lại kích thước và trạng thái swap.
free -h
Kết quả mong đợi: Cột "Swap" hiển thị đúng kích thước đã cấu hình (ví dụ 2.0G).
Verify kết quả Swap
Kiểm tra swappiness và trạng thái swap.
sysctl vm.swappiness
cat /proc/swaps
Kết quả mong đợi: Swappiness là 1, và file swap hiện diện trong danh sách.
Giảm độ trễ mạng thông qua TCP Buffer
Tăng TCP Send và Receive Buffer
Database Vector thường trao đổi lượng dữ liệu lớn qua mạng. Tăng kích thước buffer TCP giúp giảm packet loss và cải thiện throughput. Ta sẽ tăng min, default và max buffer.
sudo sysctl net.core.wmem_default=262144
sudo sysctl net.core.wmem_max=262144
sudo sysctl net.core.rmem_default=262144
sudo sysctl net.core.rmem_max=262144
Kết quả mong đợi: Các giá trị buffer được cập nhật lên 262144 bytes (256KB).
Cho phép TCP Window Scaling
Bật tính năng TCP Window Scaling để hỗ trợ các kết nối có độ trễ cao hoặc băng thông lớn.
sudo sysctl net.ipv4.tcp_window_scaling=1
Kết quả mong đợi: Giá trị tcp_window_scaling là 1.
Thiết lập cấu hình mạng vĩnh viễn
Tạo file cấu hình riêng cho network tuning để không làm lộn xộn file sysctl.conf chính.
sudo nano /etc/sysctl.d/99-network-optimization.conf
Dán nội dung sau vào file:
# TCP Buffer Optimization
net.core.wmem_default = 262144
net.core.wmem_max = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_congestion_control = bbr
Lưu ý: BBR là thuật toán điều khiển tắc nghẽn mới của Google, rất tốt cho hiệu năng mạng.
Áp dụng cấu hình mới.
sudo sysctl --system
Kết quả mong đợi: Không có lỗi, các tham số mạng được load.
Verify kết quả TCP Buffer
Kiểm tra lại các tham số TCP.
sysctl net.core.rmem_max
sysctl net.core.wmem_max
sysctl net.ipv4.tcp_congestion_control
Kết quả mong đợi: rmem_max và wmem_max là 262144, tcp_congestion_control là bbr.
Đ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 1: Chuẩn bị môi trường: Phần cứng, phần mềm và cài đặt Ubuntu 24.04
Phần 3: Cài đặt và cấu hình Vector Database (Weaviate/Milvus) »