UNIX的なアレ

UNIX的なこととかいろいろ

lsyncdで上限ファイル数を超えた時の対処策

lsyncdで監視できる対象のファイル数は制限されています。lsyncdのlogに以下のようなlogが吐き出されていたら要注意です。

Fri Jan 22 14:11:51 2010: ERROR: Cannot add watch /foo/bar/ (28:No space left on device)

このまま読んでしまうと容量が無いのかなーとも思ったのですが、そういうわけではないそうです。lsyncdは、inotifyというAPIを利用してつくられているので、そのあたりの設定ですね。
というわけでドキュメントを調べてみました。

/proc インターフェース
以下のインターフェースは、inotify で消費されるカーネルメモリの総量を制限するのに使用できる:

/proc/sys/fs/inotify/max_queued_events
このファイルの値は、アプリケーションが inotify_init(2) を呼び出すときに使用され、対応する inotify インスタンスについてキューに入れられるイベントの数の上限を設定する。この制限を超えたイベントは破棄されるが、 IN_Q_OVERFLOW イベントが常に生成される。
/proc/sys/fs/inotify/max_user_instances
1 つの実ユーザ ID に対して生成できる inotify インスタンスの数の上限を指定する。
/proc/sys/fs/inotify/max_user_watches
作成可能な監視対象の数の実 UID 単位の上限を指定する。
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/inotify.7.html

要するに、/proc/以下のファイルをいじってやれば良いというわけです。それでは現在の設定を確認してみましょう。

 $ cat /proc/sys/fs/inotify/max_user_watches
8192

上記の通りに表示されると思います。標準では8192がinotifyで監視できるファイル数の上限となっています。直接ここを書き換えてもいいのですが、再起動するとまた設定しなおす必要があります。こういう場合は、/etc/sysctl.confに記述しましょう。

 $ sudo cp -ip /etc/sysctl.conf{,.org}
 $ sudo vi /etc/sysctl.conf
  -> fs.inotify.max_user_watches = 16394 # 追加
 # sudo /sbin/sysctl -p

これで反映されます。