Sobras de semáforos na máquina linux

2

Ao gerenciar grandes ambientes de servidores Linux, vejo algumas vezes as máquinas atingirem seus limites de IPC, mais especificamente, sobras de semáforos:

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

Olhando um semáforo específico, só consigo ver o último processo acessado no semáforo:

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 

Nenhum dos processos existe mais.

Qual é a maneira mais eficaz de solucionar o problema e descobrir por que os semáforos não são excluídos corretamente?

Outra pergunta, mais geral, é por que o sistema operacional não colhe semáforos não utilizados da mesma maneira que os processos órfãos?

    
por agoldis 17.07.2014 / 10:59

1 resposta

2

Isso funcionou para mim, remova o semáforo quando o último processo não está em execução, mas seja cauteloso, talvez o semáforo seja usado por outros processos.

for semid in 'ipcs -s | cut -d" " -f 2' ; do pid='ipcs -s -i $semid | tail -n 2 | head -n 1 | awk '{print $5}''; running='ps --no-headers -p $pid | wc -l' ; if [ $running -eq 0 ] ; then ipcrm -s $semid ; fi ; done
    
por 17.02.2016 / 17:57

Tags