Oracle

[Oracle] 커널 세마포어와 Oracle DB의 관계

bbugge 2021. 2. 4. 15:09

// kernel Semaphore 파라미터

// 세마포어는 여러 프로세스가 공유 자원(메모리 같은?)를 사용하기위해 프로세스의 접근을 직렬화 시켜주는 수단.

// 왼쪽 부터 SEMMSL, SEMMNS, SEMOPM, SEMMNI

sysctl -a | grep kernel.sem

kernel.sem = 250        32000   100     128

 

SEMMSL: 배열당 최대 세마포어 수 (max semaphores per array)
SEMMNS: 시스템 전체 최대 세마포어 수 (max semaphores system wide)
SEMOPM : 세마포어 호출당 최대 operation 수 (max ops per semop call)
SEMMNI: 최대 배열 수(max number of arrays)

 

 

// kernel shared memory 파라미터

kernel.shmmax : 
공유 메모리 세그먼트의 최대 크기를 정의함.
커널이 응용프로그램들에게 메모리를 할당해줄 때 작게 여러 번 할당하지 않고 큰 덩어리(=세그먼트)로
한꺼번에 주게됨. 이값이 너무 작으면 DB를 시작시킬때 
"ORA-27123 : unable to attach to shared memory segment" 
라는 메시지가 발생할 수 있고 너무 크면 세그먼트의 사용되지 않는 빈 공간을 두기 때문에 메모리 낭비가
발생함. 이값의 기본 값은 32MB. 오라클 사용 시에는 2G로 설정하도록 권장.

kernel.shmmni :
공유 메모리 세그먼트의 최대 개수를 설정하는데 사용됨.
기본 값 4096.

kernel.shmall : 
특정 시점에서 시스템에 사용 가능한 공유 메모리의 최대 크기를 설정하는데 사용함.
이 값은 "ceil(shmmax/page_size)" 으로 권장함. 기본 값은 209715 byte.

kernel.shmseg : 
1개의 프로세스에 부여될 수 있는 공유메모리 세그먼트의 최대 개수를 의미함.
위에서 살펴본 shmmni는 시스템 전체에서 사용가능한 공유 메모리 세그먼트의 최대 개수이고 
이 파라미터는 1개의 프로세스가 사용할 수 있는 공유 메모리 세그먼트의 최대 개수.

 

 

// unix 세마포어와 Oracle DB의 관계 (linux와 다른 점이 있을 듯함.)

https://cafe.naver.com/prodba/11187

 

 

// 어떤 프로세스가 세마포어를 잡고있는지 궁금해져서 script로 list 뽑음.

 

# 스크립트 실행시 파라미터(oracle 실행계정) 넣어서 실행
# semaphore check

USERID=$1

SEMID=`ipcs -s | grep $USERID | head -n 1 | awk '{print $2}'`
SEMNUM=`ipcs -s -i $SEMID | awk 'NR>=9' | wc -l`

#echo "semid:"+$SEMID+",semnum:"+$SEMNUM
for ((n=9;n<=$SEMNUM;n++))
do
#echo $n
PID=`ipcs -s -i $SEMID | awk -v ln=$n 'NR>=9&&NR==ln {print $NF}'`
#echo "####PID:"+$PID
if [ $PID != 0 ] && [ -n "$PID" ]
then

PSRESULT=`ps -ef | grep $USERID | grep $PID | grep -v grep`
if [ -z "$PSRESULT" ]
then
        echo -e "[ #PID:$PID ] : cannot found. may be already released."

else
        echo -e "`ipcs -s -i $SEMID | awk -v ln=$n 'NR>=9&&NR==ln{$NF=""; print $0}'`   $PSRESULT"
fi

#echo -e "`ipcs -s -i $SEMID | awk -v ln=$n 'NR>=9&&NR==ln{$NF=""; print $0}'`   `ps -ef | grep $USERID | grep $PID | grep -v grep`"

fi

done

 

[root@oracle12cR2 ~]# sh ./semaphorecheck.sh oracle

[ #PID:3609 ] : cannot find. may be already released.
[ #PID:3609 ] : cannot find. may be already released.
[ #PID:3609 ] : cannot find. may be already released.
[ #PID:3609 ] : cannot find. may be already released.
6 0 1 0    oracle     3678      1  0 08:31 ?        00:00:06 ora_pmon_oradb
7 0 1 0    oracle     3680      1  0 08:31 ?        00:00:02 ora_clmn_oradb
8 0 1 0    oracle     3682      1  0 08:31 ?        00:00:22 ora_psp0_oradb
10 0 1 0    oracle     3689      1  0 08:31 ?        00:00:06 ora_gen0_oradb
11 0 1 0    oracle     3692      1  0 08:31 ?        00:00:03 ora_mman_oradb
12 0 1 0    oracle    37114      1  0 14:31 ?        00:00:00 ora_w003_oradb
13 0 1 0    oracle     3696      1  0 08:31 ?        00:00:18 ora_gen1_oradb
14 0 1 0    oracle     3696      1  0 08:31 ?        00:00:18 ora_gen1_oradb
16 0 1 0    oracle     3703      1  0 08:31 ?        00:00:03 ora_ofsd_oradb
17 0 1 0    oracle     3703      1  0 08:31 ?        00:00:03 ora_ofsd_oradb
18 0 1 0    oracle     3707      1  0 08:31 ?        00:00:28 ora_dbrm_oradb
19 0 0 0    oracle     3709      1  1 08:31 ?        00:04:11 ora_vkrm_oradb
20 0 1 0    oracle     3711      1  0 08:31 ?        00:00:05 ora_svcb_oradb
oracle    37114      1  0 14:31 ?        00:00:00 ora_w003_oradb
21 0 1 0    oracle     3713      1  0 08:31 ?        00:00:10 ora_pman_oradb
23 0 1 0    oracle     3718      1  0 08:31 ?        00:00:03 ora_dbw0_oradb
24 0 1 0    oracle     3720      1  0 08:31 ?        00:00:04 ora_lgwr_oradb
25 0 1 0    oracle     3722      1  0 08:31 ?        00:00:44 ora_ckpt_oradb
26 0 1 0    oracle     3724      1  0 08:31 ?        00:00:02 ora_lg00_oradb
27 0 1 0    oracle     3726      1  0 08:31 ?        00:00:02 ora_smon_oradb
28 0 1 0    oracle     3728      1  0 08:31 ?        00:00:01 ora_lg01_oradb
29 0 1 0    oracle     3730      1  0 08:31 ?        00:00:04 ora_smco_oradb
30 0 1 0    oracle     3732      1  0 08:31 ?        00:00:01 ora_reco_oradb
31 0 1 0    oracle    26651      1  0 13:32 ?        00:00:00 ora_w007_oradb
[ #PID:42677 ] : cannot find. may be already released.
34 0 1 0    oracle     3741      1  0 08:31 ?        00:00:02 ora_pxmn_oradb
35 0 1 0    oracle     3743      1  0 08:31 ?        00:00:02 ora_rbal_oradb
36 0 0 0    oracle     3745      1  0 08:31 ?        00:00:02 ora_asmb_oradb
38 0 1 0    oracle     3751      1  0 08:31 ?        00:02:10 ora_mmon_oradb
39 0 1 0    oracle     3753      1  0 08:31 ?        00:00:03 ora_mmnl_oradb
42 0 1 0    oracle     3759      1  0 08:31 ?        00:00:02 ora_tmon_oradb
43 0 1 0    oracle     3761      1  0 08:31 ?        00:00:07 ora_mark_oradb
44 0 1 0    oracle    37875      1  0 14:42 ?        00:00:00 ora_w001_oradb
45 0 0 0    oracle     3769      1  0 08:31 ?        00:00:00 oracleoradb (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
46 0 1 0    oracle    38173      1  0 14:46 ?        00:00:00 ora_w004_oradb
[ #PID:42679 ] : cannot find. may be already released.
48 0 1 0    oracle     3793      1  0 08:31 ?        00:00:02 ora_tt00_oradb
49 0 1 0    oracle     3795      1  0 08:31 ?        00:00:01 ora_arc0_oradb
50 0 1 0    oracle     3797      1  0 08:31 ?        00:00:01 ora_tt01_oradb
51 0 1 0    oracle     3799      1  0 08:31 ?        00:00:03 ora_arc1_oradb
52 0 1 0    oracle     3801      1  0 08:31 ?        00:00:01 ora_arc2_oradb
53 0 1 0    oracle     3803      1  0 08:31 ?        00:00:01 ora_arc3_oradb
55 0 1 0    oracle     3816      1  0 08:31 ?        00:00:01 ora_aqpc_oradb
56 0 1 0    oracle     3822      1  0 08:31 ?        00:01:28 ora_cjq0_oradb
57 0 1 0    oracle     5447      1  0 08:51 ?        00:02:03 ora_o000_oradb
[ #PID:39938 ] : cannot find. may be already released.
[ #PID:38918 ] : cannot find. may be already released.
[ #PID:38820 ] : cannot find. may be already released.
[ #PID:34867 ] : cannot find. may be already released.
62 0 1 0    oracle     3940      1  0 08:31 ?        00:00:02 ora_qm02_oradb
[ #PID:34494 ] : cannot find. may be already released.
64 0 1 0    oracle     3969      1  0 08:31 ?        00:00:02 ora_q001_oradb
[ #PID:14330 ] : cannot find. may be already released.
67 0 1 0    oracle     3981      1  0 08:31 ?        00:00:01 ora_q003_oradb
[ #PID:3983 ] : cannot find. may be already released.
[ #PID:3985 ] : cannot find. may be already released.
[ #PID:4080 ] : cannot find. may be already released.
[ #PID:4061 ] : cannot find. may be already released.
[ #PID:4053 ] : cannot find. may be already released.
[ #PID:4059 ] : cannot find. may be already released.
[ #PID:4057 ] : cannot find. may be already released.
[ #PID:4072 ] : cannot find. may be already released.
[ #PID:4068 ] : cannot find. may be already released.
[ #PID:4078 ] : cannot find. may be already released.

[root@oracle12cR2 ~]# sh ./semaphorecheck.sh grid

[ #PID:3185 ] : cannot found. may be already released.
[ #PID:3185 ] : cannot found. may be already released.
[ #PID:3185 ] : cannot found. may be already released.
[ #PID:3185 ] : cannot found. may be already released.
8 0 1 0    grid       3227      1  0 08:26 ?        00:00:21 asm_psp0_+ASM
10 0 1 0    grid       3234      1  0 08:26 ?        00:00:07 asm_gen0_+ASM
11 0 1 0    grid       3236      1  0 08:26 ?        00:00:02 asm_mman_+ASM
17 0 1 0    grid       3251      1  0 08:26 ?        00:00:02 asm_dbw0_+ASM
18 0 1 0    grid       3253      1  0 08:26 ?        00:00:02 asm_lgwr_+ASM
19 0 1 0    grid       3255      1  0 08:26 ?        00:00:03 asm_ckpt_+ASM
23 0 1 0    grid       3263      1  0 08:26 ?        00:00:07 asm_rbal_+ASM
24 0 1 0    grid       3265      1  0 08:26 ?        00:00:25 asm_gmon_+ASM
25 0 1 0    grid       3267      1  0 08:26 ?        00:00:09 asm_mmon_+ASM
[ #PID:3272 ] : cannot found. may be already released.
[ #PID:3276 ] : cannot found. may be already released.
29 0 1 0    grid       3749      1  0 08:31 ?        00:00:08 oracle+ASM_asmb_oradb (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
31 0 1 0    grid       3650      1  0 08:30 ?        00:00:08 oracle+ASM_asmb_+asm (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
[ #PID:5124 ] : cannot found. may be already released.
[ #PID:44598 ] : cannot found. may be already released.
[ #PID:44486 ] : cannot found. may be already released.
[ #PID:18157 ] : cannot found. may be already released.
[ #PID:4247 ] : cannot found. may be already released.

 

 

// 3번째 인수가 1이면 아직 세마포어를 사용하고 있는 것임. 0이라면 메모리를 사용하고 세마포어를 반납한 상태.

// process id를 ps 명령어에서 찾지 못하면 'cannot find. may be already released.' 메시지를 출력한다. 즉, 과거에 존재했던 프로세스가 세마포어를 사용하고 반납 후, 종료되거나 kill 되어진 것임.