LoginSignup
1
2

More than 3 years have passed since last update.

セマフォが溜まってサービス起動できない

Last updated at Posted at 2020-10-05

(過去対応メモ)
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
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2