Các tham số hiệu năng mạng Linux
(github.com/leandromoreira)- Một tutorial ngắn cho thấy các tham số sysctl/network thường dùng nằm ở đâu trong luồng mạng của Linux
- Không thực tế khi kỳ vọng các giá trị cargo cult luôn mang lại cả thông lượng cao lẫn độ trễ thấp trong mọi tình huống; các phiên bản kernel mới đã có giá trị mặc định được tinh chỉnh tốt, và việc thay đổi mặc định có thể làm giảm hiệu năng
- Đường nhận được tóm tắt theo luồng: NIC kiểm tra MAC/FCS, DMA, receive ring buffer, hard IRQ, NAPI, soft IRQ, ingress qdisc, netfilter, máy trạng thái TCP, bộ đệm nhận dựa trên
tcp_rmem, cho đến khi ứng dụng đọc dữ liệu - Đường gửi được tóm tắt theo luồng: ứng dụng gọi
sendmsg, cấp phátskb_buff, bộ đệm ghi socket dựa trêntcp_wmem, xử lý header TCP/IP, netfilter, output qdisc dựa trêntxqueuelen, transmit ring buffer, DMA, đến IRQ hoàn tất truyền của NIC - Các hạng mục tinh chỉnh cốt lõi liên quan đến xử lý burst, mức dùng CPU, độ trễ và quan sát drop
rx,txring buffer là hàng đợi để nhận các burst kết nối mà không bị drop; khi tăng lên, độ trễ có thể tăngrx-usecs,tx-usecs,rx-frames,tx-frameslà thời gian chờ và số frame trước khi phát sinh hard IRQ; có thể giảm mức dùng CPU và hard IRQ, đồng thời tăng thông lượng với cái giá là độ trễnetdev_budget_usecs,netdev_budget,dev_weight,netdev_max_backlogliên quan đến NAPI polling cycle và thông lượng xử lý của ingress qdisctxqueuelenvàdefault_qdiscliên quan đến hàng đợi phía OUTPUT và queuing discipline mặc định
- Việc kiểm tra, thay đổi và giám sát chủ yếu được thực hiện bằng
ethtool,sysctl,ip,tcvà các tệp trong/proc- Ví dụ: kiểm tra ring buffer bằng
ethtool -g ethX, thay đổi bằngethtool -G ethX rx value tx value - Ví dụ: kiểm tra
net.core.netdev_budget_usecsbằngsysctl net.core.netdev_budget_usecs, thay đổi bằngsysctl -w net.core.netdev_budget_usecs value - Ví dụ: kiểm tra
default_qdiscbằngsysctl net.core.default_qdisc, giám sát bằngtc -s qdisc ls dev ethX
- Ví dụ: kiểm tra ring buffer bằng
- Các mục bộ đệm TCP gồm
tcp_rmem,tcp_wmem,tcp_moderate_rcvbuf; khitcp_moderate_rcvbufđược bật, TCP sẽ cố gắng tự động điều chỉnh kích thước bộ đệm nhận - Các mục liên quan đến trạng thái TCP và điều khiển tắc nghẽn được tổng hợp cùng nhau gồm
net.core.somaxconn,tcp_fin_timeout,tcp_available_congestion_control,tcp_congestion_control,tcp_max_syn_backlog,tcp_syncookies,tcp_slow_start_after_idle - Có thể kiểm tra tracing mạng nội bộ của Linux bằng perf; lệnh ví dụ có dạng
perf trace --no-syscalls --event 'net:*' ping globo.com -c1 > /dev/null - Các công cụ kiểm thử và giám sát được đề xuất gồm iperf3, vegeta, netdata, và bộ kết hợp prometheus + grafana + node exporter full dashboard
1 bình luận
Ý kiến trên Hacker News
Trên cấu hình mặc định của Ubuntu Linux, net.ipv4.tcp_rmem khoảng 6MB, còn net.core.rmem_max khoảng 1MB, tạo ra một tình huống kỳ lạ
Socket TCP mặc định có thể tăng cửa sổ nhận TCP lên đến 6MB khi cần, nhưng nếu ứng dụng ở user space gọi
setsockopt SO_RCVBUFthì ngay cả socket vốn đã có thể dùng 6MB cũng bị giới hạn tối đa 1MBNgay cả khi muốn giảm từ 6MB xuống 4MB thì kết quả lại thành 1MB, trông rất kỳ quặc; điều tương tự cũng áp dụng cho
SO_SNDBUF/wmemCó vẻ Linux đang lẫn lộn thứ tự ưu tiên của các tùy chọn này, nên tôi thắc mắc vì sao không đặt
core.rmem_maxlớn hơn và coi nó là chỉ thị có thẩm quyền, hay có lý do lịch sử nào khôngSO_SNDBUF/wmemGiá trị này giới hạn lượng dữ liệu được buffer thêm ngoài mức cần thiết cho tích băng thông-độ trễ (BDP)
Ngay khi đặt
SO_RCVBUF, cơ chế tự động tinh chỉnh sẽ bị tắt cho socket đó, vànet.core.rmem_maxtrở thành giá trị tối đaĐiều này được ghi khá rõ trong
Documentation/networking/ip-sysctl.rstBài này rất hay, kể cả ở chỗ cho thấy mọi bước từ khi gói tin đi vào NIC cho đến khi tới user space
Nói thêm một điều về hiệu năng mạng: nếu hệ thống có nhiều CPU, nên kiểm tra phân bổ NUMA, vốn rất phổ biến trên các máy chủ lớn
Nếu card mạng nằm ở phía một CPU còn ứng dụng chạy trên CPU khác, hiệu năng cũng có thể bị ảnh hưởng
Nếu thực sự muốn học về gửi/nhận dữ liệu mạng thì đây là những bài đáng đọc
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://packagecloud.io/blog/illustrated-guide-monitoring-tu...
Chỉ cần đổi cơ chế kiểm soát nghẽn mặc định của Linux,
net.ipv4.tcp_congestion_control, sang bbr cũng có thể tạo ra khác biệt rất lớn trong một số tình huốngCó lẽ đặc biệt đúng khi có khoảng cách xa, mất gói không liên tục, jitter và đóng gói/encapsulation
Trong năm qua tôi đã debug sự cố với luồng
client host <-- HTTP --> reverse proxy host <-- HTTP over Wireguard --> service host; trung bình rất khó vượt quá 20% thông lượng tối đa theo lý thuyết, và kết nối cũng chậm dần theo thời gian đến mức gần như dừng hẳnSau khi dùng giải pháp tạm là thường xuyên buộc đóng kết nối, tôi đổi kiểm soát nghẽn sang
bbrthì đạt thông lượng gần mức tối đa lý thuyết và kết nối ổn định; thay đổi này cần áp dụng ở cả hai phía WireguardPhần lớn TCP stack khi thấy mất gói lần đầu sẽ giảm một nửa cửa sổ gửi hoặc hạ xuống rất nhiều; vì vậy nếu là VPN có mất gói, hoặc gửi burst lớn ở 1Gb/s vào uplink VPN 10Mb/s, TCP sẽ thấy mất gói và lùi lại mạnh
BBR cố tìm băng thông nút cổ chai, đo thời gian khứ hồi và tăng tốc độ gửi cho đến khi RTT tăng
Khi RTT tăng, nó giả định hàng đợi đang tích tụ ở đoạn hẹp nhất trên đường đi, rồi giảm tốc độ gửi cho đến khi hàng đợi thoát bớt và RTT trở lại bình thường; sau đó gửi ở tốc độ đó một thời gian rồi lại thử tăng nhẹ
Vài năm trước, dù tôi đã chuyển từ uplink cáp 10Mb/s sang đường quang đối xứng 1Gb/s, tốc độ upload qua VPN công ty vẫn chỉ quanh 5Mb/s, rất bực; khi đổi sang RACK TCP hoặc BBR trên FreeBSD, tốc độ tăng khoảng 8 lần lên đến giới hạn của VPN, khoảng 40Mb/s
Kiểu tinh chỉnh hiệu năng “sùng bái hàng hóa” bằng cách copy-paste một giá trị ma thuật rồi nghĩ mọi thứ sẽ tốt hơn là điều hoàn toàn trái ngược với ý mà bài gốc muốn nói
May là Google đang upstream BBRv3, nên tình hình sẽ sớm tốt hơn
Nếu chỉ muốn cải thiện hiệu năng theo một chiều thì không cần đổi cả hai phía Wireguard
Về BBRv1 thì tôi đồng ý với các ý kiến khác, còn triển khai cubic trong kernel Linux hoạt động khá tốt với hầu hết ứng dụng
Tò mò liệu việc tinh chỉnh hiệu năng cũng có ý nghĩa với adapter Wi‑Fi hay không
Trên desktop, ngoài việc tắt tính năng ra thì cũng tò mò liệu có cách nào khắc phục các vấn đề Ethernet của i210 và i225 không
Có vẻ đây là hai NIC phổ biến nhất hiện nay, nhưng không hiểu vì sao phần cứng mạng và driver phổ biến lại nhiều lỗi đến vậy
Mình rất quan tâm đến RISC‑V, và tự hỏi liệu có nên bắt đầu từ một NIC hoàn toàn mở và đúng đắn không
Nếu rẻ hơn i210 thì cuối cùng người ta sẽ đưa vào, nhưng có lẽ đó cũng có thể là điều bất khả thi
Tuy nhiên trên Wi‑Fi vẫn xảy ra các đợt tăng vọt ping ngẫu nhiên
Có một thread lớn tại https://forum.openwrt.org/t/aql-and-the-ath10k-is-lovely/590... bàn về việc bật và tinh chỉnh AQM, cũng như sự đánh đổi giữa thông lượng và độ trễ
1Gb trên CPU cùng thời cũng không phải mức gì quá khó, và i210 cung cấp 4 queue
Tò mò không biết bạn không hài lòng điểm gì ở i210
Phần tổng quan hàng đợi mạng Linux được trình bày bằng hình quá xuất sắc, đến mức muốn in ra dán lên tường ở đâu đó
Cuốn Systems Performance của Brendan cũng trình bày tốt về hiệu năng mạng Linux, và đã có đến bản thứ 2
Cả hai bản đều rất hay, nhưng bản 2 chủ yếu tập trung vào Linux, còn bản 1 có cả Solaris
Gần đây hơn còn có cuốn BPF Performance Tools của cùng tác giả
[1] Systems Performance: Enterprise and the Cloud, 2nd Edition (2020)
https://www.brendangregg.com/systems-performance-2nd-edition...
[2] BPF Performance Tools:
https://www.brendangregg.com/bpf-performance-tools-book.html
Chỉ lướt qua bài viết thôi cũng đã thấy thú vị; phần nghiên cứu và cấu trúc rất tốt
Tuy vậy, tò mò không biết trong thực tế ai là người thường xuyên tinh chỉnh các tham số mạng Linux
Tài liệu này có lẽ nên ghi rõ ở đâu đó là TCP
Nội dung tập trung rất nhiều vào các mối quan tâm liên quan đến TCP, và vì mọi người chủ yếu dùng TCP nên đúng là hữu ích
Nhưng các giá trị tinh chỉnh mặc định của UDP thì tệ đến mức thấp, mà phần đó lại bị bỏ sót khá rõ
Muốn được gợi ý video hoặc series nói về nội dung tương tự
Tài liệu mạng nói chung thì nhiều, nhưng rất khó tìm tài liệu đi vào triển khai cụ thể của Linux
Muốn thử làm một TCP echo server đơn giản cho vi điều khiển, nhưng hầu hết ví dụ chỉ dùng thư viện TCP riêng của vendor và gần như không giải thích quá trình trực tiếp thiết lập cũng như xác lập kết nối với router