2016/02/23

No space left on deviceでApacheが起動できない

Sakuraのシンプル監視からSlackにサーバのApacheが止まったよと連絡が来てたのでサーバに入ってApacheの再起動をすると、
Apache start [OK]
とは出るものの、psコマンドで確認してもプロセスは立ち上がらず。



Apacheのエラーログを見てみると、
[Tue Feb 23 09:51:10 2016] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.14907) (5)
というログが出ている。

df コマンドでディスクの空き容量を確認しても、freeでメモリの空き容量を見ても特に問題ないのだが、 何度Apacheを起動してもこのエラーで上がってこない。
AWSでロードバランサ使ってとかなら、とりあえずこのサーバ外して調べたかったのだが、 DNSラウンドロビンで貧乏臭く運用していると簡単に外せないのでこういう時に困る。

止まっていたのはフロントエンドのアプリケーションサーバで他のサーバに影響を与えないので、 とりあえず、何も考えなしにrebootしてみたところ、問題なくApacheが起動した。
とりあえず一難去った。

原因は何だったのか?

後から調べてみると、「セマフォが限界値に達してしまったために新しいセマフォを使ってアプリケーションを起動することができなくなってしまった」時にこのエラーが出てくるようだ。


Apacheユーザのセマフォを確認
# ipcs -s
------ セマフォ配列 --------
キー     semid      所有者  権限     nsems
0x00000000 0          root       600        1
0x00000000 32769      root       600        1
0x00000000 262146     apache     600        1
0x00000000 294915     apache     600        1
セマフォの限界値を確認
# /sbin/sysctl -a | grep sem
kernel.sem = 250 32000 32 128
セマフォの限界値は128ということになるらしい。
Apacheの再起動時に子プロセスが残ったままApacheを起動しようとして 溜まっていくことがあるとのこと。
# for i in `ipcs -s | awk '/httpd/ {print $2}'`; do (ipcrm -s $i); done
のコマンドで残ってる子プロセスをバシッとKILLできるとのこと。
監視プログラムで、
Apache調子悪い時に、 Apache stopさせる、セマフォのお掃除する、Apache startさせる
と言った感じで復帰させるように書いておくのも良いかもしれない。

セマフォの限界値を引き上げる

限界値を引き上げても一時しのぎにしかならないのかもしれないけれど、 128はちょっと少なすぎるんじゃないかなぁと感じるので、設定値を引き上げる。

/etc/sysctl.conf に以下の行を追加
# Semaphore
kernel.sem = 250 32000 32 1024
kernel.semのパラメータは、
1つ目:セマフォ識別子あたりの最大セマフォ数
2つ目:システム全体のセマフォ数
3つ目:セマフォコールあたりの最大演算子数
4つ目:システム全体のセマフォ識別子数

ということで、2つ目のパラメータを増やしているところも見かけたが、 とりあえず、4つ目のパラメータのみを増やしてみた。
修正をしたら
# /sbin/sysctl -p
# /sbin/sysctl -a | grep sem
で設定が反映されているかを確認する。

とりあえず、これで様子見。


参考にしたサイト

・apacheのエラーログに「No space left on device: Couldn't create accept lock 」という文字が出力されていました。
https://teratail.com/questions/367
・Apache: No space left on device: Couldn’t create accept lock
https://major.io/2007/08/24/apache-no-space-left-on-device-couldnt-create-accept-lock/
・[emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.31012)
http://blog.livedoor.jp/kyamanashi/archives/51020772.html
・そういえばセマフォというのがありまして・・・ https://www.usptomo.com/PAGE=20130329APACHE
・システムパラメーターのチューニング【Linux】
http://software.fujitsu.com/jp/manual/manualfiles/m110009/b1x10033/03z200/b0033-00-02-01-01.html

0 コメント:

コメントを投稿