質問: サーバーで沢山のコネクションを受け付ける場合に、スレッドや非同期で処理すると思います。 その際にソケットで単純にRecv()してSend()していますが、ネットワークカードに対して効率の良い書き込みや読み込みの作法はあるのでしょうか? たとえばスレッドでソケットに大量に書き込んでも、けっきょくネットワークカードからビット情報を通信媒体へ転送する処理がシリアルに処理されているとしたらスレッドをある数以上立てて書き込んでもあまり意味がない(むしろよくない)、などの指標はありますか? もちろんデバイスとソケットの間にバッファが存在するので、非同期で書けるだけ書いておいて、プログラムは次の処理をすればいいという考えもあると思います。 TCPスロースタート問題や遅延ACKなどのレイヤの話は一旦棚に上げて、単純にソケット書き込みとその先のデバイスの間の話の議論になります。 ネットワークのデバイスレベルの仕組みに詳しい方がいましたら教えていただけると助かります。 参考までに、今回の質問は下記のサイトのNICの物理層を見ていてなんとなく浮かんだ質問です。 PCS(Physical Coding Sublayer) PMA(Physical Medium Attachment) PMD(Physical Medium Dependent)
回答: 低レイヤでの操作の話が出ていますが、それとは逆の話を。 最近のネットワークカードはオフロード処理に対応しています。IPヘッダのチェックサムだけでなく、TCPのセグメント化までしてくれるものも普及しています。 ですので、あまり低レイヤのことは意識せず、ユーザーランドからは可能な限り書き込んでおいて、OS及びNICに任せるのもひとつの手かと思います。 他に出てきていない話題として、Windows SocketのWSASend()はscatter/gather I/Oだけでなく、Overlapped I/Oもサポートします。これは先行するI/Oの完了を待つことなく次のI/Oを発行することができます。