0

NFS サーバーに接続してデータを書き込むクライアントがあります。これは、プロセスと同じ数の TCP 接続を作成するマルチプロセス アプリケーションです。問題は、1 つのプロセスを試すと、書き込み時にソケットがほとんどブロックされないことです (つまり、poll() は一時停止しません)。プロセス数を 8 以上に増やすと、約 30% の確率で、各ソケットで poll() によってブロックされることに気付きます。独立した送信/受信バッファを持つ複数の TCP ストリームを使用する目的ではないので、このようにブロックするべきではありませんか? 複数のストリームが互いに干渉しているのはなぜですか? リンクは飽和には程遠いです (iperf でテスト済み)。

これに関する私の考えでは、NFS サーバーは TCP 接続ごとにソケットを作成し、独自の受信バッファーを持つことになります。プロセスごとに個別の TCP ソケットを作成していることはわかっているため、独自の送信バッファーが必要です。リンクを飽和させていないのに、ソケットがブロックされているのはなぜですか?

4

1 に答える 1

2

ネットワークには無限の帯域幅があり、サーバーには送信するリクエストを処理する無限の容量があると想定しています。どちらの場合もそうではありません。TCP 接続の数を直線的に増やしても、パフォーマンスは直線的に向上しません。ネットワークは 1 つだけです。サーバーは 1 つだけです。非常に多くのCPUしかありません。そして、非常に多くのディスクしかありません。遅かれ早かれ、ネットワークがいっぱいになるか、サーバーが停止し、書き込みストールとして反映されます。

于 2013-05-14T23:58:28.820 に答える