Đường truyền 10Gbps nhưng chỉ đạt 2Gbps
Các thiết lập mặc định của Linux hướng tới khả năng tương thích thay vì hiệu năng thuần túy. Những cài đặt này hoạt động ổn cho laptop cá nhân hoặc web server cơ bản.
Tuy nhiên, chúng nhanh chóng trở thành rào cản khi ứng dụng của bạn mở rộng để xử lý hơn 10.000 kết nối đồng thời. Tôi đã thấy many phần cứng cao cấp bị giới hạn ở mức thấp hơn nhiều so với năng lực vật lý chỉ vì kernel hoạt động quá an toàn. Sau khi áp dụng các tinh chỉnh này trong môi trường production lưu lượng cao, chúng tôi đã giảm được 40% độ trễ p99 và cuối cùng đã khai thác hết băng thông của các card mạng (NIC) 10Gbps.
TCP đảm nhận vai trò quan trọng trong việc đảm bảo độ tin cậy của dữ liệu. Nó quản lý kiểm soát luồng (flow control) và tắc nghẽn dựa trên các tham số do kernel định nghĩa. Nếu các giới hạn này quá thận trọng, server của bạn sẽ lãng phí tài nguyên để chờ xác nhận (ACK). Nó bị nghẽn bởi các buffer quá nhỏ thay vì truyền tải dữ liệu. Mục tiêu là mở rộng băng thông mà không làm cạn kiệt bộ nhớ hệ thống.
Làm toán nào: Tích số Băng thông và Độ trễ (BDP)
Đừng thay đổi các con số một cách mù quáng. Bạn cần hiểu về Bandwidth Delay Product (BDP). Nó đại diện cho tổng lượng dữ liệu “đang bay” (in flight) — các gói tin đã gửi nhưng chưa được xác nhận.
BDP = Bandwidth (bits/sec) * Round Trip Time (seconds)
Dưới đây là một ví dụ thực tế. Nếu bạn có đường truyền 10Gbps và độ trễ khứ hồi 50ms tới database, BDP của bạn rơi vào khoảng 62.5 megabytes. Nếu TCP buffer bị giới hạn ở mức mặc định 4MB, phía gửi sẽ phải dừng lại và chờ ACK trong 93% thời gian. Thực tế bạn đang trả tiền cho đường truyền 10Gbps nhưng chỉ nhận được 640Mbps. Chúng ta phải tăng kích thước buffer để giữ cho đường ống luôn đầy.
Cài đặt và Công cụ
Tinh chỉnh stack khá đơn giản. Bạn không cần các phần mềm bên thứ ba phức tạp. Mọi thứ đều thực hiện qua giao diện sysctl và iproute2. Hầu hết các bản phân phối hiện đại như Ubuntu 22.04 hay RHEL 9 đều đã bao gồm sẵn các công cụ này.
Bắt đầu bằng cách kiểm tra các công cụ hiện có. Nếu bạn đang dùng một image tối giản, hãy cài đặt chúng tại đây:
# Cho Debian/Ubuntu
sudo apt update && sudo apt install iproute2 procps -y
# Cho RHEL/CentOS/Fedora
sudo dnf install iproute procps-ng -y
Bạn sẽ sử dụng sysctl để tinh chỉnh kernel trong thời gian thực. Sử dụng ss (socket statistics) để theo dõi tác động thực tế lên các kết nối của mình.
Cấu hình từng bước
Để thử nghiệm, hãy dùng sysctl -w để áp dụng các thay đổi ngay lập tức. Sau khi xác nhận hiệu năng tăng vọt, chúng ta sẽ thiết lập chúng vĩnh viễn.
1. Tăng kích thước TCP Buffer mạnh mẽ
Linux sử dụng các buffer cốt lõi (core buffers) và các buffer dành riêng cho TCP. Chúng ta cần tăng cả hai. Để hỗ trợ các mạng từ 1Gbps trở lên, mức mặc định 4MB cũ sẽ không còn phù hợp.
# Kiểm tra các giới hạn hiện tại trước
sysctl net.core.rmem_max net.ipv4.tcp_rmem
Áp dụng các cài đặt này cho môi trường băng thông cao:
# Thiết đặt kích thước buffer nhận/gửi tối đa là 16MB
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216
# Thiết đặt TCP autotuning: min (4KB), default (87KB), max (16MB)
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
Kernel sử dụng ba giá trị này cho tcp_rmem để thay đổi kích thước một cách linh hoạt. Nó bắt đầu ở mức nhỏ và chỉ mở rộng tới mức tối đa khi kết nối yêu cầu.
2. Chuyển sang Google BBR
Hầu hết các kernel cũ mặc định sử dụng Cubic. Nó đáng tin cậy nhưng phản ứng kém với tình trạng mất gói tin (packet loss) trên các đường truyền khoảng cách xa. <a href="https://itnotes.dev/vi/tang-toc-hieu-suat-mang-linux-huong-dan-thuc-te-ve-google-bbr/">BBR</a> (Bottleneck Bandwidth and RTT) của Google là một bước ngoặt lớn. Nó bỏ qua việc mất gói tin ngẫu nhiên và tập trung vào băng thông thực tế.
BBR yêu cầu thuật toán điều phối Fair Queuing (fq) để hoạt động chính xác:
# Kích hoạt BBR
sudo sysctl -w net.core.default_qdisc=fq
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
Trong các tác vụ replication database liên vùng của chúng tôi, BBR đã duy trì được 90% băng thông ngay cả khi đường truyền gặp tình trạng mất gói 1-2%. Cubic chắc chắn đã sụt giảm xuống chỉ còn 10%.
3. Tối ưu Socket Options
Các API lưu lượng cao thường gặp phải tình trạng “cạn kiệt cổng tạm thời” (ephemeral port exhaustion). Điều này xảy ra khi hàng nghìn socket ở trạng thái TIME_WAIT. Hãy khắc phục điều đó và mở rộng các giới hạn.
# Tái sử dụng socket trong trạng thái TIME_WAIT cho các kết nối mới
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# Hỗ trợ lên đến 2 triệu file descriptor mở đồng thời
sudo sysctl -w fs.file-max=2097152
# Mở rộng dải cổng khả dụng
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
Ngoài ra, hãy kích hoạt TCP Fast Open. Nó cho phép bắt đầu truyền dữ liệu ngay trong quá trình bắt tay (handshake) ban đầu, tiết kiệm một vòng thời gian khứ hồi (RTT) cho khách truy cập quay lại:
sudo sysctl -w net.ipv4.tcp_fastopen=3
4. Lưu cấu hình
Đừng để công sức biến mất sau khi khởi động lại. Hãy thêm các dòng sau vào /etc/sysctl.d/99-performance.conf:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fastopen = 3
Áp dụng với sudo sysctl -p.
Xác minh kết quả
Làm sao để biết nó đang hoạt động? Hãy sử dụng ss -ti để kiểm tra các kết nối đang hoạt động.
# Kiểm tra xem BBR có đang hoạt động trên một kết nối cụ thể hay không
ss -ti
Hãy tìm thẻ bbr và giá trị wscale. Nếu wscale cao, chứng tỏ các buffer lớn hơn của bạn đang được tận dụng. Theo dõi các lần truyền lại gói tin (retransmissions) bằng netstat -s. Nếu tỷ lệ truyền lại giảm trong khi băng thông tăng lên, bạn đã thành công.
Một cảnh báo: RAM không hề miễn phí. Nếu bạn có 100.000 kết nối, mỗi kết nối sử dụng buffer 16MB, bạn sẽ sớm cạn kiệt bộ nhớ. Hãy đảm bảo server có đủ dung lượng để xử lý số lượng kết nối cao điểm nhân với các giới hạn mới này.
Lời kết
Tinh chỉnh stack là một quá trình lặp đi lặp lại. Hãy bắt đầu với giới hạn 16MB này và theo dõi độ trễ p99 của bạn. Bằng cách loại bỏ các thiết lập mặc định thận trọng, bạn sẽ không còn để lãng phí hiệu năng của phần cứng nữa. Server Linux của bạn cuối cùng đã sẵn sàng chịu tải cho lưu lượng production.

