Tối ưu MTU, Jumbo Frames và MSS Clamping: “Tuyệt chiêu” trị mạng chậm, lag trên Linux

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

Câu chuyện về chiếc “xe tải” và những lần mạng lag bí ẩn

Tôi từng quản lý một cụm datacenter chạy dịch vụ lưu trữ cho khoảng 50 nhân sự. Có giai đoạn, anh em than phiền rằng việc truy cập web nội bộ cực kỳ chậm. Thậm chí, khi SSH vào server, màn hình thường xuyên bị treo cứng. Kỳ lạ ở chỗ, khi đo iperf3, băng thông vẫn báo xấp xỉ 1Gbps, độ trễ (latency) chỉ 1-2ms.

Sau một hồi kiểm tra, tôi nhận ra vấn đề không nằm ở đường truyền mà ở kích thước gói tin. Hãy tưởng tượng dữ liệu là những chiếc xe tải đi qua hầm. Nếu xe quá cao (gói tin lớn) mà hầm lại thấp (MTU của thiết bị trung gian nhỏ), xe sẽ phải dừng lại để dỡ hàng sang xe nhỏ hơn (Fragmentation). Tệ hơn, xe có thể bị kẹt luôn, dẫn đến mất gói tin (Packet loss). Việc tinh chỉnh MTU, Jumbo Frames và MSS Clamping chính là cách chúng ta thiết kế lại kích thước “xe tải” cho phù hợp với mọi cung đường.

Tại sao gói tin bị “vỡ” (Fragmentation) lại gây thảm họa?

Trong thế giới mạng, 1500 bytes là con số chuẩn của MTU (Maximum Transmission Unit). Một file 10MB sẽ được chia nhỏ thành hàng ngàn gói tin 1500 bytes để gửi đi.

Rắc rối nảy sinh khi gói tin này đi qua các đường ống hẹp hơn như VPN hoặc PPPoE. Các kết nối này thường chỉ cho phép 1492 hoặc 1450 bytes vì tốn thêm không gian cho phần header đóng gói. Lúc này, Router buộc phải thực hiện Fragmentation. Nó cắt nhỏ gói tin ra làm hai, gửi đi, rồi đầu nhận phải ghép lại. Quá trình này ngốn CPU của router và làm tăng latency lên gấp 2-3 lần. Trong nhiều trường hợp, gói tin bị drop hoàn toàn, khiến kết nối bị treo ở mức 99%.

Nắm vững các thông số: MTU, Jumbo Frames và MSS

  • MTU (Maximum Transmission Unit): Kích thước tối đa của một khung dữ liệu ở tầng Layer 2.
  • MSS (Maximum Segment Size): Phần dữ liệu thực tế (payload) trong gói TCP. MSS thường bằng MTU trừ đi 40 bytes header (20 bytes IP + 20 bytes TCP). Với MTU 1500, MSS lý tưởng là 1460.
  • Jumbo Frames: Các gói tin có MTU lên tới 9000 bytes. Kỹ thuật này giúp giảm số lượng gói tin cần xử lý, cực kỳ hiệu quả khi backup dữ liệu lớn hoặc chạy SAN trong mạng nội bộ.

Cách xác định MTU tối ưu chỉ với một lệnh

Đừng đoán mò. Hãy dùng lệnh ping trên Linux với tham số -M do (cấm phân mảnh) và -s (chỉ định kích thước) để tìm “điểm gãy” của mạng.

# Thử ping với kích thước 1472 bytes (1472 + 28 bytes header = 1500)
ping -s 1472 -M do 8.8.8.8

Nếu nhận thông báo Frag needed and DF set, nghĩa là 1500 bytes là quá lớn. Hãy hạ dần con số 1472 xuống (ví dụ 1460, 1450…) cho đến khi ping thành công. MTU tối ưu sẽ bằng con số đó cộng thêm 28.

Cấu hình Jumbo Frames thực tế trên Linux

Để thay đổi MTU tức thì cho interface eth0, bạn dùng lệnh ip:

# Thiết lập MTU 9000 cho mạng nội bộ 10Gbps
sudo ip link set dev eth0 mtu 9000

# Kiểm tra lại kết quả
ip link show eth0

Lưu ý cực kỳ quan trọng: Khi bật Jumbo Frames, tất cả thiết bị từ Switch đến Server phải đồng bộ 9000. Nếu một mắt xích chỉ hỗ trợ 1500, gói tin 9000 sẽ bị drop sạch, gây mất kết nối toàn bộ hệ thống.

Để cấu hình này không mất đi sau khi khởi động lại trên Ubuntu, hãy sửa file Netplan tại /etc/netplan/:

network:
  version: 2
  ethernets:
    eth0:
      mtu: 9000
      dhcp4: true

Sau đó áp dụng bằng lệnh: sudo netplan apply.

MSS Clamping: Giải pháp cứu cánh cho VPN

Nhiều khi bạn không thể can thiệp vào MTU của máy khách. Ví dụ, nhân viên dùng VPN WireGuard truy cập server nhưng web chỉ load được cái tiêu đề rồi đứng im. Đây là lúc MSS Clamping phát huy tác dụng. Thay vì chỉnh từng máy, chúng ta cấu hình trực tiếp trên Router/Gateway Linux.

Nó sẽ can thiệp vào quá trình bắt tay TCP (3-way handshake) và ép kích thước MSS xuống mức an toàn. Sử dụng iptables như sau:

# Tự động khớp MSS với MTU thực tế của interface
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Hoặc ép cứng về 1400 bytes để đảm bảo an toàn tuyệt đối
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400

Chiêu này giải quyết đến 90% các lỗi “web quay vòng vòng” khi dùng VPN hoặc đường truyền cáp quang của nhà mạng.

Kinh nghiệm thực chiến: Khi nào nên tối ưu?

Sau nhiều năm vận hành hạ tầng, tôi rút ra 3 quy tắc cốt lõi:

  1. Mạng Internet công cộng: Tuyệt đối không tăng MTU quá 1500. Các router trên Internet sẽ drop gói tin của bạn ngay lập tức. Hãy dùng MSS Clamping nếu bạn thiết lập Gateway.
  2. Hệ thống Backup/Storage: Hãy bật Jumbo Frames (MTU 9000). Trong một bài test thực tế, việc này giúp giảm tải CPU từ 15% xuống 5% và tăng tốc độ copy file thêm khoảng 15%.
  3. Đừng chặn ICMP: Đảm bảo firewall không chặn gói tin ICMP Type 3 Code 4. Nếu chặn, tính năng tự động dò MTU (PMTUD) của Linux sẽ hỏng, gây ra lỗi “Black Hole Router” rất khó debug.

Tổng kết

Không có một cấu hình MTU nào hoàn hảo cho mọi kịch bản. Lời khuyên của tôi là: Giữ 1500 cho Internet, dùng 9000 cho lưu trữ nội bộ và luôn thủ sẵn MSS Clamping cho VPN. Hiểu rõ cách gói tin di chuyển sẽ giúp bạn xử lý sự cố mạng một cách tự tin hơn thay vì phải “mò kim đáy bể”.

Share: