はじめに
Apacheが応答不能になり、再起動しても起動できなくなってしまったので確認すると、セマフォを使い切っていたことが問題だったようなので、その際に調べたことなどをメモします。
セマフォとは
セマフォは、マルチタスクOSなどの並行して複数のタスク/プロセスが動作するOSに用意されている仕組みで、既定数以上のプロセスが共有資源(変数やメモリ、ファイル等)に同時にアクセスしないようにカウンタを使って、並行処理を管理するための仕組みであるようです。(が、文字だけだとよくわかりません)
Apache のエラー確認
Apacheのログを見ると以下のエラーが出ていました。
[emerg] (28)No space left on device: Couldn't create accept lock ($APACHE_LOG_DIR/logs/accept.lock.12236) (5)
Notice: cleaning up shared memory
Apacheのログにこのようなエラーが出力されていると、生成可能なセマフォが限界値に達してしまったために、新しいセマフォを使ってプロセス(ここではApache)を起動することができなくなっている可能性があります。
このような場合、以下のコマンドを実行してセマフォの情報を表示して、使用中のセマフォの数を確認します。
httpd のプロセスがたくさんセマフォを生成しているようです。※出力値に関して、他のプロセスが以下のキーを利用してアクセスして排他制御等に利用し、 nsems の値の数だけこのプロセスのセマフォにアクセス可能、といった感じかと思っていますが違うかもしれません。
# ipcs -s
------ セマフォ配列 --------
キー semid 所有者 権限 nsems
0x0052e2c1 0 httpd 600 17
0x0052e2c2 32769 httpd 600 17
0x0052e2c3 65538 httpd 600 17
0x0052e2c4 98307 httpd 600 17
0x0052e2c5 131076 httpd 600 17
:
# ipcs -s | grep httpd | wc -l
128
それが以下カーネルパラメータの一番右の設定値と同じであれば、セマフォの枯渇が原因になります。
# sysctl -a | grep kernel.sem
kernel.sem = 250 32000 32 128
カーネルパラメータは以下を意味します。
パラメータ | 設定例 | 説明 |
---|---|---|
kernel.sem | SEMMSL SEMMNS SEMOPM SEMMNI | スペースで区切られた4つの値で設定します。4つの値はそれぞれ以下を意味します。 |
SEMMSL セマフォ数の最大値
SEMMNS システム全体のセマフォの最大値
SEMOPM semop(2)コールに指定されるオペレーション数の最大値
SEMMNI セマフォ識別子の最大値
sysctl
の結果から、ここではセマフォの限界値が128個であることを意味します。この結果と
復旧方法
こうなった場合、不要と思われるセマフォを使っているプロセスをKILLすることで復旧できます。
プロセスIDを1つずつ削除するには以下のコマンドを実行します。
# ipcrm -m プロセスID
httpdのプロセスIDを一度に取得して削除するには以下のコマンドを実行します。
# for i in `ipcs -s | awk '/httpd/ {print $2}'`; do (ipcrm -s $i); done