본 문서는 OUT_OF_SHP 현상에 대한 쉘스크립트의 사용 방법을 안내합니다.
이를 통해 단편화로 인한 현상인지 확인할 수 있습니다.
1. 개요
다량의 리터럴쿼리는 SHP에 다량의 ppc할당을 위한 메모리 점유-해지를 반복하며 메모리 단편화를 야기합니다.
ALTER SYSTEM FLUSH PPC; 명령어를 사용하여도 해지하고 싶은 PP들의 Life Cycle이 끝나지 않는다면,
메모리 점유는 해지되지 않으므로 OUT_OF_SHP 에러가 발생할 수 있습니다.
1.1. 현상
trace.log 파일에 아래와 같은 메시지와 함께 쿼리 수행에 실패합니다.
THROW. ec=ERROR_OUT_OF_SHP(-3002) [ Out of memory (unable to allocate 1874648 bytes of shared
pool memory). ] (csr_id:720599) [shp_alloc.c:538:shp_malloc_dbginfo
로그상 약 1.7MB를 할당 받으려고 시도 하지만, 연속된 1.7MB 의 SHP 공간이 없어 수행에 실패하거나 에러가 발생합니다.
2. 시나리오
2.1. 쉘스크립트 작성
편의에 따라 max_m 변수의 단위를 조정하여 사용합니다.
#!/bin/bash
if [ $# != 2 ]; then
echo "usage: max_chunk.sh [CHUNK] [DUMP]"
exit
fi
max=0
for i in `grep $1 $2 | awk '{print $2}'`
do
if [[ "$i" -gt "$max" ]]; then
max="$i"
fi
done
max_m=`expr $max / 1024 / 1024`
echo "the largest $1 chunk size in $2 is $max_m Mbytes"
2.2. SHARED DUMP 수행
SQL> ALTER SYSTEM DUMP SHARED POOL;
System altered.
2.3. DUMP 발생 확인
DUMP 발생 기본위치는 $TB_HOME/instance/$TB_SID/dump/tracedump 또는 TRACE_DUMP_DEST 파라미터값의 위치입니다.
2.4. 쉘스크립트 수행
# sh max_chunk.sh FREE tb_dump_3256_38_1404859.trc
the largest FREE chunk size in tb_dump_3256_38_1404859.trc is 1 Mbytes
3. 결과
쉘스크립트 수행 결과 사용 가능한 SHP의 연속적인 공간이 1MB 이며, 단편화가 발생했음을 추정할 수 있습니다.
쉘스크립트 사용 사례)
2~3주에 1회 OUT_OF_SHP 가 발생하는 사이트에서 에러발생 전 단편화를 예측하여 DB 재기동 PM을 수행하는 방안을 모색하였습니다.
해당 쉘을 통한 모니터링 방법으로 단편화를 예측한 사례가 있습니다.