dshimizu/blog/alpha

とりとめのないITブログ

Apacheが応答不能になった原因がセマフォ枯渇だった場合の復旧手順のメモ書き

はじめに

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個であることを意味します。この結果とipcsで出力される結果の個数が128であれば、

復旧方法

こうなった場合、不要と思われるセマフォを使っているプロセスをKILLすることで復旧できます。

プロセスIDを1つずつ削除するには以下のコマンドを実行します。

# ipcrm -m プロセスID

httpdのプロセスIDを一度に取得して削除するには以下のコマンドを実行します。

# for i in `ipcs -s | awk '/httpd/ {print $2}'`; do (ipcrm -s $i); done

おわりに

以上がApacheセマフォを解放する手順になります。

参考