8.4.2. ソケットキュー

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


[6] Device weight は /proc/sys/net/core/dev_weight で制御されます。device weight についての詳細情報とその調節による影響は、「NIC ハードウェアバッファー」 を参照してください。