ext3/ext4ファイルシステムのチューニング

  • 投稿日:
  • by
  • カテゴリ:

ウチのお客さんは検索システムを提供しているカイシャなのだけれども、バッチが非常に遅い本番系システムがある。テスト系システムではバッチの実行時間は2時間程度なのだが、同じものを本番系に導入したら、8時間かかっている。なんじゃこりゃ~~!みたいな感じ。

時間が掛かっているのは、xargsコマンドを使って数十万個のファイルを1つのデータファイルにまとめている処理の部分であった。

どうもディスク(RAID)が怪しいので、vdbenchの使い方で紹介したようにvdbenchを使って様々なパターンのテストを実施した。量が多いし、本題から外れるので結果は割愛するが。

  • シーケンシャルなリード
  • シーケンシャルなライト
  • ランダムなリード
  • ランダムなライト
  • シーク割合50%のリード
  • シーク割合50%のライト
  • シーケンシャルなリード50%・ライト50%
  • ランダムなリード50%・ライト50%
  • シーク割合50%のリード50%・ライト50%
  • 前項はすべてページキャッシュを使用した通常の使用条件のものであるが、これらすべてに対して、Direct I/Oによるケース

いずれのケースでも、180秒間、最大I/Oレートで負荷をかけてデータ転送速度を測定する。

このテストで分ったことは、平均的なパフォーマンスは本番系サーバーのほうがテスト系サーバーよりも良いのだけれども、シーケンシャルなディスクライトに関しては、本番系のパフォーマンスがテスト系の約1/4になっている。

この結果を見て、妙に納得した。バッチで時間が掛かっている問題の部分は数十万個のファイル群をひとつにまとめている部分であり、ここでの処理は殆どシーケンシャルなディスクライトとなっているはずである。その処理で本番系が1/4のパフォーマンスであるならば、確かにバッチの実行時間が4倍に延びそうだ。

いやぁ~、原因が分ったね、シーケンシャルなディスクライトが遅いんだって。よかったよかった・・・・ぢゃなくて!!

8時間をどうにかしようよ。もともと2時間の予定だったのだから。

そこで本記事の表題を実施してみようということになる。ext3/4のチューニングだ。Redhat Enterprise Linuxでは6までは、デフォルトでext系のファイルシステムを採用している。RHEL7になると、XFSがデフォルトになるそうだ。そろそろext系ファイルシステムのチューニングについて記事を書いておかねばならないと思いました。

まず、この無茶遅い本番系サーバーの正体をお見せいたしましょう。DELLのサーバーである。(DELLがすべて遅いというわけではございません。念のため。)

DELLのサーバーのRAID管理(情報表示)コマンドはomreportコマンドだ。OpenManageのパッケージを入れると一緒にインストールしてくれる。これは、以下の場所にあるので、PATHを通しておこう。(最近は、/usr/binにも存在していたりする。)一般ユーザーで実行可能。

 

$ pwd
/opt/dell/srvadmin/bin
$ ll
合計 2380
-rwxr-xr-x 1 root root     750  4月  8  2010 finddev.sh
-rwxr-xr-x 1 root root   49828  3月  8  2011 iDRACfl32l
-rwxr-xr-x 1 root root   97104  3月  8  2011 iVMCLI
-rwxr-xr-x 1 root root 1741887  3月  7  2011 idracadm
-rwxr-xr-x 1 root root    9543  2月 15  2011 ivmdeploy.sh
lrwxrwxrwx 1 root root      11 12月 27  2011 omconfig -> stdcliproxy
-rwxr-xr-x 1 root root     314  3月  7  2011 omexec
lrwxrwxrwx 1 root root      11 12月 27  2011 omhelp -> stdcliproxy
lrwxrwxrwx 1 root root      11 12月 27  2011 omreport -> stdcliproxy
-rwxr-xr-x 1 root root      72  3月  7 2011 omupdate
-rwxr-xr-x 1 root root    6941  3月  7  2011 racadm4
-rwxr-xr-x 1 root root  138546  3月  7  2011 racvmcli4
-rwxr-xr-x 1 root root      84  3月  7  2011 stdcliproxy
-rwxr-xr-x 1 root root    9575  3月 16  2010 vm6deploy.sh
-rwxr-xr-x 1 root root  269588  3月  8  2011 vmcli
$

まず、DELLのモデルを調べる。

$ omreport chassis info|grep Model
Chassis Model                            : PowerEdge R710
$

次に、RAIDコントローラー情報。

$ omreport storage controller|grep Name
Name                                          : PERC H700 Integrated
$

RAIDコントローラのIDは:

$ omreport storage controller|grep ID
ID                                            : 0
Slot ID                                       : Embedded
$

IDは0だ。これでようやくRAIDの構成情報を引き出せる。

$ omreport storage controller controller=0|grep Layout
Layout              : RAID-10
$

RAID10だ。RAID10はストライピング+ミラーリングをしているのだけれども、一般的に書き込みが遅い。更に、このサーバーを購入した時期(2011年ころ)からは、ハードディスクの物理セクターサイズが4KBとなり始めた時期だ。OS側から見える論理セクターサイズは伝統的な512Bだけれども、ディスクコントローラはセクター1つに書き込みをするために、4KBをまるまる読み出して、更新したものを含んだ4KBのブロックをまとめて書き込まなければならない。つまり、もともと遅いRAID10に更に4KBセクター初期の実装とあって、シーケンシャルライトがべらぼうに遅くなってしまったけれども、平均すると性能はいいよみたいな製品なんだろうね。

ファイルシステムのチューニングとは関係ないけど、ディスクライトのパフォーマンスに深刻な影響を及ぼす特別な因子が存在するので言及しておきたい。それは、ディスクのライトポリシーだ。

$ omreport storage controller controller=0|grep "Write Policy"
Write Policy        : Not Applicable
$

DELLの場合、普通はこうなっている。"Not Applicable"だ。このときは、RAIDコントローラにキャッシュメモリが載っていれば自動的に"Write Back"に設定されている。"Write Back"では、ディスクへ書き込むつもりでキャッシュメモリに書き込みを行うので、OS側から見たディスクライトが体感上早くなる。

RAIDコントローラのメモリをバックアップしているバッテリーが低電圧状態になるとバッテリーチャージが始まるが、そうするとここが"Write Through"になる。"Write Through"では、キャッシュメモリを利用しないので、OSの書き込み命令は直接ディスクヘッドのシークを引き起こし、べらぼうにディスクライトが遅くなる。ハードがへたってくると、このバッテリーチャージが頻繁(数日に1回など)に起こるようになり、迷惑極まりない。データが飛んでもパフォーマンスを出したい!というならば、"Force Write Back"というポリシーに変更してしまえば、バッテリー低電圧状態云々を問わず、常に"Write Back"となる。しかし、この件は顧客とよく相談して実施することだ。データが飛ぶからね。電源の瞬断などがあったりするとね。

# omreport storage controller controller=0
...
Virtual Disks
ID                  : 0
Status              : Ok
Name                : Virtual Disk 0
State               : Ready
Encrypted           : Not Applicable
Layout              : RAID-10
Size                : 278.88 GB (299439751168 bytes)
Device Name         : /dev/sda
Bus Protocol        : SAS
Media               : HDD
Read Policy         : Not Applicable
Write Policy        : Not Applicable
Cache Policy        : Not Applicable
Stripe Element Size : Not Applicable
Disk Cache Policy   : Disabled
#

controller=0の部分は、先に調べておいたコントローラIDを入れる。デバイスネーム(この事例では/dev/sda)は目的のパーティションを含んでいるかい?よく確認しておこう。"Virtual Disk 0"が分ったので、omconfigコマンドでライトポリシーを"Force Write Back"へ変更する。rootユーザーで実行しよう。

# omconfig storage vdisk action=changepolicy controller=0 vdisk=0 writepolicy=fwb
#

きちんと変更されたかを確認する。

# omreport storage controller controller=0|grep "Write Policy"
Write Policy        : Force Write Back
#

さて、それにしても、いやぁ!罪深いサーバーだよ、DELL PowerEdge R710!よしよし、これから「本題」のファイルシステムのチューニングをしてやるからな!

参考にした記事は、Mount options to improve ext4 file system performance。ext4となっているが、ext3でもほとんど同じ。ext4の詳細については、Ext4 Filesystemを参照のこと。ext3の詳細については、Ext3 Filesystemを参照のこと。

前出の参考記事によると、railsテストスイートが30%早くなったらしい。もっと早くなるといいな。

さて、ファイルシステムオプションを変更するには、/etc/fstabを編集して目的のパーティション一度アンマウントした後、再マウントしなければならない。目的のパーティションを使用しているプログラムがあるとアンマウントできないのでご注意を。ルートパーティションはアンマウントできないし、/homeなども作業用のシェルでログインしているならばアンマウントできない。その様な場合には、/etc/fstabの変更内容を反映させるためにOSの再起動が必要になるのでご注意を。

以下の例では、/dataパーティションについてファイルシステムオプションを変更するものとする。

# cd /etc
# cp -p fstab fstab.yyyymmdd
# vi fstab
...
/dev/VolGroup_ID_12106/data    /data   ext3    noatime,data=writeback,barrier=0,nobh,errors=remount-ro        1 2
#

変更箇所は、"defaults"と書いてあるオプションの部分を"noatime,data=writeback,barrier=0,nobh,errors=remount-ro"に書き換える部分。オプションのそれぞれの意味は、noatime(ファイルのatimeを記録しない)、data=writeback(ファイルシステムデータをライトバックとし、データ順序を保証しない)、barrior=0(ライトバリアを不活性化する)、nobh(バッファヘッダを使用しない)、errors=remount-ro(エラー時にはリードオンリーで再マウントする)。

/etc/fstabを書き換えたら、ファイルシステムを一度アンマウントし、再マウントする。

# sync
# sync
# sync
# umount /data
# ls -l /data
# mount /data

最後のmountコマンドは/etc/fstabに記載されたパーティションのみを引数としているが、その場合は、/etc/fstabの内容を再読み込みして、そこに記述されたオプションでマウントする。

シスログを見てみよう。

# cd /var/log
# tail messages
...
Apr 15 10:25:53 jalintl3 kernel: kjournald starting. Commit interval 5 seconds
Apr 15 10:25:53 jalintl3 kernel: EXT3 FS on dm-6, internal journal
Apr 15 10:25:53 jalintl3 kernel: EXT3-fs: mounted filesystem with writeback data mode.
#

"EXT3-fs: mounted filesystem with writeback"と出ていれば設定がきちんと効いている。ここに、"EXT3-fs: mounted filesystem with ordered data"と出るならば、設定は反映されていない。もう一度やり直しだね。

さて、このファイルシステム設定変更の前後でvdbenchを使ってシーケンシャルライトのパフォーマンステストを実施した結果は:

Page CacheFS条件fstabオプション転送速度平均応答時間最長応答時間応答σ
MB/secmsms
利用なし(O_DIRECT)FSチューニング前default(ordered data mode)83.70.37235.4961.683
FSチューニング後writeback data mode etc.83.360.374349.7571.822
利用あり(通常条件)FSチューニング前default(ordered data mode)135.040.2313245.427.23
FSチューニング後writeback data mode etc.1037.980.0294.7690.082

赤いセルに注目して欲しい。ページキャッシュを使用しないO_DIRECTのディスクI/Oでは、チューニングの効果が全く感じられないが、ページキャッシュを使用する通常の利用条件においては、劇的な転送速度の改善( 1037.98 ÷ 135.04 = 7.63倍)が見られた。約8倍とすれば、テスト機の1/4のパフォーマンスだった本番機が、一気にテスト機の2倍のパフォーマンスになりうるということだ。

すばらしいぢゃないか。でも、担当SEのS氏、このファイルシステム設定の恒久化に躊躇してしまっているんだよね。まぁ、顧客から突き上げられたときの奥の手として残しておくのもいいんだけど、本番化できないのはちょっと残念だね。

noatimeの件についてだけれども、ファイルのatimeを記録しないで大丈夫なの?ということで、ウチのお客さんのところで利用しているファイルシステムにデータを記録するPostgreSQLについて調べてみたけれども、PostgreSQL Performance Tuning - Tune the Operating System - File Atimeによると、どうもatimeの情報を使っていないようで、ファイルシステムにnoatimeオプションを付けてデータファイルのパーティションをマウントするように推奨している。S先生。安心してファイルシステムオプションを変更してもいいと思うよ。