SolarisのネットワークスタックってSMPに強いのん?

SolarisのネットワークスタックはSMPに強い」という噂を聞いていたので、取り敢えずどんな感じなのか資料を斜め読みしてみた。
Solarisとか全ッ然知らないので、間違ってたらツッコミ下さい。

資料:
Oracle and Sun Microsystems | Strategic Acquisitions | Oracle
OpenSolaris 最新動向とプロジェクト Crossbow の威力

  • 1990年代後半以降、サーバーは、多数の CPU を実行する SMP ベースになった
  • ミッドエンドマシンからハイエンドマシンが NUMA 主体となったため、CPU の切り替え処理のコストが高くなった
  • 従来のSolarisTCP/IPスタックの問題点
    • 設計上 CPU と密接に関係していないため、特定の接続のパケットがさまざまな CPU の間を移動してしまう
    • マルチスレッドには対応しているが、グローバルなデータがレイヤ毎に色々とあってそれぞれmutexで保護されている 、並列アクセスしてブロックされる可能性がある
    • 各レイヤでバラバラなコンテキストで処理が行われ、何度もキューイングが行われるので、結果コンテクスト切り替えが頻繁に行われ、一つのパケットの処理がレイヤ毎に別のCPUで行われる事があり、局所性が低い

ので、Solaris 10で「FireEngine」という新しいTCP/IPスタックを導入した、と。
これの特徴は、

  • 全てのプロトコルレイヤを、完全にマルチスレッド化された一つのモジュールにマージ
  • データ構造単位のロックでなく「垂直境界」と呼ばれるCPU単位の同期メカニズムを使用→「squeue」を使用して実装
  • 一つのCPUが一つのsqueueを持ち、各接続インスタンスは特定のsqueueに割り当てられる→局所性が上がる

という感じ。

  • CPUがNICより高速なモード(デフォルト)
    • インバウンド:割り込みを受けたCPUのsqueueで処理
    • アウトバウンド:アプリケーションを実行しているCPUのsqueueで処理
  • NICがCPUより高速なモード
    • 1つのCPUでNICを処理出来ないので、接続は利用可能なsqueue(=CPU)にランダムに割り当てられる
  • Crossbow
    • なんかすごい。ネットワーク全体を仮想化出来る。MP性能の話とも関係はあるけど、ちょっと本筋から外れてるのでスキップ
  • ハードウェアレーン
    • リソースを「ハードウェアレーン」としてまとめてリニアなスケーラビリティを実現→上のsqueueをCPUに貼り付ける話?
    • 動的ポーリング→後述
    • パケットチェイニング→詳細ドコー?
  • 動的ポーリング
    • GLDv3ドライバで送受信リングを動的にポーリング(低負荷時には割り込みを用い、高負荷時にポーリング)
    • GLDv3ドライバによる動的ポーリングの効果
      • 従来のドライバに対して85%少ないコンテキストスイッチ
      • 従来のドライバに対して85%少ないスピンmutex
      • 従来のドライバに対して15%idle時間が増加
    • スループット
      • TCP通信で高負加時にLinuxに対し2割程度の性能アドバンテージ
    • 遅延
      • 高負荷時、低負荷時共にLinuxに対し1〜2割程度の性能アドバンテージ

と、ぼんやり分かったような気がした。気がしただけかもしれない。

追記:
Solaris分かりませんって前置きに書いておいたら、藤枝先生が予想通り釣れましたからコメントを頂きました。
じゃあ、Linuxのネットワークスタックはどうなのん? - かーねる・う゛いえむにっき
Linuxの記事に書いた、最近入ったばかりのRPS,RFSと同じような改善がSolarisでもなされているようです。
じゃあ、Linuxのネットワークスタックはどうなのん? - かーねる・う゛いえむにっき