updatedb をチューニング。locate コマンドのデータベース更新を制限する

drk7.jp の自宅サーバは MRTG を使ってリアルタイムで負荷状況が確認できるようになっているのですが、最近、毎時4時に負荷が増大しているのが気になっていました。
la-day.png

たまたま本日はこの時間帯に目が覚めていたので原因を調べてみると、updatedb なるプロセスが実行されているのが判明しました。このupdatedb というプロセスは何かというと、locate で用いるファイル名データベースを更新するために用いられるコマンドなのです。ファイル名データベースには、最後に更新された時点において、特定のディレクトリ以下に存在していたファイルのリスト情報が入っているわけです。

- スポンサーリンク -

locate コマンドの存在自体、実はあまり知られていなかったりしますが、find に比べてかなり高速にファイルを検索することが可能です。例えば、その高速性の違いを体感するのであれば、

locate CPAN.pm

find / -name CPAN.pm

を実行してみて下さい。locate は瞬時に結果が帰ってくると思いますが、find はハードディスクを総なめしにかかるので、非常に遅いことがわかります。

さて、locate コマンドは全てのディレクトリに対して行う必要があるでしょうか?例えば、アプリケーションのログやキャッシュファイルといったものを locate で探すことはまずありません。さらには、それら不要のファイルが膨大な量であるとしたら、createdb はいらないファイルのインデックスを作成するためにリソースを消費することになります。

例えば、drk7.jp に当てはめると、Amazon Search 等のサービスに必要なキャッシュファイルが数百万ファイル存在しています。実はこれら検索に不要なファイルに対しても updatedb がインデックスを作成していたから負荷が高いことがわかりました。

createdb は毎日午前4時に起動される日時 cron の中で起動するように定義されています。

cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

cat /etc/cron.daily/slocate.cron
#!/bin/sh
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e "/tmp,/var/tmp,/usr/tmp,/afs,/net"

では、この updatedb をチューニングする方法ですが、-e 配下のディレクトリにインデックス不要なディレクトリを追加するだけでOKです。場合によってはこれだけで随分と負荷軽減が可能となるかもしれません。もし毎時4時に負荷が増大するって方は、是非 createdb の見直しをおすすめ致します。
- スポンサーリンク -