メモリーへのデータ入出力速度はプログラムの実行性能に大きく影響する。Linuxでは,物理メモリー(主メモリー)とハード・ディスク内のスワップ領域を加えた記憶領域を仮想メモリーとして管理する。この仮想メモリーの取り扱いを変更することでもシステムの処理性能を向上できる。具体的には,キャッシュの書き出し頻度の調整や,仮想メモリー管理機構そのものの変更などがある。また,少ないメモリーでソフトを動作させるために,空き領域の確認を行わずにメモリーを割り当てる方法も紹介する(別掲記事の「少ないメモリーでソフトを動かす」を参照)。

キャッシュの書き出し頻度を変更,ファイルの読み書きを高速化する

 Linuxではファイル入出力を高速化するため,空きメモリー領域をディスク・キャッシュとして確保し,それを通じて入出力処理を行っている。キャッシュによって,メモリーよりも低速なディスク入出力処理の完了を待つことなく処理を進められる。キャッシュに保存されたデータはいずれかのタイミングでディスクに書き出されるが,この頻度により,システムのパフォーマンスが変化する。

 一般的には,キャッシュの書き出し頻度が高ければ高いほどシステム性能は低下する。ハード・ディスクは実際にデータ転送を開始する前に適切な記録位置にヘッドを移動させなければならず,これに長い時間がかかるためである。記録するデータ総量が同じでも,1度にまとめて(書き出し頻度を少なくして)記録できた方が高速に処理できる。

 また,書き出し間隔が長ければ,ディスクに書き出される前に消去されるファイルも増える可能性がある。これも不要なディスク・アクセスの削減につながるので,システム性能の向上に貢献する。

 ただし,キャッシュの書き出し頻度を低くすると,ファイルに変更を加えてからその変更がディスク上のファイルに及ぶまでの時間が長くなる。これは,後述するようにデータの安全性を低下させる。ディスク上のファイルに変更が及ぶ前に停電などが生じると,変更を加えた内容がすべて消えてしまうことになるからだ。

 キャッシュの書き出し頻度を低くする場合には,この危険性を十分に認識し,システムの用途や使用しているファイル・システムに応じて適切に設定しよう。

書き出し頻度を変更する

 バージョン2.4系列のカーネルを搭載したLinuxでは,/proc/sys/vm/bdflushの内容を変更することで,キャッシュ内のデータのディスクへの書き出し頻度を調整できる。同ファイルの内容は,図1のようになっている。これらの数値で制御できる項目を表1に挙げる。

40 0 0 0 500 3000 60 0 0
図1●/proc/sys/vm/bdflushの内容
このファイルの内容を変更することで,キャッシュの書き出し処理を制御できる。

表1●/proc/sys/vm/bdflushの各項目の意味
表の上から順に,bdflushの内容の左側の項目から説明している。キャッシュの書き出し間隔を変更する場合は,第5項目と第6項目の数値を変更する。
[画像のクリックで拡大表示]
表1●/proc/sys/vm/bdflushの各項目の意味

 これらの数値は,bdflushデーモンとkupdateデーモンの2つのプログラムの動作を制御する。このうち特定の時間でキャッシュを書き出す働きをするのはkupdateデーモンである。

 kupdateデーモンは,表1に示したbdflushファイルの5項目(interval)と6項目(age_buffer)に従って動作する。具体的には,5項目で指定された間隔でキャッシュを調べ,変更されてから6項目で指定された時間以上経過しているデータをディスクに書き出す。カーネル 2.4.17の初期状態では,5秒ごとにkupdateがキャッシュを調べ,変更後30秒以上経ったデータを書き出す設定になっている。

 キャッシュの書き出し頻度を減らすには,これらの数値を増やせば良い。変更にはroot権限で次のようにする。

# echo "40 0 0 0 2500 15000 60 0 0" > /proc/sys/vm/bdflush

 この例では,チェック間隔を25秒,データが書き出されるまでの時間を150秒に変更している。