Управляя средой с большими серверами Linux, я иногда вижу, что машины достигают своих пределов IPC, точнее, остатков семафоров:
Linux #ipcs -u | grep -B2 sema
------ Semaphore Status --------
used arrays = 1024
allocated semaphores = 3072
Linux #ipcs -l | grep -B2 sema
------ Semaphore Limits --------
max number of arrays = 1024
max semaphores per array = 250
max semaphores system wide = 256000
max ops per semop call = 32
semaphore max value = 32767
Глядя на конкретный семафор, я вижу только последний процесс, получивший доступ к семафору:
Linux #ipcs -s -i 63636429
Semaphore Array semid=63636429
uid=11488322 gid=12460 cuid=11488322 cgid=12460
mode=0666, access_perms=0666
nsems = 3
otime = Mon Jul 14 16:02:09 2014
ctime = Mon Jul 14 16:02:05 2014
semnum value ncount zcount pid
0 1 0 0 11551
1 0 0 0 11551
2 0 0 0 11551
Ни один из процессов больше не существует.
Как наиболее эффективно решить проблему и выяснить, почему семафоры не удаляются должным образом?
Другой, более общий вопрос: почему ОС не получает неиспользуемые семафоры способом, аналогичным потерянным процессам?