ハードウェアに処理を委託する以外にも、ソフトウェアを変更することでギガビットネットワーク通信の高速化が実施されている。TCP入出力処理の基本的な流れで示したように、TCP受信処理はithread、netisr thread、user/kernel threadで処理される。ここでひとつ問題がある。netisr threadは並列化に問題があるため、並列度を上げる場合のネックになっている。

netisr threadでおこなっていた処理もithreadで実行するようにダイレクトリディスパッチを実装

FreeBSD 7ではこの並列性の問題を回避するため、新たにダイレクトディスパッチという機能が取り込まれた。これは従来はithreadからnetisr threadに処理を移行させていた部分を、すべてithreadで処理するようにしたものだ。ithreadは並列に処理できるため、それだけ高速化が望める。

マルチプロセッサネットワークスタック

FreeBSDは3でSMPの初期サポートを実現し、FreeBSD 5でGiantロックを排除するように実装方針を変更、6と7でロックの必要性を削減するとともに性能が発揮できるようにロック方式の変更を実施してきた。

より成熟したオブジェクトライフサイクルの実現と優れたキャッシュおよびコンテンションの削減を目的としてUMA (Universal Memory Allocator, Zone allocator)実装が導入された点も注目しておきたい。ゾーンアロケータ自身はFreeBSD 3で導入されていたが、スラブアロケータとして機能するためにFreeBSD 5で大幅な実装変更が実施された。

ゾーンアロケータをスラブアロケータとして動作するようにしてより優れたアロケートを実現

FreeBSD 7ではSMPの取り組みをネットワークスタックに対しても適用する試みが進められ、データ構造の変更や最適化が実施された。またネットワークデバイスドライバからGiantロックを排除するように改善され、現在の実装ではデバイスドライバにはGiantロックは存在していない。

mutexからread/writeロック、read-mostlyロックへの変更

ロック実装の変更もネットワーク処理に大きな影響を与えている。従来はmutexによる排他的ロックが使われていたが、現在ではread/writeロックへと変更されている。FreeBSD 7.1ではread/writeロックが最適化されており処理がさらに向上する見通しだ。

FreeBSD 8では新しいプリミティブとして読み込みの同期に最適化されたread-mostlyロックが導入され、アトミックな命令が要求されない場合の読み込み処理に活用される見通しだ。この場合書き込みはIPIを使ってCPUを同期することになる。

ちなみにFreeBSD 7.1ではUDP受信とソケット/プロトコルレイヤにおけるトランスミットが完全に並列処理可能になる。ソケットオーバーヘッドの削減も実施されており通信速度の向上が期待される。