2015/07/18

Apacheでセマフォを解放

はじめに

Apacheが応答不能になり、再起動しても起動できなくなってしまったので確認すると、セマフォを使い切っていたことが問題だったようなので、その際に調べたことなどをメモします。

セマフォの解放

セマフォとは

セマフォはマルチタスクOSなど、並行して複数のタスク/プロセスが動作するオペレーティングシステムで用意されている仕組みで、既定数以上のプロセスが共有資源(変数やメモリ、ファイル等)に同時にアクセスしないようにカウンタを使って制御する仕組みです。
マルチタスクOSなど、並行して複数のタスク/プロセスが動作するオペレーティングシステムで用意されています。

例えば、IPC(UNIXのAPIの一種)ではプロセス間通信のための機能として用意され、プロセス間の共有資源へのアクセス衝突を防止(排他制御)するために共有メモリー上のフラグ変数を格納したデータ配列、およびそれに対する操作機能として提供/利用されています。
OSにより仕様や使い方に差はありますが、一般にセマフォ用のデータは配列のためフラグは複数個用意することが可能で、処理内容によって使い分けることができます。

原因確認

異常があった場合に確認するものの1つはログです。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のログにこのようなエラーが出力されていると、OSで利用可能なセマフォが限界値に達してしまったために、新しいセマフォを使ってプロセス(ここではApache)を起動することができなくなっている可能性があります。

このような場合、以下のコマンドを実行してセマフォの情報を表示して、使用中のセマフォの数を確認します。

# 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のセマフォを解放する手順になります。

参考

0 Comments:

コメントを投稿