2.5. CPU 上で SoftIRQ を実行できる時間の増加
SoftIRQ の実行時間が十分でない場合、受信データの速度が、バッファーを十分な速さでドレインするカーネルの能力を超える可能性があります。その結果、ネットワークインターフェイスコントローラー (NIC) のバッファーがオーバーフローし、パケットが失われます。
softirqd プロセスが 1 回の NAPI ポーリングサイクルでインターフェイスからすべてのパケットを取得できなかった場合、それは SoftIRQ に十分な CPU 時間がないことを示しています。これは、10 Gbps 以上の高速 NIC を備えたホストに当てはまる可能性があります。net.core.netdev_budget および net.core.netdev_budget_usecs カーネルパラメーターの値を増やすと、softirqd がポーリングサイクルで処理できる時間とパケット数を制御できます。
手順
net.core.netdev_budgetパラメーターのチューニングが必要かどうかを判断するには、/proc/net/softnet_statファイル内のカウンターを表示します。# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 0 20380 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ...この
awkコマンドは、/proc/net/softnet_statの値を 16 進形式から 10 進形式に変換し、表形式で表示します。各行は、コア 0 から始まる CPU コアを表します。関連する列は次のとおりです。
- 最初の列: 受信フレームの総数。
-
3 番目の列: 1 回の NAPI ポーリングサイクルでインターフェイスからすべてのパケットを取得できなかった
softirqdプロセスの回数。 - 最後の列: CPU コア番号。
/proc/net/softnet_statファイルの 3 番目の列のカウンターが、時間の経過とともに増加する場合は、システムをチューニングします。net.core.netdev_budget_usecsおよびnet.core.netdev_budgetパラメーターの現在の値を表示します。# sysctl net.core.netdev_budget_usecs net.core.netdev_budget net.core.netdev_budget_usecs = 2000 net.core.netdev_budget = 300これらの設定を使用すると、
softirqdプロセスは、1 回のポーリングサイクルで、NIC から最大 300 個のメッセージを処理するのに最大 2000 マイクロ秒あります。ポーリングは、どの条件が最初に満たされたかに基づいて終了します。次の内容を含む
/etc/sysctl.d/10-netdev_budget.confファイルを作成します。net.core.netdev_budget = 600 net.core.netdev_budget_usecs = 4000パラメーターを現在の値の 2 倍に設定します。
/etc/sysctl.d/10-netdev_budget.confファイルから設定をロードします。# sysctl -p /etc/sysctl.d/10-netdev_budget.conf
検証
/proc/net/softnet_statファイルの 3 番目の列を監視します。# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -tそれでも値が増加する場合は、
net.core.netdev_budget_usecsとnet.core.netdev_budgetをより高い値に設定します。カウンターが増加しなくなるまで、このプロセスを繰り返します。