Bối cảnh & Tại sao cần dùng vnStat
Hầu hết các công cụ giám sát mạng chỉ hiển thị những gì đang xảy ra ngay lúc này — tốc độ gói tin, số kết nối đang hoạt động, thông lượng hiện tại. Điều đó hữu ích khi cần chẩn đoán một đột biến, nhưng không cho bạn biết gì về mức tiêu thụ băng thông trong ba tháng qua. Khi nhà cung cấp đám mây gửi hóa đơn vượt hạn mức bất ngờ, hay ISP giới hạn tốc độ mà không báo trước, bạn cần dữ liệu lịch sử — không phải biểu đồ thời gian thực.
Đó chính là khoảng trống mà vnStat lấp đầy. Nó chạy như một daemon nhẹ, đọc thống kê giao diện mạng từ bộ đếm của chính kernel và tích lũy vào cơ sở dữ liệu cục bộ. Truy vấn mức sử dụng theo giờ, ngày, tháng hoặc năm — không cần bắt gói tin, và không cần quyền root chỉ để xem báo cáo.
Chạy vnStat trong môi trường production — cả trên VPS lẫn máy chủ bare-metal — đủ đáng tin cậy đến mức tôi không còn phải lo nghĩ về nó nữa. Sau một năm trên một web server bận rộn xử lý ~50K request/ngày, tôi có dữ liệu traffic sạch theo từng tháng có thể đối chiếu với hóa đơn CDN để phát hiện sai lệch thanh toán. Tài nguyên tiêu thụ rất nhỏ: khoảng 1–2 MB RAM, với các lần ghi đĩa định kỳ.
Một điểm khác biệt của vnStat so với các công cụ thay thế như iftop hay nethogs: nó vượt qua được các lần khởi động lại. Vì đọc bộ đếm kernel thay vì nghe lén lưu lượng mạng, nó tái tạo tổng số chính xác ngay cả sau khi giao diện mạng khởi động lại — miễn là daemon đang chạy khi bộ đếm bị tràn.
Cài đặt
Gói vnStat có sẵn trong kho mặc định của mọi bản phân phối lớn. Không cần PPA hay nguồn bên thứ ba.
Debian / Ubuntu
sudo apt update
sudo apt install vnstat -y
RHEL / CentOS / Rocky Linux / AlmaLinux
# Bật EPEL trước nếu chưa cài
sudo dnf install epel-release -y
sudo dnf install vnstat -y
Arch Linux
sudo pacman -S vnstat
Trước khi tiếp tục, hãy kiểm tra phiên bản của bạn. vnStat 2.x (phát hành năm 2019) đã cải tổ hoàn toàn định dạng cơ sở dữ liệu và thêm tính năng xuất JSON — hai điều mà hướng dẫn này phụ thuộc vào:
vnstat --version
Output dự kiến trông như sau:
vnStat 2.12 by Teemu Toivola <tst at iki dot fi>
Cấu hình
Khởi động Daemon
Daemon — vnstatd — xử lý toàn bộ việc thu thập dữ liệu. Bật và khởi động nó với systemd:
sudo systemctl enable vnstat
sudo systemctl start vnstat
sudo systemctl status vnstat
Theo mặc định, nó kiểm tra từng giao diện đã cấu hình mỗi 5 phút. Dữ liệu được lưu tại /var/lib/vnstat/ — một file cơ sở dữ liệu cho mỗi giao diện.
Thêm Giao diện Cần Giám sát
Daemon tự động phát hiện các giao diện khi khởi động. Nếu bạn thêm giao diện mới sau đó — một VPN tunnel, một NIC thứ hai — bạn có thể đăng ký thủ công:
# Liệt kê các giao diện có sẵn
ip link show
# Thêm thủ công một giao diện cụ thể
sudo vnstat --add -i eth0
# Hoặc cho các instance cloud nơi tên giao diện có thể khác
sudo vnstat --add -i ens3
Sau khi thêm, hãy đợi vài phút để daemon bắt đầu thu thập. Truy vấn đầu tiên có thể trả về kết quả rỗng hoặc thưa thớt — điều đó bình thường. Hãy để khoảng 15–30 phút trước khi mong đợi dữ liệu theo giờ có ý nghĩa.
Chỉnh sửa File Cấu hình
File cấu hình chính nằm tại /etc/vnstat.conf. Một số thiết lập đáng chú ý:
sudo nano /etc/vnstat.conf
Các tùy chọn quan trọng cần xem xét:
# Giao diện mặc định cần giám sát (hữu ích khi chỉ có một giao diện)
Interface "eth0"
# Tần suất daemon kiểm tra (tính bằng giây, mặc định 300)
UpdateInterval 300
# Số ngày/tháng/năm lưu trong cơ sở dữ liệu
SaveInterval 5
OfflineSaveInterval 30
# Số ngày tối đa lưu trong thống kê theo ngày (0 = không giới hạn)
DailyDays 365
# Số tháng tối đa
MonthlyMonths 25
Trên bất kỳ máy chủ nào tôi định chạy hơn một năm, tôi đặt DailyDays thành 730 và MonthlyMonths thành 36. Cơ sở dữ liệu vẫn gọn nhẹ — dưới 500 KB ngay cả với ba năm dữ liệu theo ngày. Không có lý do gì để bỏ đi lịch sử.
Sau khi chỉnh sửa, khởi động lại daemon:
sudo systemctl restart vnstat
Kiểm tra & Giám sát
Các Truy vấn Cơ bản
Khi daemon đã chạy một lúc, bắt đầu truy vấn. Chạy vnstat không có tham số sẽ in tóm tắt cho tất cả các giao diện đang giám sát:
vnstat
Output mẫu:
rx / tx / total / estimated
eth0:
2024-05 45.23 GiB / 12.67 GiB / 57.90 GiB / 61.20 GiB
2024-06 3.10 GiB / 0.87 GiB / 3.97 GiB / 63.52 GiB
estimated 63.52 GiB / 17.83 GiB / 81.35 GiB
Dòng estimated ngoại suy mức sử dụng trong tháng hiện tại — hữu ích để biết liệu bạn có vượt hạn mức tháng trước khi chu kỳ thanh toán kết thúc hay không.
Báo cáo Chi tiết Theo Từng Khoảng Thời gian
# Thống kê theo ngày (30 ngày gần nhất)
vnstat -d
# Thống kê theo giờ (24 giờ gần nhất)
vnstat -h
# Tóm tắt theo tháng
vnstat -m
# Tổng cộng theo năm
vnstat -y
# Khoảng 5 phút (chi tiết nhất, vài giờ gần nhất)
vnstat -5
# Chỉ định giao diện cụ thể
vnstat -i eth0 -m
Tốc độ Lưu lượng Thời gian Thực
Cần xem nhanh thông lượng hiện tại? Bỏ qua iftop — chế độ live tích hợp của vnStat là đủ cho một kiểm tra đơn giản:
# Xem trực tiếp — cập nhật mỗi giây
vnstat -l -i eth0
Nhẹ hơn iftop, và hoàn toàn phù hợp để kiểm tra nhanh “có lưu lượng đang chạy không?”.
Xuất Dữ liệu ra JSON
Một tính năng tôi liên tục sử dụng: xuất JSON. Đưa output trực tiếp vào script hoặc dashboard — không cần regex, không cần phân tích văn bản dễ hỏng.
# Xuất toàn bộ JSON cho một giao diện
vnstat -i eth0 --json
# Chỉ dữ liệu theo tháng dạng JSON
vnstat -i eth0 --json m
# Dữ liệu theo ngày dạng JSON
vnstat -i eth0 --json d
Một script Python đơn giản để phân tích tổng theo tháng và in ra:
import subprocess
import json
result = subprocess.run(
["vnstat", "-i", "eth0", "--json", "m"],
capture_output=True, text=True
)
data = json.loads(result.stdout)
for entry in data["interfaces"][0]["traffic"]["month"]:
year = entry["date"]["year"]
month = entry["date"]["month"]
rx_gb = entry["rx"] / 1024**3
tx_gb = entry["tx"] / 1024**3
print(f"{year}-{month:02d} RX: {rx_gb:.2f} GB TX: {tx_gb:.2f} GB")
Thiết lập Cảnh báo Băng thông Đơn giản
Có VPS tính phí theo lưu lượng với hạn mức tháng? Kết nối script cron này trước khi chạm giới hạn. Nó gửi email khi RX tháng vượt quá 80 GB:
#!/bin/bash
# /usr/local/bin/check_bandwidth.sh
LIMIT_GB=80
RX_BYTES=$(vnstat -i eth0 --json m | python3 -c "
import sys, json
d = json.load(sys.stdin)
entries = d['interfaces'][0]['traffic']['month']
if entries: print(entries[-1]['rx'])
else: print(0)
")
RX_GB=$(echo "scale=2; $RX_BYTES / 1073741824" | bc)
if (( $(echo "$RX_GB > $LIMIT_GB" | bc -l) )); then
echo "CẢNH BÁO: RX tháng là ${RX_GB} GB (giới hạn: ${LIMIT_GB} GB)" \
| mail -s "Cảnh báo Băng thông: eth0" [email protected]
fi
Thêm vào cron để chạy hàng ngày:
crontab -e
# Thêm:
0 9 * * * /usr/local/bin/check_bandwidth.sh
Xem Dữ liệu Lịch sử Sau Khi Di chuyển Cơ sở Dữ liệu
Chuyển máy chủ hoặc cài lại từ đầu? Sao chép /var/lib/vnstat/ sang máy mới trước khi khởi động daemon và toàn bộ lịch sử sẽ theo cùng. Định dạng dữ liệu tương thích giữa các phiên bản vnStat giống nhau.
Nâng cấp từ 1.x lên 2.x là câu chuyện khác — bạn sẽ cần xuất và nhập lại. Gói vnStat 2.x thường đi kèm công cụ di chuyển cho đúng mục đích này.
Mẹo Thực tế Từ Kinh nghiệm Sử dụng
- Cố định tên giao diện mạng. Nếu nhà cung cấp đám mây đổi tên giao diện khi khởi động lại (ví dụ:
ens3trở thànhens4), vnStat sẽ tạo cơ sở dữ liệu mới cho tên mới và lịch sử của bạn bị chia đôi. Dùng udev rules để khóa tên giao diện, hoặc kiểm tra tài liệu của nhà cung cấp. - Giám sát nhiều giao diện riêng biệt. Trên máy chủ có cả NIC công cộng lẫn riêng tư, hãy theo dõi chúng độc lập nhau. Lưu lượng nội bộ — chẳng hạn giữa các container Docker trên VLAN riêng — có thể làm tổng số bị phóng đại nếu bạn theo dõi sai giao diện.
- Kết hợp với
sshoặcnethogsđể xác định theo tiến trình. vnStat cho bạn tổng theo giao diện, không phải theo tiến trình. Khi có con số đột biến, dùngss -tulnphoặcnethogsđể tìm nguyên nhân, rồi đối chiếu với dữ liệu theo giờ của vnStat để biết khi nào bắt đầu. - Kiểm tra thư mục cơ sở dữ liệu định kỳ. Với cài đặt mặc định,
/var/lib/vnstat/luôn dưới 10 MB ngay cả sau nhiều năm dữ liệu. Sự tăng trưởng bất thường thường có nghĩa là một mụcInterfacecấu hình sai đang theo dõi giao diện loopback hoặc giao diện ảo với bộ đếm bị phóng đại.

