Cơn ác mộng độ trễ lúc 2 giờ sáng
Lúc đó là 2 giờ sáng, và tôi đang nhìn chằm chằm vào một bảng điều khiển giám sát trông như một biểu đồ nhịp tim đang lên cơn kịch phát. Một nhóm làm việc từ xa đang cố gắng đẩy một bản sao lưu cơ sở dữ liệu khổng lồ qua đường truyền cáp quang 100Mbps, và cùng lúc đó, hệ thống VoIP của chúng tôi bắt đầu bị rớt cuộc gọi. Băng thông thậm chí còn chưa bị bão hòa hoàn toàn—chúng tôi mới chạm mức khoảng 85%—nhưng thời gian ping đã nhảy vọt từ 20ms lên 600ms. Đây chính là dấu hiệu điển hình của Bufferbloat.
Theo kinh nghiệm thực tế của tôi, đây là một trong những kỹ năng tối ưu hóa mạng Linux để đạt hiệu suất thực tế cần phải nắm vững. Bạn có thể có kết nối cáp quang nhanh nhất thế giới, nhưng nếu bộ định tuyến hoặc máy chủ Linux của bạn quản lý bộ đệm kém, mạng của bạn sẽ cảm thấy chậm chạp ngay khi có ai đó bắt đầu tải xuống hoặc xem YouTube. Tôi đã dành cả đêm đó để nghiên cứu các tài liệu về kiểm soát lưu lượng (tc), và đó là lúc tôi nhận ra rằng những cách xử lý Chất lượng Dịch vụ (QoS) cũ không còn đủ nữa. Chúng ta cần một giải pháp thông minh hơn.
Hiểu về kẻ thù: Bufferbloat là gì?
Bufferbloat xảy ra khi thiết bị mạng được thiết kế with các bộ đệm (buffer) quá lớn. Khi đường truyền của bạn trở nên bận rộn, các bộ đệm này sẽ bị lấp đầy bởi các gói tin. Thay vì loại bỏ bớt gói tin sớm để báo hiệu cho bên gửi (TCP) giảm tốc độ, bộ định tuyến lại giữ chúng lại. Các gói tin này nằm trong một hàng đợi dài, chờ đến lượt mình, điều này gây ra sự chậm trễ (độ trễ) cực lớn cho mọi lưu lượng truy cập khác.
Hãy tưởng tượng nó giống như việc thanh toán tại siêu thị. Nếu cửa hàng cho phép một hàng dài 100 người xếp hàng tại một quầy thu ngân, ngay cả khi bạn chỉ mua một thanh kẹo, bạn vẫn bị kẹt sau những người có giỏ hàng đầy ắp. Quản lý hàng đợi thông minh (Smart Queue Management – SQM) giống như một quản lý mở một làn đường dành riêng cho những người chỉ có vài món đồ, đảm bảo không ai phải đợi quá lâu.
Tại sao CAKE là giải pháp
Trong nhiều năm, fq_codel là tiêu chuẩn vàng để chống lại Bufferbloat. Nhưng ngày nay, chúng ta có CAKE (Common Applications Kept Enhanced). CAKE là một kỷ luật hàng đợi (qdisc) toàn diện cho nhân Linux, kết hợp nhiều kỹ thuật tiên tiến:
- Bộ định hình băng thông (Bandwidth Shaper): Nó giới hạn lưu lượng thấp hơn một chút so với tốc độ đường truyền thực tế của bạn để đảm bảo điểm nghẽn xảy ra trên máy Linux của bạn (nơi bạn kiểm soát hàng đợi) thay vì trong modem ISP không thông minh.
- Phân lập luồng (Flow Isolation): Đảm bảo rằng một tiến trình tải xuống nặng không làm gián đoạn một phiên chơi game hoặc một truy vấn DNS.
- Nhận biết DiffServ: Nó tôn trọng các đánh dấu ưu tiên lưu lượng (như các đánh dấu được sử dụng bởi VoIP).
- Cấu hình bằng không (Zero Configuration): Không giống như các phương pháp cũ yêu cầu các tập lệnh “tc” phức tạp với nhiều lớp (class), CAKE hầu như chỉ cần “thiết lập và quên đi.”
Điều kiện tiên quyết và Cài đặt
Để thực hiện theo, bạn cần một máy Linux đóng vai trò là gateway hoặc máy chủ xử lý lưu lượng truy cập đáng kể. Hầu hết các nhân Linux hiện đại (4.19+) đều đã tích hợp sẵn CAKE. Bạn sẽ cần gói iproute2, gói này cung cấp lệnh tc.
Trước tiên, hãy kiểm tra xem hệ thống của bạn có hỗ trợ CAKE hay không:
modinfo sch_cake
Nếu bạn thấy mô tả về module, bạn đã sẵn sàng. Nếu không, bạn có thể cần cập nhật nhân của mình hoặc cài đặt gói iproute2-next tùy thuộc vào bản phân phối của bạn.
Trên Debian/Ubuntu:
sudo apt update
sudo apt install iproute2
Triển khai SQM với CAKE
Chiến lược rất đơn giản: chúng ta yêu cầu Linux giới hạn tốc độ gửi và nhận ở mức khoảng 90-95% băng thông thực tế của ISP. Điều này ngăn các bộ đệm không được quản lý của ISP bị lấp đầy.
Bước 1: Xác định giao diện và tốc độ của bạn
Tìm tên giao diện mạng của bạn (ví dụ: eth0, wan0, enp1s0):
ip link show
Chạy một bài kiểm tra tốc độ để tìm mức cơ sở của bạn. Giả sử bạn có kết nối 100Mbps Tải xuống (Down) / 20Mbps Tải lên (Up).
Bước 2: Áp dụng CAKE cho lưu lượng đi (Outbound)
Chúng ta áp dụng CAKE cho giao diện hướng ra internet. Đối với lưu lượng tải lên (egress), chúng ta đặt băng thông thành 18Mbit (90% của 20Mbps).
# Xóa mọi qdisc hiện có
sudo tc qdisc del dev eth0 root 2> /dev/null
# Thêm CAKE cho lưu lượng upload
sudo tc qdisc add dev eth0 root cake bandwidth 18mbit besteffort triple-isolate wash
Dưới đây là chức năng của các cờ đó:
bandwidth 18mbit: Buộc điểm nghẽn phải xảy ra tại đây.besteffort: Chế độ mặc định cho hầu hết lưu lượng internet.triple-isolate: Phân lập các luồng dựa trên IP và cổng nguồn/đích. Đây là bí quyết giúp ping game của bạn luôn thấp khi đang tải xuống.wash: Làm sạch các header dư thừa có thể gây nhầm lẫn cho bộ định hình (shaper).
Bước 3: Xử lý lưu lượng đến (Inbound)
Xử lý lưu lượng tải xuống phức tạp hơn vì về mặt kỹ thuật, bạn không thể kiểm soát những gì internet gửi cho bạn. Tuy nhiên, bạn có thể sử dụng một Khối chức năng trung gian (Intermediate Functional Block – IFB) để chuyển hướng lưu lượng đến vào một hàng đợi mà bạn có thể định hình.
Đầu tiên, kích hoạt module IFB:
sudo modprobe ifb
sudo ip link set dev ifb0 up
Bây giờ, hãy chuyển hướng lưu lượng đến từ eth0 sang ifb0 và áp dụng CAKE tại đó (đặt thành 90Mbps cho đường truyền 100Mbps của chúng ta):
# Chuyển hướng lưu lượng ingress
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
# Áp dụng CAKE cho thiết bị IFB
sudo tc qdisc add dev ifb0 root cake bandwidth 90mbit besteffort triple-isolate wash
Xác minh & Giám sát
Sau khi áp dụng, bạn sẽ cảm nhận được sự khác biệt ngay lập tức. Nhưng với tư cách là kỹ sư, chúng ta không dựa vào cảm giác; chúng ta dựa vào dữ liệu. Sử dụng lệnh thống kê tc để xem CAKE đang hoạt động như thế nào, đồng thời có thể dùng giám sát băng thông mạng dài hạn với vnStat để kiểm tra hiệu quả:
tc -s qdisc show dev eth0
tc -s qdisc show dev ifb0
Hãy tìm các số liệu backlog và dropped. Nếu bạn thấy các gói tin bị “dropped” (loại bỏ), đừng hoảng sợ! Đó là CAKE đang làm công việc của nó—loại bỏ các gói tin để báo cho bên gửi giảm tốc độ để bộ đệm không bị tràn.
Để xác minh thực sự việc khắc phục, bên cạnh việc phân tích pcap chuyên sâu với tshark, tôi khuyên bạn nên sử dụng Waveform Bufferbloat Test hoặc DSLReports Speedtest. Chạy các bài kiểm tra này khi SQM đang hoạt động. Bạn nên tìm kiếm điểm “A” hoặc “A+”, nghĩa là độ trễ của bạn vẫn ổn định ngay cả khi kết nối được tải đầy.
Tinh chỉnh
Nếu bạn vẫn thấy độ trễ tăng vọt, hãy giảm giới hạn băng thông thêm 5%. Các ISP thường cung cấp dư hoặc có tốc độ dao động. Nếu đường truyền 100Mbps của bạn đôi khi giảm xuống 80Mbps trong giờ cao điểm, bạn nên đặt băng thông CAKE thành 75Mbps để an toàn.
Nếu bạn đang sử dụng kết nối có overhead cụ thể (như DSL hoặc PPPoE), CAKE cũng có thể xử lý việc đó. Chỉ cần thêm từ khóa vào lệnh:
sudo tc qdisc replace dev eth0 root cake bandwidth 18mbit pppoe-vcmux
Thiết lập vĩnh viễn
Các lệnh tc sẽ biến mất sau khi khởi động lại. Để làm cho chúng vĩnh viễn, cách dễ nhất trên các hệ thống Linux hiện đại là tạo một tập lệnh shell nhỏ và kích hoạt nó thông qua một dịch vụ systemd hoặc sử dụng network-dispatcher (trên Ubuntu) hoặc các tập lệnh if-up.d.
Đối với hầu hết người dùng, tạo một dịch vụ systemd đơn giản là phương pháp đáng tin cậy nhất:
[Unit]
Description=Áp dụng SQM CAKE
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/apply-sqm.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Giờ đây mạng của bạn sẽ cảm thấy nhanh nhạy hơn. Không còn phải hét lên khắp nhà yêu cầu ai đó ngừng tải xuống để bạn có thể hoàn thành cuộc họp hoặc trận game. CAKE sẽ đảm nhận các công việc nặng nhọc, đảm bảo mọi luồng dữ liệu đều nhận được phần công bằng của mình mà không làm hỏng độ trễ, giúp việc giám sát dịch vụ mạng chủ động đạt kết quả tốt nhất.

