セマフォとは
セマフォとは、並行動作しているプロセス間で同期を行ったり、割り込み処理の制御を実施するメカニズムまたはデータ型や信号のことです。もともとは「手旗信号」の意味を持っています。特に、複数のプロセスでメモリ内の領域やディスク上のファイルを共有している場合、同時にアクセスして内容の破壊や不整合が起きるのを防ぐために使われます。任意の数のリソースを扱うセマフォをカウンティングセマフォ、ロック・アンロックのために値が0と1に制限されているセマフォをバイナリセマフォといいます。
要は、並列動作しているプロセス間のリソース制御をよしなに調整してくれるのが、コンピュータの世界におけるセマフォの役割になります。
Apacheのセマフォ障害
Apacheに限りませんが、このセマフォによる排他制御がうまく行っていない場合、アプリケーションが起動しなくなる場合があります。例えばApacheで、ディスクやメモリに余裕があるのに、以下のエラーログが出てApacheが起動しない場合、セマフォが詰まっていることが原因として考えられます。
[crit] (28)No space left on device: mod_rewrite: could not create rewrite_log_lock Configuration Failed
このようなエラーが出た場合には、セマフォの状態を確認して見ることをオススメします。
セマフォの状態を確認するコマンド
セマフォの状態は、ipcsコマンドで確認できます。
ipcs
------ 共有メモリセグメント --------
キー shmid 所有者 権限 バイト nattch 状態
------ セマフォ配列 --------
キー semid 所有者 権限 nsems
0x00000000 0 root 600 1
0x00000000 32769 root 600 1
0x00000000 3145730 apache 600 1
0x00000000 3178499 apache 600 1
------ メッセージキュー --------
キー msqid 所有者 権限 使用バイト数 メッセージ
セマフォのデータだけ見たい時には、ipcsに-sオプションを付けます。
ipcs -s
------ セマフォ配列 --------
キー semid 所有者 権限 nsems
0x00000000 0 root 600 1
0x00000000 32769 root 600 1
0x00000000 3145730 apache 600 1
0x00000000 3178499 apache 600 1
ここでApache関連のセマフォがずらっと大量に並んでいたら、Apacheユーザーのセマフォに何らかの問題が発生して、Apacheの起動を妨げている可能性があるので、Apacheのセマフォだけをクリアにする必要があります。
Windowsのセマフォの場合
WindowsのCygwinでApacheを動作させている場合は、セマフォの問題が発生すると以下のようなエラーが出ます。
No space left on device: Couldn't create accept lock
ipcsで確認した際の内容も以下のように出力されます。
ipcs -s
Semaphores:
T ID KEY MODE OWNER GROUP
s 65536 0 --rw------- SYSTEM Administrators
s 196609 0 --rw------- SYSTEM Administrators
s 262146 0 --rw------- SYSTEM Administrators
s 262147 0 --rw------- SYSTEM Administrators
s 262148 0 --rw------- SYSTEM Administrators
s 262149 0 --rw------- SYSTEM Administrators
s 262150 0 --rw------- SYSTEM Administrators
s 262151 0 --rw------- SYSTEM Administrators
s 262152 0 --rw------- SYSTEM Administrators
s 262153 0 --rw------- SYSTEM Administrators
Apacheのセマフォの削除
Apache関連のセマフォは以下のコマンドで削除できます。
sudo ipcs -s | grep apache | perl -e 'while (>STDIN<) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'
上記は一括削除の場合ですが、# ipcrm -m (ID)で一個一個消していってもかまいません。Apacheのセマフォクリアはrootユーザーから実行することになると思いますが、間違って他のユーザーのセマフォを消してしまわないように気をつけましょう。
これでApacheが正常稼働できるようになります。