ITProのチューニング記事(noatime付加)を検証してみた

(2008/6/14 13:30 追記)
*** 注意事項 ***
この記事の内容は古く、誤りがあります。
こちらの最新記事をお読みください。
http://d.hatena.ne.jp/shiumachi/20080614/1213415948

(2008/6/9 7:00 追記)
kosakiさんが、atime 周りのマウントオプション(noatime, nodiratime, relatime)について詳しく解説されています(該当記事)。
thanx!
(2008/6/9 21:00 追記)
id:dankogai が、findによる検証方法の不備を指摘して下さいました(該当記事)。
また、kosakiさんもその件について補足してくれました(該当記事)
thanx!

要約

ITPro 掲載のチューニング記事に書かれていた、
「mount オプションに noatime オプションを付加すると読み込み速度が倍になる」
という情報について検証を行ったところ、私の環境(Core 2 Duo(2.2GHz),メモリ2GB,Fedora8)では
性能差を確認することができませんでした。
また、はてブのコメントを元に relatime オプションを付加して検証を行ったところ、こちらも
性能向上は見られませんでした。

(2008/6/14 13:30 追記)
検証方法そのものが間違っているため、上記の内容は誤っています。
こちらの記事をお読みください。

背景

先日、ITPro に Linux のチューニングに関する記事が掲載されていました*1。
しかしはてなブックマークのコメント*2を読むと、どうやら記事は相当古いとのこと。
確かに ITPro の該当ページの下部に、この記事が2002年4月号のものであるという注意書きがされています。
また、kosakiさんのブログでもこの記事に対し「あまりに酷い」というコメントがされていました*3。
とはいえ、この記事の真偽を確かめるのにはてブやブログのちょっとしたコメントを鵜呑みにするのはあまりに危険です。
というわけで、軽く検証を行ってみることにしました。
その際、どうせやるならと、はてブで id:kinaba がコメントしている relatime オプションも検証してみることにしました。

検証方法

今回用意した環境は以下の通りです。

ハードウェア Thinkpad X61
CPU Core 2 Duo T7500(2.20GHz)
メモリ 2048MB
OS Fedora 8(x86)
カーネルバージョン 2.6.24.5-85.fc8
ランレベル 5

ランレベルを記載しているのは、起動時間を測定するためです。

検証パターンは以下の通りです。

パターン番号 省略表記 内容
1 デフォルト /bootと、その他全てのパーティション(といっても/のみ)を含む論理ボリュームのオプションを defaults とする
2 noatime /bootと、その他全てのパーティション(といっても/のみ)を含む論理ボリュームのオプションを defaults,noatime とする
3 relatime /bootと、その他全てのパーティション(といっても/のみ)を含む論理ボリュームのオプションを defaults,relatime とする

検証方法は以下の通りです。

検証番号 内容
1 電源投入してからGUIログイン画面が表示されるまでの時間を測定する。
2 「# time find /usr/ -name linux」を実行し、findの実行時間を測定する。

(2008/6/14 13:00 追記)
この検証方法には誤りがあるため、この検証結果を利用しないよう
お願いいたします。

検証結果

起動時間

起動時間を各3回計測しました。
結果は以下の通りです。
(測定時間の単位は全て秒。以下同様)

回数 デフォルト noatime relatime
1 76.0 75.0 74.0
2 75.0 73.0 74.0
3 75.0 74.0 75.0
平均 75.3 74.0 74.3
起動時間比較 100.0% 98.2% 98.7%
find実行時間

まず、デフォルトで同一起動時に3回 find コマンドを実行した結果を記載します。
real, user, sysについてですが、とりあえず real が実際にかかった時間だと
理解してください。
user, sysについては man 2 times を参照してください。

回数 real user sys
1 80.533 1.031 2.370
2 0.741 0.345 0.396
3 0.719 0.325 0.394

このように、同一起動時に複数回コマンドを実行すると、2回目以降の実行時間は極端に短くなります。
これはおそらくキャッシュを読み込んでるためだと思われますが、詳しい動作はわかりません。
(知ってる人がいたら教えてほしい)
とりあえず今回は、「1起動時1回の計測を3回実施する」という方式をとることにします。

では、以下結果を記載します。
デフォルト時の実行時間の結果は以下の通りです。

回数 real user sys
1 80.533 1.031 2.370
2 80.410 1.042 2.286
3 82.685 1.006 2.243
平均 81.209 1.026 2.300


noatimeオプション付加時の実行時間の結果は以下の通りです。

回数 real user sys
1 80.684 1.007 2.373
2 81.239 0.952 2.363
3 80.836 0.991 2.296
平均 80.920 0.983 2.344


relatimeオプション付加時の実行時間の結果は以下の通りです。

回数 real user sys
1 80.941 0.997 2.379
2 83.248 0.973 2.273
3 108.841 1.037 2.244
4 89.145 0.949 2.240
平均 90.544 0.989 2.284

この検証のみ4回の計測を行っていますが、これは3回目の実行時間が異常に長かったためです。
最後に、3パターンの平均実行時間の比較結果を記載します。

デフォルト noatime relatime
平均実行時間比較 100.0% 99.6% 111.5%

考察

起動時間の比較についてですが、デフォルトと noatime, relatimeオプション付加時との間には
ほとんど差がありませんでした。
約1秒、約1%の起動時間の差がどうしても気になる人以外には、このオプションは無意味だと
断言していいでしょう。
また、find 実行時間ですが、こちらはデフォルトと noatime の間にはほとんど実行時間の差がなく、
relatime はむしろデフォルト時よりも実行時間が長くなってしまいました。
この原因は不明ですが、もしかしたらバックグラウンドで何らかの別のタスクが実行されるなど、
システムの性能を落とす要因があったのかもしれません。
今回の検証結果をもとに「relatime オプションを付加すると性能が落ちる」と言うことは
できませんが、他の結果を見る限り relatime オプション付加時の find 実行時間がデフォルト時のそれよりも
極端に短くなるということはおそらくないでしょう。

(2008/6/10 0:00 追記)

2.6.24からの新オプション default_relatime が機能しているため、マウントオプションつけなくても relatime つきでマウントしています。
よってこの考察は誤っています。
詳細はこちらの記事で。

結論

今回の検証結果からは、デフォルトと noatime, relatimeオプション付加時のディスク読み込み性能に
有意な差があるとは認められませんでした。
noatime や relatime はデフォルトで記録されるはずの情報が記録されなくなるので、このことが本当に
システム全体に影響を及ぼさないとは誰にも証明することができません。
ですから、あまり専門知識のない方が単に性能を上げたいという理由だけでこうしたオプションに手を出すのは
思わぬシステムの不具合を生じる可能性があるので止めた方がいいでしょう。
(多分大丈夫だとは思いますけどね)

さらなる真実を求めて

今回の検証は本当に軽く行っただけですので、間違いなく色々と穴があります。
興味のある方は追試をしてみてください。
その際、以下の点を変更して追試していただけるとより真実に近い情報が得られると思います。

  • 環境を変える(CPU,メモリ,OS,カーネルバージョン, etc...)
  • 計測方法を変える(特により多くのファイルを扱う方法にすると有用な情報が得られるはず)
  • 計測回数を変える(統計を少しでもかじってる人なら、3回という数字が以下に無意味かわかるでしょう)

補足:noatime と relatime

relatime オプション、日本語の mount の man には記載されておりません。
ということでオリジナルの mount の man を読んで軽く訳してみました。
(誤訳してたら指摘してください)

relatime

修正時刻や変更時刻に対する inode アクセス時刻を更新する。
アクセス時刻は前回のアクセス時刻が現在の修正時刻または更新時刻より早かった場合のみ更新される。
(noatime と似ているが、mutt などの最後にファイルが修正されてからそのファイルが
読まれたかどうかを知る必要があるアプリケーションの動きを中断しない)

というわけで、man を読む限り noatime を使うよりは relatime を使った方がよさそうです。

*1:http://itpro.nikkeibp.co.jp/article/COLUMN/20080528/304432/

*2:http://b.hatena.ne.jp/entry/http%3A//itpro.nikkeibp.co.jp/article/COLUMN/20080528/304432/

*3:http://mkosaki.blog46.fc2.com/blog-entry-535.html