SO_RCVBUFは、受信バッファーのサイズを設定するソケットオプションです。ソケットのバッファは、ネットワークから受信したデータを一時的に保存するために使用されます。バッファーがいっぱいになると、新しいパケットが破棄されるか、システムがバッファが部屋を作るのを待ちます。したがって、 SO_RCVBUFのサイズを適切に調整すると、データの損失や過度の閉塞を回避し、データ受信の効率を向上させることができます。
一部の高トラフィックアプリケーションでは、デフォルトのバッファサイズで多数の同時ネットワーク接続をサポートするのに十分ではない場合があり、 SO_RCVBUFを調整することが特に重要です。
Socket_set_optionは、ソケットオプションを設定するためのPHPの関数です。基本的な構文は次のとおりです。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$level</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$optname</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$optval</span></span><span> )
</span></span>
$ socket :作成されたソケットリソースを表します。
$レベル:オプションのレベルを指定します。通常はsolxocketです。
$ optName :設定するオプション名を指定し、SO_RCVBUFに対応するオプション名はso_rcvbufです。
$ optval :オプションの値を指定します。通常は整数で、バッファのサイズを示します。
Socket_set_optionを介してSO_RCVBUFを設定する方法を示す単純なPHPの例を次に示します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// aを作成します UDP ソケット</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_DGRAM, SOL_UDP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法创建ソケット: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 設定 SO_RCVBUF のために 1MB</span></span><span>
</span><span><span class="hljs-variable">$buffer_size</span></span><span> = </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span>; </span><span><span class="hljs-comment">// 1MB</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_RCVBUF, </span><span><span class="hljs-variable">$buffer_size</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法設定接收缓冲区大小: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接收缓冲区大小已設定のために: <span class="hljs-subst">{$buffer_size}</span></span></span><span> バイト\n";
}
</span><span><span class="hljs-comment">// 关闭ソケット</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
この例では、UDPソケットを作成し、受信バッファサイズを1MBに設定します。このようにして、バッファが小さすぎるため、ソケットはデータ損失なしでより多くのデータを受信できます。
バッファの機能は、受信したデータを一時的に保存することです。交通量が多すぎる場合、バッファーが小さすぎる場合、受信したデータはバッファーの処理能力を超えてパケット損失をもたらします。バッファーのサイズを増やすことで、データ受容効率を改善し、パケットの損失と詰まりを減らすことができます。
さらに、高い並行性シナリオでは、バッファサイズを調整すると、各接続にバッファーを割り当てるオペレーティングシステムのオーバーヘッドを減らし、I/O操作の頻度を減らし、全体的なパフォーマンスが向上するのに役立ちます。
SO_RCVBUFのサイズは、大きすぎるバッファーがメモリ無駄につながる可能性があるため、良くありません。バッファサイズは、特定のアプリケーション要件に従って合理的に設定する必要があります。一般的に言えば、次の要因に従って調整することをお勧めします。
ネットワーク帯域幅:ネットワーク帯域幅が高い場合、より多くのトラフィックに対応するためにバッファサイズを適切に増やすことができます。
パケットサイズ:各パケットのサイズが大きい場合、受信バッファーのサイズを適切に増やすことができます。
システムメモリの制限:過剰なバッファーは、メモリリソースが多すぎて、システム内の他のプロセスの動作に影響を与える可能性があります。バッファサイズが手頃な価格のシステムメモリ内にあることを確認する必要があります。
チューニングするときは、実験および監視ツールを使用してバッファサイズを徐々に調整して、最適な構成を見つけることができます。
実際のアプリケーションでは、 SO_RCVBUFは主に次のシナリオで使用されます。
トラフィックの高いアプリケーション(リアルタイムビデオストリーミング、データ収集システム、ログ収集など)の場合、データ受信速度は非常に高いことがよくあります。この場合、バッファサイズの合理的な調整により、ネットワークの条件が貧弱なときに大量のデータを受信できるようにすることができ、それを失うのは簡単ではありません。
ネットワークが不安定または帯域幅が大きく変動する環境では、受信バッファーサイズを適切に増やすと、システムが不安定なネットワーク条件により適応するのに役立ち、それによりデータ損失の可能性が低下します。
高い並行性サーバーでは、各クライアントは大量のデータを要求し、多数の接続があります。受信バッファサイズを増やすと、各接続のスループットが効果的に増加し、完全なバッファーによるデータの損失と遅延を回避できます。
システム制限:異なるオペレーティングシステムには、受信バッファーの最大値に制限があります。オペレーティングシステムのデフォルトの制限は、 SYSCTLまたはその他のシステムコマンドを介して表示および調整できます。
パフォーマンステスト:生産環境に展開する前に、パフォーマンステストを実行して、バッファサイズのセットが予想されるパフォーマンスの改善につながるようにしてください。
メモリの使用量:過度のバッファーにより、より多くのメモリリソースが消費されます。マルチ接続環境では、メモリフットプリントが非常に大きくなる可能性があるため、システムのメモリ状況に基づいて合理的に設定する必要があります。