Web検索しようと、Webブラウザーを操作したところ、先ほどまでアクセスできていた検索エンジンに突然アクセスできなくなりました。検索エンジンだけではなく全てのWebページにアクセスできなくなったため、あれこれ調べることになりましたが、メールチェックは出来ているので、インターネット回線は問題無さそう。
結局、Webプロキシーサーバーがダウンしていることが判明。症状と一致するプロセスが停止していたので、当然といえば当然の現象だったのですが、 squid を再起動しようとしても、なぜか起動しない!
syslog をチェックしてみたところ、ずいぶんと久しぶりに見るメッセージが残っていたのでメモを残すことにしました。
「out of inodes ですって!そりゃ、squid も動けないよね!」って思いました。パーティション上の inodeが足りなくなってファイルシステムを更新できなくなったということです。
このメッセージを最後に見たのは、確か 1999年。「2000年問題を気にしながらFreeBSDサーバーを構築していた頃」なので、本当に久しぶりです。300MBくらいのHDD上に、FreeBSD の /usr/ports をマウントしてports を展開しようとたら、途中で更新出来なくなった記憶があります。
kernel: pid 1315 (squid), uid 100 inumber 117807 on /var/squid: out of inodes kernel: pid 1315 (squid), uid 100: exited on signal 6 squid[1313]: Squid Parent: (squid-1) process 1315 exited due to signal 6 with status 0 squid[1313]: Squid Parent: (squid-1) process 42247 started (squid-1): storeDirOpenTmpSwapLog: Failed to open swap log. kernel: pid 42247 (squid), uid 100 inumber 23552 on /var/squid: out of inodes squid[1313]: Squid Parent: (squid-1) process 42247 exited with status 1 squid[1313]: Squid Parent: (squid-1) process 42251 started (squid-1): storeDirOpenTmpSwapLog: Failed to open swap log. kernel: pid 42251 (squid), uid 100 inumber 23552 on /var/squid: out of inodes squid[1313]: Squid Parent: (squid-1) process 42251 exited with status 1 squid[1313]: Squid Parent: (squid-1) process 42255 started kernel: pid 42255 (squid), uid 100 inumber 23552 on /var/squid: out of inodes (squid-1): storeDirOpenTmpSwapLog: Failed to open swap log. squid[1313]: Squid Parent: (squid-1) process 42255 exited with status 1 squid[1313]: Squid Parent: (squid-1) process 42259 started (squid-1): storeDirOpenTmpSwapLog: Failed to open swap log. kernel: pid 42259 (squid), uid 100 inumber 23552 on /var/squid: out of inodes squid[1313]: Squid Parent: (squid-1) process 42259 exited with status 1 squid[1313]: Squid Parent: (squid-1) process 42263 started (squid-1): storeDirOpenTmpSwapLog: Failed to open swap log.
Unixのファイルシステムは、DOSのお馬鹿なFATと違って、inodeというHDDのブロック番号を指す間接ポインターになっています。HDDのブロックサイズを小さく取ることでセクターの無駄を少なく、HDD容量をを効率よく使用できるのですが、inodeはHDD初期化のタイミング(通常はHDDのサイズから十分な数が)で生成され使用中に変更することはできません。小さなファイル(たとえば .html, .css, .js, .c .s などのテキスト系ファイル)をたくさん保存する用途ではinodeを使い切ってしまう場合があります。私は、/var/squid をHTTPプロキシーに使用していたのですが、HDD容量は十分足りているのに、inodeが足りなくなるという結果になってしまったようです。結果的に容量は残っているのに、HDD上に新しいファイルを作成できなくなってしまいます。
このため、squid がプロセスごと停止してしまい、再起動しようとしても squid が起動できないという状況になって、Webページへのアクセスが出来なくなってしまったようです。
df コマンドで /var/squid を表示してみると下のような結果でした。
df の結果 Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad4s1d 10154158 1850178 7491648 20% /mnt /dev/ad2s1d 1214414 958246 159016 86% /var/squid /dev/ad4s1e 50391230 14718944 31640988 32% /home
df -iの結果
Filesystem 1K-blocks Used Avail Capacity iused ifree %iused Mounted on
/dev/ad4s1d 10154158 1850178 7491648 20% 95384 1223526 7% /mnt
/dev/ad2s1d 1214414 958246 159016 86% 164862 0 100% /var/squid
/dev/ad4s1e 50391230 14718944 31640988 32% 37049 6486853 1% /home
解決策自体は明確で、一度保存されているファイルを消すしかありません。
根本的な対策としては、inodeを増やすか、squidの設定を変えて保存するホームページファイル容量を減らすしかありませんが、システムを約半年運用して初めての現象ですから、たまたま最近アクセスしたURLのファイル容量が小さなのもばかりだった(小さなファイルが含まれている割合が高かった)と考えられます。運が悪かったということですね。
inodeを増やすためには、一時的にsquidサービスを停止してHDDをアンマウントし、newfs をかけ直すしかないので、ちょっと面倒です。
今は、回避策として単純に、/var/squid 上の cache フォルダーを初期化することにしました。
「rm -rf cache/0*」でキャッシュ内のフォルダーを全部消し、「squid -z」 でキャッシュフォルダーを再構築。
これで一応回避できましたが、同じ現象が再発する場合は要注意かも。