(過去対応メモ)
Apacheなどのサービスが起動できなくなった場合、
排他制御に使われるセマフォが最大値まで積んでしまっている可能性がある。
ログには以下のようなメッセージが出る。
No space left on device: Couldn't create accept lock
セマフォの状態を確認する場合
# ipcs -s
ここで対象サービスのセマフォがたくさん積んでいたらあやしい。
このコマンドで1つずつセマフォを解放することができる。
# ipcrm -m <ID>
それよりもセマフォの最大値を増やした方が良いかもしれない。
最大値を確認
# /sbin/sysctl -a | grep sem
kernel.sem = 250 32000 32 128
(最大値は 128 という意味だったはず)
/etc/sysctl.conf に以下を追記
kernel.sem = 250 32000 32 256
(最大値を256に増やす場合)
反映・確認
# /sbin/sysctl -p
# /sbin/sysctl -a | grep sem
これで起動できなかったサービスが起動できるようになった。
ディスク拡張したらセマフォが上限に達したケース
lvextend と resize2fs でディスク拡張したら以下のようなエラーが出てサーバが固まった。
Limit for the maximum number of semaphores reached.
You can check and set the limits in /proc/sys/kernel/sem.
Unable to resume LV-NAME (253:5)
Problem reactivating logical volume LV-NAME.
Releasing activation in critical section.
libdevmapper exiting with 1 device(s) still suspended.
kernel.sem を増やすのが良さそう。
# cat /proc/sys/kernel/sem
250 32000 100 144
kernel.sem のパラメータの意味はこんな感じ。
250 : セマフォ識別子あたりの最大セマフォ数
32000 : システム全体のセマフォ数
100 : セマフォコールあたりの最大演算子数
144 : システム全体のセマフォ識別子数
システム全体のセマフォ数 = セマフォ識別子あたりの最大セマフォ数 × システム全体のセマフォ識別子数
となるようにした方が良いのだろうか。
発生時の応急措置としてはこんな感じ?
セマフォを増やす。
# echo "750 288000 300 384" > /proc/sys/kernel/sem
デバイスの状態を確認する。
# dmsetup info
問題の発生しているデバイスは State が SUSPENDED になっていると思われる。
デバイスをアクティブにする。
# dmsetup resume
# dmsetup info
恒久対処としてはセマフォをしっかり増やした方が良いかと。
# sysctl -a | grep kernel.sem
# vi /etc/sysctl.conf
kernel.sem = 250 32000 100 144
↓
kernel.sem = 750 288000 300 384
# sysctl -p
# sysctl -a | grep kernel.sem