クラウドコンピューティングにまつわる話をつれづれなるままに。。。

2009年6月11日木曜日

Java NIO FileChannel

Hadoopコードリーディング大会その1。

HDFSのDataNodeに対してブロックリードのリクエストを出すと、デフォルトではNIOのチャネルが使われる(もう一つは昔からあるストリームIOを使う実装)。このチャネルのtransferToメソッドはUNIXのsendfileシステムコールみたいなものだ。(裏は取ってないが)実際、内部はsendfileを使って実装されているという記述も見かけた。sendfileはファイルをユーザプロセス空間にコピーすることなく、カーネル内で直接ソケットに書き込んでしまう仕組み。(少なくとも現状では)ファイルからソケットへの書き込みにしか対応していないので、transferFromメソッドはsendfileを使っては実装できない。おそらく、mmapしてからwriteしているのだろう。

今までNIOを使ったことがなかったので、FileChannel.transferTo、transferFromを使ったファイル転送ベンチマークを書いてみた。ソースはここのそれらしいファイル。

1GBファイルを転送したときのスループットが40 MB/sぐらい。ちなみにHDDはMaxtor 7L250S0で、hdparm -tで測ったread性能が63 MB/s、ddで1 GBファイル作ったときが68 MB/s。

この機会にJavaのソケットAPIを少し調べてみたが、Java 1.4になってから、CのソケットAPIでできることは大抵できるようになった気がする。

0 件のコメント:

コメントを投稿