b.l0g.jp     About     Archive     Feed

systemtapでファイルシステムキャッシュのヒット率を見る

Linuxでは、自動的にメモリの空き容量をファイルシステムキャッシュ(以下単にキャッシュ)として使用するような仕組みが用意されている。MySQLでMyISAMを使う時のようにOSのキャッシュを使用するような仕組みを使っていたり、単にファイルをNFSで公開しているファイルサーバなどでは、このキャッシュがどの程度効くかによってかなりパフォーマンスが違ってくる。

多数のファイルが読みだされ、かつ読み出し対象ファイルの総容量が物理メモリ容量より多い場合(普通そうだと思うが)、どのくらいのキャッシュヒット率になっているかを知っておくのは、パフォーマンス改善の一助になる。しかし、あるファイルがキャッシュに載っているかどうかを調べたり、ファイルをキャッシュに載せたりするための単純なコマンドというのは実は存在していない(はず)。それで、

とつぶやいたら、

と教えてもらったので、リンク先のサイトにあるスクリプトでキャッシュヒット率を確認してみた。@ishikawa84g 先生ありがとうございます~。

systemtapは、カーネル内部の挙動をトレースするためのツールの一種で、特別なスクリプトを書いてそれに従ってトレースすることができるので、色々な情報を取得することができる。

試してみたのはCentOS 6.2のマシン。systemtapがインストールされてなければインストールする。kernel-develも入っていないようであれば一緒に入れてしまうべし。

  
$ sudo yum install systemtap kernel-devel
  

上記リンク先にあるスクリプトをファイルに保存し、そのまま実行するとエラーになってしまう。

  
$ sudo stap cache-hit-rate.stp
  
semantic error: libdwfl failure (missing x86\_64 kernel/module debuginfo under '/lib/modules/2.6.18-164.el5/build'): No such file or directory while resolving probe point kernel.function("vfs\_read")
  
semantic error: no match while resolving probe point vfs.read
  
semantic error: no match while resolving probe point kernel.function("generic\_make\_request")
  
semantic error: no match while resolving probe point ioblock.request
  
Pass 2: analysis failed. Try again with another '-vp 01' option.
  

カーネルのdebuginfoがないためのエラーのようだ。debuginfoは専用のリポジトリからダウンロードする必要があるため、CentOSのdebuginfoリポジトリを登録する。debuginfoはそれなりにサイズもあるので、既に運用しているサーバにこれから入れるのは少しためらわれることもありそうだ。

/etc/yum.repos.d/CentOS-debuginfo.repo に以下の内容を書き込んで保存する。

  
[debuginfo]
  
name=CentOS-$releasever - DebugInfo
  
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
  
gpgcheck=0
  
enabled=0
  

kernel-debuginfoをインストールする。

  
$ uname -a
  
Linux centos62-64-01 2.6.32-220.el6.x86\_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86\_64 x86\_64 x86\_64 GNU/Linux
  
$ sudo yum install -enablerepo=debuginfo kernel-debuginfo-2.6.32-220.el6.x86_64
  

パッケージが大きいので時間がかかる。この時、unameでカーネルバージョンを調べて使用しているカーネルと同じバージョンのdebuginfoを指定すること。指定しないとリポジトリにある最新のカーネルのdebuginfoがインストールされてしまう。

この状態でstapコマンドを実行すると、キャッシュのヒット率が5秒おきに15回表示される。

  
$ sudo stap cache-hit-rate.stp
  
Starting…

Total Reads (KB) Cache Reads (KB) Disk Reads (KB) Miss Rate Hit Rate
                   
0 0 0 0.00% 0.00%
                   
0 0 0 0.00% 0.00%
                   
0 0 0 0.00% 0.00%
               
58802 66 58736 99.88% 0.11%
                   
0 0 0 0.00% 0.00%
                   
0 0 0 0.00% 0.00%
               
58785 58345 440 0.74% 99.25%
                   
0 0 0 0.00% 0.00%
                   
0 0 0 0.00% 0.00%
  
^C
  
Average Hit Rate: 49.67
  
Average Miss Rate: 50.32
  

キャッシュに読み込まれていないファイルを

  
$ cat bigfile > /dev/null
  

とやって読みだしたのが8行目で、ここではファイルのほぼ全てをディスクから読みだしている。もう一度同じコマンドを実行すると、1度目に実行したcatで読みだされた際にファイルがキャッシュに読み込まれているので、ほとんどディスクからの読み出しがなく、11行目のようにほぼキャッシュヒット率100%となり一瞬でファイルの全てにアクセスできる。

スクリプトの作者も書いているが、LVMを使用している場合などにはヒット率が正しく出ない場合があるので、値は参考程度に考えておくべし。

参考

SystemTap

Linux のイントロスペクションと SystemTap

SystemTapでMySQLのDisk I/Oを分析する

Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック
池田 宗広 大岩 尚宏 島本 裕志 竹部 晶雄 平松 雅巳 高橋 浩和 </p>

オライリージャパン 2011-07-26
売り上げランキング : 95520

Amazonで詳しく見る</font> by G-Tools</td> </tr> </table>

Debug Hacks -デバッグを極めるテクニック&ツール Debug Hacks -デバッグを極めるテクニック&ツール
吉岡 弘隆 大和 一洋 大岩 尚宏 安部 東洋 吉田 俊輔 </p>

オライリージャパン 2009-04-27
売り上げランキング : 190612

Amazonで詳しく見る</font> by G-Tools</td> </tr> </table>



海外の役立つブログ記事などを人力で翻訳して公開するYakstというプロジェクトをやっています。よろしければそちらもどうぞ!