iSCSIによるベンチマーク
PS3 Linux上のiSCSI enterprise target(iET)を利用して、Windows側のinitiatorと組み合わせた場合のパフォーマンスを見てみた。
60%を境にパフォーマンスが低下しているのは、HDDの読み取りパフォーマンスの特性による。つまり、HDDは、通常外周(低いLBA)ほどパフォーマンスが高く、内周(高いLBA)に行くほど低速になる。
60%以前はパフォーマンスが一定になるが、これがiSCSIの転送能力によるものなのか、PS3のHypervisorによるものなのかは何とも言えない。内蔵HDD単独のベンチマークをする必要がある。追記した。
リリースバージョンのiET(0.4.17)は、最近のカーネル(2.6.30以降)に組み込むことが出来ない。svn版を使う。
ちなみにこの結果はggaoe + winaoeよりも相当に良いパフォーマンスと言える。原理的には、TCPを使わず、プロトコルが単純なATA over Ethernetの方が良いパフォーマンスが出そうなものだが。。ATA over Ethernetでは、EthernetのMTUの影響を受けて1パケットに2セクタしか収まらない。iSCSIはストリーム指向のプロトコルであるTCPを使うためこの制限は無く、より効率的にセクタを転送出来るのかも知れない。この場合、より高いMTUによって状況が改善する可能性がある。また、iETがカーネルモジュールとしての実装であることも影響しているかも知れない(ネットワークによる通信だけをユーザモードのdaemonが行い、ディスクI/Oはカーネル空間で行う)。
追記 :
bonnie++に付属しているzcavコマンドで、ローカルから測定してみた。
たしかに、30MB/s付近で、iSCSIを経由するよりも高速になっていることがわかる。60GBモデルのPS3を、10GBをゲーム側に割り当てて使用している。
Oprofileでのプロファイル結果。
samples % app name symbol name 37954 74.7685 kernel2630 .raw_local_irq_restore 1527 3.0082 kernel2630 .__copy_tofrom_user 1017 2.0035 iscsi_trgt /iscsi_trgt 576 1.1347 kernel2630 .__qdisc_run 542 1.0677 kernel2630 .tcp_sendmsg 484 0.9535 kernel2630 .dev_queue_xmit 429 0.8451 kernel2630 .tcp_transmit_skb 415 0.8175 kernel2630 ._spin_lock_bh 398 0.7841 kernel2630 .tcp_write_xmit 323 0.6363 kernel2630 .ip_queue_xmit 241 0.4748 kernel2630 .skb_release_data 200 0.3940 kernel2630 .dst_release 194 0.3822 kernel2630 .tcp_ack 186 0.3664 kernel2630 .ip_finish_output 185 0.3644 kernel2630 .__alloc_skb 185 0.3644 kernel2630 .__kfree_skb 165 0.3250 kernel2630 .sock_wfree 160 0.3152 kernel2630 .release_sock 152 0.2994 kernel2630 .__skb_clone 143 0.2817 kernel2630 .gelic_net_poll 135 0.2659 kernel2630 .memset 131 0.2581 kernel2630 .local_bh_enable 110 0.2167 kernel2630 .lock_sock_nested 106 0.2088 kernel2630 .__tcp_select_window 102 0.2009 kernel2630 .kfree 98 0.1931 kernel2630 .pfifo_fast_enqueue 96 0.1891 kernel2630 .__schedule