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
これで反映されます。