Apache が「No space left on device」で起動しない

<景品表示法に基づく表記> 本サイトのコンテンツには、商品プロモーションが含まれている場合があります。

Apache が再起動できない

Apacheを再起動したところ、エラーログを出力して起動出来なくなりました。

 [core:emerg] [pid 6004] (28)No space left on device: AH00023: Couldn't create the mpm-accept mutex

かなり焦りました。設定が悪いわけではないのにエラーで起動できないのは困ったものです。
「No space」とのことなので

df コマンドでディスクの空き容量を確認しても問題なし。
free コマンドでメモリの空き容量を見ても特に問題なし。

なのに何度Apacheを起動してもこのエラーが出力されてサービスが上がってこない。

「mpm-accept mutex」が気になるが、直ぐに意味を理解できない。

このサーバはリバースプロキシとして動作させているので被害が大きい。
冗長化させずシングルで動かしていたので

 

「立ち上がらない」=「サービス停止」

 

原因調査よりもサービス復旧を優先させる事にしました。まずは、とりあえずの再起動です。その結果、何事もなかったようにApacheが起動し一難が去りました。

原因は何だった?

復旧後、エラーログの「mutex」と記載されていたので、これを手掛かりに調査しました。調べてみると「セマフォが上限値に達してしまった」ことが分かりました。

ミューテックス (mutex)とは排他制御の仕組みで

値に0か1しか取らないセマフォのような仕組み

だそうで、このミューテックスはセマフォのパラメータを利用してOSが制御しているそうです。
エラーログには「mutex」ではなく「semaphore」を記載して欲しいものです。

設定の確認

Apacheユーザのセマフォを確認

#  ipcs -s
------ セマフォ配列 --------
キー     semid      所有者  権限     nsems
0x00000000 393216     apache     600        1
0x00000000 425985     apache     600        1
0x00000000 458754     apache     600        1
0x00000000 163843     apache     600        1
0x00000000 491524     apache     600        1
0x00000000 524293     apache     600        1
0x00000000 557062     apache     600        1

セマフォの上限値を確認

# /sbin/sysctl -a | grep sem
kernel.sem = 250	32000	32	128

これで上限値は128ということになるそうです。

対策を検討する

上限値を上げる事も考えましたが

根本原因では無い

増えてきた事を監視することも考えましたが

Apacheを止めて残っているセマフォを整理する必要がある

結局は

サービス停止が必要になる

値を変更せず、定期的にOSの再起動をすることで様子見にすることにしました。