Linuxネットワーク性能パラメータ
(github.com/leandromoreira)- Linuxのネットワークフローの中でよく使われる sysctl/network パラメータ がどこに位置するのかを示す短いチュートリアル
- あらゆる状況で高スループットと低レイテンシを同時に提供する cargo cult 値 は現実的ではなく、最新のカーネルバージョンではデフォルト値が適切に調整されており、デフォルト値の変更が性能を損なう可能性がある
- 受信経路は、NICのMAC/FCS確認、DMA、受信 ring buffer、hard IRQ、NAPI、soft IRQ、ingress qdisc、netfilter、TCP状態マシン、
tcp_rmemベースの受信バッファ、アプリケーションの読み取りまでの流れとして整理されている - 送信経路は、アプリケーション
sendmsg、skb_buffの割り当て、tcp_wmemベースのソケット書き込みバッファ、TCP/IPヘッダ処理、netfilter、txqueuelenベースの output qdisc、transmit ring buffer、DMA、NIC送信完了IRQまでの流れとして整理されている - 主要な調整項目は、バースト処理、CPU使用率、レイテンシ、ドロップの観察と結び付いている
rx,txring buffer は、接続バーストをドロップなしで受けるためのキューであり、増やすとレイテンシが増える可能性があるrx-usecs,tx-usecs,rx-frames,tx-framesは、hard IRQ発生前の待機時間・フレーム数であり、CPU使用率とhard IRQを減らし、レイテンシを代償にスループットを高められるnetdev_budget_usecs,netdev_budget,dev_weight,netdev_max_backlogは、NAPI polling cycle と ingress qdisc の処理量に関連するtxqueuelenとdefault_qdiscは、OUTPUT側のキューとデフォルトの queuing discipline に関連する
- 確認・変更・監視は
ethtool,sysctl,ip,tc,/procファイルを中心に構成されている- 例: ring buffer の確認
ethtool -g ethX、変更ethtool -G ethX rx value tx value - 例:
net.core.netdev_budget_usecsの確認sysctl net.core.netdev_budget_usecs、変更sysctl -w net.core.netdev_budget_usecs value - 例:
default_qdiscの確認sysctl net.core.default_qdisc、監視tc -s qdisc ls dev ethX
- 例: ring buffer の確認
- TCPバッファ項目では
tcp_rmem,tcp_wmem,tcp_moderate_rcvbufを扱い、tcp_moderate_rcvbufが設定されているとTCPが受信バッファサイズを自動調整しようと試みる - TCP状態と輻輳制御に関する項目として
net.core.somaxconn,tcp_fin_timeout,tcp_available_congestion_control,tcp_congestion_control,tcp_max_syn_backlog,tcp_syncookies,tcp_slow_start_after_idleもあわせて整理されている - Linux内部のネットワーク追跡は perf で確認でき、例のコマンドは
perf trace --no-syscalls --event 'net:*' ping globo.com -c1 > /dev/null形式 - テストと監視ツールとして iperf3, vegeta, netdata, prometheus + grafana + node exporter full dashboard の組み合わせを提示している
1件のコメント
Hacker Newsのコメント
Ubuntu Linuxのデフォルトでは net.ipv4.tcp_rmem が約6MB、net.core.rmem_max が約1MBなので、奇妙な状況が起きる
デフォルトのTCPソケットは必要に応じてTCP受信ウィンドウが6MBまで上がるが、ユーザー空間アプリが
setsockopt SO_RCVBUFを呼ぶと、すでに6MBが可能だったソケットも最大1MBに制限される6MBから4MBに減らそうとしても結果が1MBになる、といった具合で非常に奇妙に見え、
SO_SNDBUF/wmemにも同じことが当てはまるLinuxがこれらのオプションの優先順位を混同しているように見えるが、なぜ
core.rmem_maxをもっと大きくして権威ある指示値として扱わないのか、歴史的な理由があるのか気になるSO_SNDBUF/wmemの代わりに TCP_NOTSENT_LOWAT を下げられるこの値は帯域幅遅延積(BDP)に必要な量を超えて追加でバッファリングされる量を制限する
SO_RCVBUFを設定した瞬間、そのソケットでは自動チューニングが外れ、net.core.rmem_maxが最大値になるDocumentation/networking/ip-sysctl.rstにかなり明確に文書化されているパケットが NIC に入ってからユーザー空間に到達するまでの全段階を示している点まで含めて素晴らしい
ネットワーク性能に関連してもう一つ付け加えるなら、複数CPUがあるシステムでは、大型サーバーで一般的な NUMA割り当て を確認すべき
ネットワークカードが片方のCPU側にあり、アプリケーションが別のCPUで動いていると、性能にも影響し得る
ネットワークの送受信を本当に学びたいなら読む価値がある記事群だ
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://blog.packagecloud.io/monitoring-tuning-linux-network...
https://packagecloud.io/blog/illustrated-guide-monitoring-tu...
Linuxのデフォルト輻輳制御である
net.ipv4.tcp_congestion_controlを bbr に変えるだけでも、状況によっては非常に大きな差が出るおそらく距離、断続的なパケットロスとジッター、カプセル化がある場合に特にそうらしい
この1年ほど、
client host <-- HTTP --> reverse proxy host <-- HTTP over Wireguard --> service hostという流れの問題をデバッグしていたが、平均すると理論上の最大スループットの20%を超えるのが難しく、接続も時間がたつとほとんど止まったように遅くなった接続を頻繁に強制的に閉じるという応急処置をしていたが、輻輳制御を
bbrに変えると理論上の最大に近いスループットと安定した接続が得られ、この変更はWireguardの両側に必要だったほとんどのTCPスタックは最初に損失が見えると送信ウィンドウを半分にするか大きく下げるため、損失のあるVPNだったり、10Mb/sのVPNアップリンクに1Gb/sで大きなバーストを送ったりすると、TCPは損失を見て大きく後退する
BBRはボトルネック帯域幅を見つけようとし、往復時間を測定してRTTが増加するまで送信レートを上げる
RTTが増加すると、経路で最も狭い区間にキューがたまっていると仮定し、キューがはけてRTTが正常化するまで送信レートを下げ、その速度でしばらく送った後、また少し上げてみる
数年前、10Mb/sのケーブル上り回線から1Gb/s対称の光回線に替えたのに会社VPNへのアップロードが5Mb/s程度にとどまって苛立っていたが、FreeBSDで RACK TCP またはBBRに変えると、VPNの上限である約40Mb/sまで約8倍に上がった
魔法のような値を1つ設定すれば良くなる、というコピペ式カーゴカルトな性能チューニングは、原文が言おうとしていることと正反対である
幸いGoogleがBBRv3をアップストリームしているので、近いうちに改善するはずだ
一方向の性能だけを改善したいのであれば、Wireguardの両側を両方とも変える必要はない
BBRv1については他のコメントに同意するし、Linuxカーネルの cubic実装 はほとんどのアプリケーションでかなりうまく動作する
Wi-Fiアダプターにも性能チューニングが意味を持つのか気になる
デスクトップでは、機能をオフにする以外に i210 と i225 のイーサネット問題を直す方法があるのかも気になる
最近いちばん一般的な NIC はこの2つのように思えるのに、一般的なネットワークハードウェアとドライバーがなぜここまで欠陥だらけなのかよく分からない
RISC-V には大いに関心があるが、完全に公開された正しい NIC から始めてみてはどうかと思う
i210 より安ければ最終的には採用されるだろうが、もしかすると不可能なことかもしれない
ただし Wi-Fi ではランダムな ping の急増は依然として発生する
https://forum.openwrt.org/t/aql-and-the-ath10k-is-lovely/590... には、AQM の有効化とチューニング、スループットとレイテンシのトレードオフを扱う大きなスレッドがある
同時代の CPU にとって 1Gb はさほど難しい水準でもなく、i210 はキューを4つ提供する
i210 の何が不満なのか気になる
図で整理された Linux ネットワークキューの概要がすばらしく、どこか壁に貼っておきたいほどだ
Brendan の『Systems Performance』も Linux ネットワーク性能などをよく扱っており、すでに第2版まで出ている
どちらの版も優れているが、第2版は主に Linux に集中し、第1版は Solaris も含んでいる
より最近では、同じ著者による『BPF Performance Tools』もある
[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
記事をざっと読むだけでも楽しく、調査と構成がとても良かった
ただ、Linux ネットワークパラメーターを定期的にチューニングしている人が実際には誰なのか気になる
この文書はどこかに TCP だと明記すべきだと思う
内容は TCP 関連の関心事に非常に集中しており、人々は主に TCP を使うので有用ではある
しかしデフォルトの UDP チューニング値はひどく低いのに、その部分が目立って抜けている
似た内容を扱う動画やシリーズをおすすめしてほしい
一般的なネットワーキング資料は多いが、Linux の具体的な実装を扱う資料は見つけにくかった
簡単な TCP エコーサーバーをマイクロコントローラー向けに作ってみたいが、ほとんどの例はベンダー独自の TCP ライブラリを使うだけで、ルーターに直接接続を設定して確立する過程をほとんど説明していない