Red Hat Training

A Red Hat training course is available for RHEL 8

31.2. パケット受信でのボトルネック

ネットワークスタックは大幅に自己最適化されていますが、ネットワークパケットの処理中にはボトルネックとなり、パフォーマンスが低下する可能性のあるポイントが多数あります。

ボトルネックの原因となる可能性のある問題を以下に示します。

ネットワークカードのバッファーまたはリングバッファー
ハードウェアバッファーは、カーネルが多数のパケットをドロップするとボトルネックとなる可能性があります。ethtool ユーティリティーを使用して、削除されたパケットについてシステムを監視します。
ハードウェアまたはソフトウェアの割り込みキュー
割り込みにより、レイテンシーやプロセッサーの競合が増大する可能性があります。プロセッサが割り込みを処理する方法については、「割り込み要求の概要」、「割り込みを手動でバランスさせる」、「smp_affinityマスクの設定」を参照してください。
アプリケーションのソケット受信キュー
コピーされたものでない多数のパケット、または /proc/net/snmp ファイルの UDP 入力エラー (InErrors) で増大した多数のパケットは、アプリケーションの受信キューにおいてボトルネックを示します。

ハードウェアバッファーが多数のパケットを破棄する場合、次のようないくつかの解決策があります。

入力トラフィックの速度が遅い
受信トラフィックを絞り込み、結合したマルチキャストグループの数を減らしたり、ブロードキャストトラフィックの量を減らしてキューが埋める速度を減らします。
ハードウェアバッファーキューのサイズ

ハードウェアバッファーキューのサイズ調整: 簡単にオーバーフローしないようにキューのサイズを増やしてドロップされるパケット数を増やします。ethtool コマンドを使用して、ネットワークデバイスの rx/tx パラメーターを変更できます。

ethtool --set-ring device-name value

キューのドレイン (解放) レートの変更
  • キューに到達する前にパケットをフィルターまたは破棄したり、デバイスのウェイトを下げたりすることで、キューがいっぱいになる速度を低減します。受信トラフィックをフィルタリングしたり、ネットワークインターフェースカードのデバイスウェイトを下げると、着信トラフィックの速度を低下させます。

    デバイスのウェイトとは、1 回スケジュールされているプロセッサーアクセスでデバイスが一度に受信できるパケット数を指します。キューをドレイン (解放) する速度は、dev_weight カーネル設定で制御するデバイスのウェイトを増加できます。このパラメーターを一時的に変更するには、/proc/sys/net/core/dev_weight ファイルの内容を変更するか、または永続的に変更する場合は、procps-ng パッケージが提供する sysctl コマンドを使用します。

  • アプリケーションのソケットキューの長さを増やします。これは通常、ソケットキューのドレイン率を改善する最も簡単な方法ですが、長期のソリューションとしては適していません。ソケットキューがバーストで制限されたトラフィック量を受信した場合は、ソケットキューの深さをトラフィックのバーストサイズに一致するように増やすと、パケットがドロップされるのを防ぐことができます。キューの深さを増やすには、以下の変更のいずれかを行ってソケット受信バッファーのサイズを増やします。

    • /proc/sys/net/core/rmem_default パラメーターの値を増やします。このパラメーターは、ソケットによって使用される受信バッファーのデフォルトサイズを制御します。この値は、proc/sys/net/core/rmem_max パラメーターの値以下である必要があります。
    • setsockopt を使用して、より高い SO_RCVBUF 値を設定します。このパラメーターは、ソケットの受信バッファーの最大サイズをバイト単位で制御します。getsockopt システムコールを使用して、バッファーの現在の値を判断します。

キューのドレインレートの変更は、通常、ネットワークのパフォーマンス低下を軽減する最も簡単な方法です。ただし、デバイスが一度に受信できるパケット数を増やすと、追加のプロセッサー時間が使用され、他のプロセスがスケジュールできません。そのため、パフォーマンス上の問題が発生する可能性があります。

関連情報

  • ss(8)、socket(7)、ethtool(8) man ページ。
  • /proc/net/snmp ファイル