Cấu hình tối ưu thông số Segment và Write Throughput
Để tối ưu tốc độ ghi (write throughput) trên Ubuntu 24.04, ta cần điều chỉnh kích thước segment và ngưỡng kích hoạt compact. Segment quá nhỏ gây áp lực cho metadata, segment quá lớn làm tăng thời gian đọc và index.
Ta sẽ chỉnh sửa file cấu hình của Milvus để tăng kích thước segment lên 1024MB và giảm ngưỡng compact để hệ thống dọn dẹp dữ liệu nhanh hơn.
Đường dẫn file cấu hình trong Docker Compose thường là milvus.yaml trong thư mục cấu hình. Nếu bạn dùng file mặc định, hãy tạo file tùy chỉnh tại /opt/milvus/configs/milvus.yaml và mount vào container.
cat > /opt/milvus/configs/milvus.yaml
Kết quả mong đợi: File milvus.yaml được tạo với các tham số tối ưu. Khi khởi động lại Milvus, hệ thống sẽ tạo các segment lớn hơn, giảm số lượng file trên MinIO và tăng tốc độ ghi.
Verify kết quả
Chạy lệnh sau để kiểm tra xem các tham số có được áp dụng chưa (thay YOUR_CLUSTER_NAME bằng tên cluster của bạn):
docker exec -it milvus-standalone milvus-ctl --show-config dataCoord.segment.maxSize
Trạng thái thành công khi trả về giá trị 1024.
Điều chỉnh kích thước Index phù hợp với RAM
Milvus sử dụng RAM để xây dựng và lưu trữ Index (HNSW hoặc IVF). Nếu kích thước Index vượt quá RAM của server, hệ thống sẽ gặp lỗi OOM (Out Of Memory) hoặc swap quá mức gây giật lag.
Trên Ubuntu 24.04, ta cần cấu hình giới hạn bộ nhớ cho từng thành phần và điều chỉnh tham số index.nlist của HNSW để phù hợp với dung lượng RAM thực tế (ví dụ 16GB RAM).
cat >> /opt/milvus/configs/milvus.yaml
Giải thích: highWatermark đặt tại 80-90% RAM để ngăn chặn OOM, efConstruction và M là tham số quan trọng của HNSW ảnh hưởng trực tiếp đến bộ nhớ. Giảm M xuống 16 sẽ tiết kiệm RAM đáng kể mà vẫn đảm bảo độ chính xác chấp nhận được.
Kết quả mong đợi: File cấu hình được cập nhật. Khi build index, Milvus sẽ tự động giới hạn bộ nhớ sử dụng và báo lỗi nếu vượt ngưỡng thay vì crash container.
Verify kết quả
Kiểm tra bộ nhớ đang sử dụng của container indexNode:
docker stats --no-stream milvus-indexnode | grep indexnode
Quan sát cột MEM USAGE / LIMIT, tỷ lệ này không được vượt quá 90% trong quá trình build index.
Phân tích logs để phát hiện OOM và Latency
Việc đọc logs thủ công là kỹ năng bắt buộc của Sysadmin. Logs của Milvus được lưu trong thư mục /var/lib/milvus/log bên trong container hoặc stdout nếu cấu hình logging ra console.
Ta sẽ tìm kiếm các từ khóa quan trọng: OOM, panic, timeout, latency để phát hiện sự cố.
docker logs milvus-standalone --tail 2000 | grep -i -E "OOM|panic|timeout|latency|error"
Giải thích: Lệnh này lấy 2000 dòng log cuối cùng của container standalone và lọc ra các dòng chứa lỗi nghiêm trọng. Sử dụng -i để tìm không phân biệt hoa thường.
Kết quả mong đợi: Nếu có lỗi, bạn sẽ thấy các dòng báo lỗi như runtime: out of memory hoặc request timeout after 30s. Nếu không có lỗi, lệnh trả về rỗng.
Phân tích chi tiết lỗi OOM
Ngay khi phát hiện OOM, cần kiểm tra log của thành phần cụ thể (ví dụ QueryNode) để xem module nào gây tràn bộ nhớ:
docker logs milvus-querynode-1 | grep -A 10 -B 10 "OOM"
Kết quả mong đợi: Hiển thị 10 dòng trước và sau lỗi OOM, giúp bạn xác định được thao tác nào (ví dụ: BuildIndex, LoadCollection) đã gây ra sự cố.
Cấu hình giám sát với Prometheus và Grafana
Để giám sát hiệu năng liên tục, ta cần triển khai Prometheus để thu thập metrics và Grafana để hiển thị dashboard. Milvus đã tích hợp sẵn Prometheus exporter.
Trước tiên, cần cấu hình Prometheus để scrape metrics từ Milvus. Tạo file prometheus.yml tại /opt/milvus/monitoring/prometheus.yml.
cat > /opt/milvus/monitoring/prometheus.yml
Kết quả mong đợi: File cấu hình Prometheus được tạo, chỉ định target là milvus-standalone ở cổng 9091 (cổng mặc định của Milvus metrics).
Tiếp theo, thêm service Prometheus vào file docker-compose.yml của bạn:
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
depends_on:
- milvus-standalone
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
volumes:
prometheus_data:
EOF
Kết quả mong đợi: Container Prometheus chạy thành công và có thể truy cập tại http://:9090 để xem targets.
Triển khai Grafana
Thêm Grafana vào docker-compose để import dashboard có sẵn của Milvus:
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
grafana_data:
EOF
Kết quả mong đợi: Truy cập http://:3000, đăng nhập với admin/admin. Trong phần "Add Data Source", chọn Prometheus, nhập URL là http://prometheus:9090.
Verify kết quả
Tìm dashboard có ID 10734 (Milvus Dashboard) trên Grafana. Nếu các biểu đồ hiển thị dữ liệu thời gian thực (Request Latency, QPS, Memory Usage), việc giám sát đã thành công.
Khắc phục sự cố phổ biến
Trong quá trình vận hành, hai sự cố thường gặp nhất là mất kết nối (Connection Lost) và lỗi đồng bộ dữ liệu (Sync Error) giữa các node.
Khắc phục lỗi mất kết nối
Nguyên nhân thường do firewall chặn cổng hoặc Docker bridge network bị lỗi. Kiểm tra kết nối giữa các container:
docker exec milvus-standalone ping -c 3 etcd
Nếu ping thất bại, kiểm tra file docker-compose.yml đảm bảo tất cả service cùng nằm trong một network.
Cũng cần kiểm tra firewall trên Ubuntu 24.04 có chặn cổng Milvus (50060, 50061, 9091) hay không:
sudo ufw status | grep 50060
Để mở cổng nếu bị chặn:
sudo ufw allow 50060
Kết quả mong đợi: Lệnh ping trả về 3 packets transmitted, 3 received và ufw hiển thị trạng thái ALLOW.
Khắc phục lỗi đồng bộ dữ liệu (Sync Error)
Lỗi này xảy ra khi DataNode không kịp sync dữ liệu từ Etcd sang MinIO, hoặc phiên bản metadata không khớp. Dấu hiệu là logs báo segment sync failed hoặc version mismatch.
Cách xử lý: Restart container DataNode để kích hoạt lại quá trình sync:
docker restart milvus-datanode-1
Nếu lỗi vẫn tồn tại, kiểm tra dung lượng disk của MinIO:
docker exec minio df -h /data
Giải thích: Nếu disk đầy (Use% 100%), MinIO sẽ từ chối ghi dữ liệu mới, gây lỗi sync. Cần xóa dữ liệu cũ hoặc mở rộng disk.
Kết quả mong đợi: Sau khi restart hoặc mở rộng disk, logs của DataNode chuyển sang trạng thái sync success hoặc flush success.
Điều hướng series:
Mục lục: Series: Triển khai Database Vector với Milvus và Ubuntu 24.04
« Phần 5: Kết nối và thao tác cơ bản với Milvus qua Python SDK
Phần 7: Triển khai Milvus Cluster (Multi-Node) và cân bằng tải »