hadoop-logo
ようこそ Tech blogへ!
「これからHadoopを勉強しよう」という方はまず下記のページから

サイトの移行に伴って画像が表示されないなどの不具合が生じています

HDFSのパフォーマンス改善(アドバイザリーキャッシュの設定)

10日目です
以前もHDFSのパフォーマンス改善についてのブログ(キャッシングの導入mmapを使ったゼロコピー)を書きましたが、本日たまたま見つけた(かつ、最新版には取り込まれていた)、ファイルベースでHDFSアドバイザリーキャッシュを設定できる機能(HDFS-4817)を紹介します。
Linuxにはfadvise(posix_fadvise)システムコールが実装されています(マニュアル)。fadviseは、ユーザー空間のプログラムから、カーネルに対してデータアクセスのヒントを行う仕組みを提供しています。また、readahead()システムコールは、ファイルの読み出し対象のデータよりも先の部分を読み込んでおき、データがページキャッシュに格納された状態にしておくことで、ディスクアクセスを減らしパフォーマンス向上につながります(マニュアル)※かなり大雑把な説明なので、正確なところはドキュメントなどをご覧下さい。
HDFSの最適化として、データノードでreadaheadが利用できるようになっています。クライアントから要求が行われる前に先行してページキャッシュに読み込んでおき、そのデータをうまく利用することで、デバイスへのアクセスを減らすことが狙いです。
もうひとつの最適化として、HDFSではdrop-behindという機能が追加されており、不要になったファイルをページキャッシュから捨てることができます。
※余談ですが、Linuxのカーネルには強制的にページキャッシュをクリアする機能があります。これは日常的に使うようなものではありませんが、ベンチを取る前にキャッシュをクリアするなどの用途には便利です。興味があればカーネルのドキュメントなどをご参照下さい。https://www.kernel.org/doc/Documentation/sysctl/vm.txt

drop_caches
Writing to this will cause the kernel to drop clean caches, dentries and
inodes from memory, causing that memory to become free.
To free pagecache:
	echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
	echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
	echo 3 > /proc/sys/vm/drop_caches
As this is a non-destructive operation and dirty objects are not freeable, the
user should run `sync' first.

チケットには、dfs.datanode.drop.cache.behind.writesdfs.datanode.drop.cache.behind.readsの設定を行うことで、MapReduceのワークロードが40%も向上したとも書いてあります。(ベンチの結果もあります)かなり効果的ですね。
このパッチでの改善は、元々データノード単位でしか設定できなかったこれらの機能を、ファイル単位もしくはクライアント単位で制御できるようした、というものです。
パフォーマンスの向上に寄与するパッチかと思いましたが、ちょっと違いましたね。明日はもう少し効果的なものを紹介し、、たいと思います。

コメント