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 件のコメント:
コメントを投稿