Làm chủ Traffic Control (tc): Tuyệt kỹ giới hạn băng thông và ưu tiên traffic trên Linux

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Cảnh tượng quen thuộc: Một tiến trình “vét sạch” đường truyền

Server của bạn đang chạy mượt mà thì bỗng dưng Web Service lăn đùng ra timeout. Kiểm tra lại, bạn phát hiện script Backup dữ liệu lên Cloud đang chạy và chiếm tới 95% băng thông. Khách hàng không thể truy cập, còn bạn thì cuống cuồng tìm cách ngắt tiến trình. Đó chính là lúc tc (Traffic Control) trở thành cứu cánh.

Nhiều kỹ sư hệ thống ngại chạm vào tc vì cú pháp của nó trông như “mật mã”. Tuy nhiên, công cụ này cực kỳ logic nếu bạn hiểu nguyên lý vòi nước và xô đựng dữ liệu. Mình từng dùng tc để cứu nguy cho một hệ thống streaming khi vài user dùng tool download làm nghẽn toàn bộ đường truyền của người dùng khác.

Giải pháp nhanh: Giới hạn tốc độ mạng xuống 1Mbps trong 30 giây

Bạn cần bóp băng thông của card mạng eth0 ngay lập tức? Hãy dùng tbf (Token Bucket Filter). Đây là thuật toán đơn giản nhất để giới hạn tốc độ mà không gây quá tải CPU.

1. Xác định card mạng

ip link show

Giả sử interface cần xử lý là eth0.

2. Áp dụng lệnh bóp băng thông

# Giới hạn 1mbit, burst 32kbit, độ trễ tối đa 400ms
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

3. Kiểm chứng con số

tc -s qdisc show dev eth0

Thử tải một file bằng wget. Bạn sẽ thấy tốc độ bị ghì chặt ở mức ~125 KB/s (tương đương 1Mbps). Không hơn một byte.

4. Xóa cấu hình khi xong việc

sudo tc qdisc del dev eth0 root

Bóc tách cơ chế: Qdisc, Class và Filter

Để tùy biến sâu hơn, bạn cần nắm ba trụ cột sau:

  • Qdisc (Queuing Discipline): Quy tắc xếp hàng. Nó quyết định gói tin nào được đi tiếp, gói nào phải chờ hoặc bị hủy.
  • Class: Các ngăn chứa dữ liệu. Bạn có thể chia đường truyền 100Mbps thành các ngăn nhỏ: 20Mbps cho SSH và 80Mbps cho Web.
  • Filter: Bộ phân loại. Nó giống như nhân viên phân loại bưu phẩm, đẩy gói tin port 22 vào ngăn SSH, port 80 vào ngăn Web.

Cấu hình QoS thực tế với HTB (Hierarchical Token Bucket)

HTB là lựa chọn hàng đầu nhờ tính năng “mượn” băng thông (borrowing). Nếu ngăn SSH đang rảnh, ngăn Web có thể mượn phần dung lượng dư thừa đó để tăng tốc xử lý.

Bài toán: Chia đường truyền 100Mbps cho 3 loại traffic:

  • SSH (Port 22): Ưu tiên cao nhất, tối thiểu 20Mbps.
  • Web (Port 80, 443): Tối thiểu 50Mbps.
  • Traffic khác: Phần còn lại (10-30Mbps).

Bước 1: Khởi tạo hàng đợi gốc

sudo tc qdisc add dev eth0 root handle 1: htb default 30

Mọi traffic không được phân loại sẽ mặc định rơi vào class 30.

Bước 2: Định nghĩa tổng băng thông

sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit

Bước 3: Chia nhỏ các lớp (Classes)

# SSH: Ưu tiên số 1 (prio 1)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20mbit ceil 100mbit prio 1

# Web: Ưu tiên số 2
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit prio 2

# Khác: Ưu tiên thấp nhất
sudo tc class add dev eth0 parent 1:1 classid 1:30 htb rate 10mbit ceil 100mbit prio 3

Thông số ceil 100mbit cho phép các class con bứt tốc nếu đường truyền đang trống.

Bước 4: Gắn bộ lọc (Filter)

# Đẩy traffic port 22 vào class 1:10
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10

# Đẩy traffic port 80 vào class 1:20
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 match ip dport 80 0xffff flowid 1:20

Kinh nghiệm xương máu từ thực địa

Mình từng xử lý một ca lag mạng bí ẩn trên cụm Database. Ping thỉnh thoảng vọt lên 500ms dù traffic tổng không cao. Sau khi chạy tc -s qdisc show, mình phát hiện hàng đợi bị tràn liên tục.

Nguyên nhân do một tiến trình đẩy log nén với dung lượng cực lớn trong thời gian ngắn. Để xử lý, mình điều chỉnh thông số burst. Việc này giúp các gói tin Database nhỏ được “chen ngang” đi trước, trong khi các khối log lớn phải xếp hàng chờ đến lượt.

Lưu ý “sống còn” khi dùng tc

  1. Chỉ tác động chiều đi (Egress): tc quản lý cực tốt traffic đi ra. Với traffic đi vào (Ingress), bạn sẽ cần cấu hình phức tạp hơn thông qua interface ảo ifb.
  2. Cẩn thận đơn vị: mbit là Megabit, còn mbyte là Megabyte. Nhầm lẫn giữa bit và byte sẽ khiến tốc độ thực tế sai lệch gấp 8 lần.
  3. Đừng để bị khóa khỏi Server: Trước khi nghịch tc trên server từ xa, hãy đặt một lệnh at now + 5 minutes để tự động xóa cấu hình tc. Nếu lỡ tay bóp nghẹt port 22, bạn vẫn còn cơ hội quay lại sửa sai.

Làm chủ tc không chỉ là giới hạn tốc độ. Đó là nghệ thuật điều phối tài nguyên để hệ thống luôn ổn định ngay cả trong giờ cao điểm.

Share: