Giám sát Băng thông Mạng Dài Hạn với vnStat trên Linux: Theo dõi, Phân tích và Xuất Báo cáo Sử dụng

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

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 730MonthlyMonths 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ụ: ens3 trở thành ens4), 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 ss hoặc nethogs để 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ùng ss -tulnp hoặc nethogs để 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ục Interface cấ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.
Share: