TinyAoE

sophisticatedなI/O戦略と普通のプログラムの差を見るためにちょっとしたAoE targetを書いてみた。電車内で。

今の所ディスクイメージファイルを書き戻さないので、実際の環境で使おうとかは間違っても考えないこと。今はCで書いてあるけど、これくらいのコードならskymoshで同等のパフォーマンスが出るようになるはず。
Gigabit Ethernetで直結したノード同士で、30MB/s程度の(キャッシュ)アクセスパフォーマンスが出る。

  • 見ての通り、winaoeのような単純なターゲットでの実行さえ出来ればいいのなら、AoEは500行程度のコードで実装できる。
    • これ以上の部分はあまりパフォーマンスに影響しない。少なくとも僕は残りの部分はSchemeで書きたい。
  • ディスクI/Oにはmmapを使っている。つまり、ブロックデバイスmmapして単にmemcpyでアクセスしている。
  • ネットワークにはpcapを使っている。
    • pcapは生のEthernetパケットを取り扱う方法としては移植性のわりにパフォーマンスが高い。適切な設定でインストールしていれば、キャプチャにはOSの機能を活用する。
    • pcapには自ノードのMACアドレスを取得するための積極的なAPIが無い。そのため、自ノードのMACアドレスはハードコードしている。
    • pcap_injectはWinPcapには無い。同じ機能を持つ、pcap_sendpacketを使う。