리눅스 머신에서 남은 세마포어


2

대규모 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 

더 이상 존재하는 프로세스가 없습니다.

문제를 해결하고 세마포어가 올바르게 삭제되지 않은 이유를 찾는 가장 효과적인 방법은 무엇입니까?

더 일반적인 또 다른 질문은 OS가 고아 프로세스와 유사한 방식으로 사용되지 않는 세마포어를 얻지 못하는 이유는 무엇입니까?


1
세마포어는 일반적으로 여러 프로세스에서 사용됩니다. 따라서 자동으로 제거되지 않습니다. 누군가가 심층 답변을 제공 할 것이라고 확신합니다.
Daniel B

답변:


2

이것은 나를 위해 일했습니다. 마지막 프로세스가 실행 중이 지 않을 때 세마포어를 제거하지만 조심해야합니다. 아마도 다른 프로세스에서 세마포어를 사용했을 수 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.