●ext4 ファイルシステム
データベースサーバなどDisk IOが激しくかかるサーバにとってディスクの読み書きがボトルネックとなることがあります。SAS/SATAディスクを使用しているならSSDに変えれば解決することと思いますが、Linux側でext4のジャーナリングモードの変更で高速化を行うことが可能です。
ext4は「ジャーナル」という変更ログ ( ファイルのどこにどのようなデータを書き込むのか示す情報 ) を事前に記録することでファイル更新の安全性を確保するジャーナリングファイルシステムです。初期設定 ( journal ) ではファイルシステムの管理データ ( メタデータ )更新時にジャーナルを使用した保護を実現できます。
ext4のジャーナリングモードには以下の3つがあります。初期設定では安全性とパフォーマンスのバランスがとれた「data=ordered」です。
data=journal | メタデータもデータもジャーナルで保護するモード。 全てのデータがストレージに2回書き込まれることになるので入出力速度は最も遅い |
data=ordered | デフォルトの設定。ファイルデータの変更が完了してからメタデータを変更す るという処理順序を保証することでメタデータが不正なデータを指し示すこと がないようにする。但し、データはジャーナルで保護されていないので処理中 断により破損がありえる。 |
data=writeback | データの順番は保存されない。メタデータがジャーナルに記録されたあとで データがメインファイルシステムに書き込まれる。これはスループットを高く するオプションらしい。このオプションは内部ファイルシステムの完全性を保 証する。しかし、クラッシュしたあとのジャーナルによる回復で昔のデータに 戻ることも許されている。 |
上記のうち、data=writebackにすることで書き込みパフォーマンスの改善が期待できます。ただし、太字で書いていますように停電などによる突然の電源断などが起きますとデータが失われる可能性が出てきますので、必ずUPSと接続し自動連携して安全にシャットダウンできることが使用する前提条件となります。
●noatimeオプション
読み込パフォーマンスの早くする手法として/etc/fstabにnoatimeオプションを追記することで改善が期待できます。
Linuxのファイルシステムでは,標準設定でファイルの読み込み時にアクセスタイムも同時記録されます。もしも,アクセス情報を必要とする「tmpwatch」などを使用していないのであれば,に「noatime」オプションを付加するとアクセス度合いを軽減させる効果的です。
●設定変更
こちらの検証環境はCentOS5.6(2.6.18-308.4.1.el5)でパーティションはrootとswapのみなのでrootに設定致します。まずカーネルの起動オプションとして以下のものを追記します。
# vi /boot/grub/menu.lst # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-308.4.1.el5) root (hd0,0) kernel /boot/vmlinuz-2.6.18-308.4.1.el5 ro root=LABEL=/ rootflags=data=writeback initrd /boot/initrd-2.6.18-308.4.1.el5.img |
次に/etc/fstabを編集します。
# vi /etc/fstab LABEL=/ / ext3 defaults,noatime,data=writeback 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-hda2 swap swap defaults 0 0 |
rootパーティションのジャーナリングシステムを以下のコマンドで変更します。
# tune2fs -o journal_data_writeback /dev/hda1 |
この後、再起動します。
# reboot |
再起動後、mountコマンドで変更が有効になっているか確認します。
# mount /dev/hda1 on / type ext3 (rw,noatime,data=writeback) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) |
以上で完了です。