8.4.2. ソケットキュー
NIC ハードウェアキューのように、ソケットキューは
softirq
コンテキストからのネットワークスタックで満たされます。するとアプリケーションは read
や recvfrom
などのコールで対応するソケットのキューを排出します。
このキューのステータスを監視するには、
netstat
ユーティリティを使います。Recv-Q
コラムはキューのサイズを表示します。一般的に、ソケットキューのオーバーランは NIC ハードウェアバッファーのオーバーランと同じ方法で管理されます (「NIC ハードウェアバッファー」 を参照)。
- 入力トラフィック
- 最初のオプションは、キューを満たす割合を設定することで入力トラフィックを遅らせます。これを行うには、フレームにフィルターをかけるか、前もってドロップさせます。NIC の device weight を下げることでも入力トラフィックを遅らせることができます [6]。
- キューの深さ
- キューの深さを高めることでも、ソケットキューのオーバーランを防ぐことができます。これを行うには、
rmem_default
カーネルパラメーターかSO_RCVBUF
ソケットオプションのどちらかの値を増やします。これら両方に関する詳細は 「ネットワーク設定の最適化」 を参照してください。 - アプリケーション呼び出しの頻度
- 可能な場合はいつでも、アプリケーションを最適化して呼び出し頻度を高めます。これは、ネットワークアプリケーションを修正または再構成して、POSIX 呼び出し (
recv
やread
など) の実行頻度を高くすることで行います。こうすることで、アプリケーションによるキューの排出が速くなります。
管理者の多くにとっては、キューの深さを高めることは望ましい解決法です。これは最も簡単な解決法ですが、常に長期的に機能するとは限りません。ネットワーキング技術の速度が高まるにつれて、ソケットキューが満たされる時間は短くなり続けます。長期的には、これに対応してキューの深さを再度調整することを意味します。
最良の解決法は、アプリケーションを強化または設定してカーネルからのデータの排出を速めることです。たとえアプリケーションスペースにデータを加えることになったとしてもです。こうすることで、データを必要に応じてスワップしたりページバックしたりすることができるようになるので、データの保存がより柔軟になります。
[6]
Device weight は
/proc/sys/net/core/dev_weight
で制御されます。device weight についての詳細情報とその調節による影響は、「NIC ハードウェアバッファー」 を参照してください。