使用shell脚本监控共享池内存碎片
生活随笔
收集整理的這篇文章主要介紹了
使用shell脚本监控共享池内存碎片
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用shell腳本監控共享池內存碎片
環境
[monitor:/]#uname -a
HP-UX monitor B.11.11 U 9000/785 2013813380 unlimited-user license
Release 9.2.0.6.0 - Production on Thu Oct 16 10:18:15 2008
dump共享池內存信息
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump heapdump 2
Statement processed.
SQL> oradebug tracefile_name
/oracle/app/oracle/product/920/admin/robin/udump/robin_ora_4479.trc
SQL> exit
基本原理
在Oracle9i中,管理共享池內存的Free Lists被劃分為255個Bucket,每個Bucket容納的size為一定范圍的內存塊chunk,通過內部視圖x$ksmsp來監控shared pool的碎片情況,其中每一行都代表著shared pool中的一個chunk。從heapdump中dump出來的內存信息dump到跟蹤文件后,有一定的規律和格式來記載這些信息。首先通過shell腳本對這些存儲桶進行格式化,過濾出存儲桶編號和對應的size范圍,然后使用sed和awk對其進行處理,生成查詢sql語句,實現對x$ksmsp的查詢,統計每個存儲桶對應的記錄行數。根據chunk的數量來量度碎片程度。
使用shell腳本對robin_ora_4479.trc文件進行處理
grep Bucket robin_ora_4479.trc >tmp.lst
cat tmp.lst
sed 's/size=/ksmchsiz>=/' tmp.lst >tmp2.lst
cat tmp2.lst
sed 's/ Bucket //' tmp2.lst | sort -nr > tmp.lst
cat tmp.lst
vi hxc.sh
echo 'select ksmchidx,(case'? ?? ?? ???
cat tmp.lst | while read LINE
do
??echo $LINE | awk '{print "when " $2 " then " $1}'
done
echo 'end) bucket#,'??
echo '? ???count(*) free_chunks,'??
echo '? ???sum(ksmchsiz) free_space,'??
echo '? ???trunc(avg(ksmchsiz)) avg_chunk_size'??
echo 'from x$ksmsp'??
echo "where ksmchcls = 'free'"
echo 'group by ksmchidx,(case';
cat tmp.lst | while read LINE
do
??echo $LINE | awk '{print "when " $2 " then " $1}'
done
echo 'end);'? ?
monitor:/home/oracle $chmod 777 hxc.sh
monitor:/home/oracle $sh hxc.sh
下面是輸出結果(簡略):
select ksmchidx,
? ?? ? (case
? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ? 254
? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ? 253
? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ? 1
? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ? 0
? ?? ? end) bucket#,
? ?? ? count(*) free_chunks,
? ?? ? sum(ksmchsiz) free_space,
? ?? ? trunc(avg(ksmchsiz)) avg_chunk_size
??from x$ksmsp
where ksmchcls = 'free'
group by ksmchidx,
? ?? ?? ? (case
? ?? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ?? ? 254
? ?? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ?? ? 253
? ?? ?? ?? ?when ksmchsiz >= 16408 then
? ?? ?? ?? ? 2
? ?? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ?? ? 1
? ?? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ?? ? 0
? ?? ?? ? end);
可以創建一張表,將結果存儲起來進行分析
create table hxc_tmp as (select ksmchidx,
? ?? ? (case
? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ? 254
? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ? 253
? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ? 1
? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ? 0
? ?? ? end) bucket#,
? ?? ? count(*) free_chunks,
? ?? ? sum(ksmchsiz) free_space,
? ?? ? trunc(avg(ksmchsiz)) avg_chunk_size
??from x$ksmsp
where ksmchcls = 'free'
group by ksmchidx,
? ?? ?? ? (case
? ?? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ?? ? 254
? ?? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ?? ? 253
? ?? ?? ?? ?when ksmchsiz >= 16408 then
? ?? ?? ?? ? 2
? ?? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ?? ? 1
? ?? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ?? ? 0
? ?? ?? ? end));
查詢其中的列
select t.bucket#,t.free_chunks from tmp_hxc t;
并生成圖片如下:
說明:
Size越小的高峰的峰值越多,說明共享池中的碎片越多,表明bucket經過很多次分割,分割后較小的chunk越來越多,即表明每個桶(Bucket)對應的自由的內存片越多,碎片越嚴重,管理越復雜,從而使得搜索時間變長,latch持有時間變長,性能變差。當然,size較大的bucket的峰值可以較高,這說明內存分割不厲害。
可以對比一下,將共享池內存flush后,看看對應的圖片,可以進行簡單對比。
alter system flush shared_pool;
從上面可以看出,將共享池flush之后,碎片情況有所減輕。
環境
[monitor:/]#uname -a
HP-UX monitor B.11.11 U 9000/785 2013813380 unlimited-user license
Release 9.2.0.6.0 - Production on Thu Oct 16 10:18:15 2008
dump共享池內存信息
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump heapdump 2
Statement processed.
SQL> oradebug tracefile_name
/oracle/app/oracle/product/920/admin/robin/udump/robin_ora_4479.trc
SQL> exit
基本原理
在Oracle9i中,管理共享池內存的Free Lists被劃分為255個Bucket,每個Bucket容納的size為一定范圍的內存塊chunk,通過內部視圖x$ksmsp來監控shared pool的碎片情況,其中每一行都代表著shared pool中的一個chunk。從heapdump中dump出來的內存信息dump到跟蹤文件后,有一定的規律和格式來記載這些信息。首先通過shell腳本對這些存儲桶進行格式化,過濾出存儲桶編號和對應的size范圍,然后使用sed和awk對其進行處理,生成查詢sql語句,實現對x$ksmsp的查詢,統計每個存儲桶對應的記錄行數。根據chunk的數量來量度碎片程度。
使用shell腳本對robin_ora_4479.trc文件進行處理
grep Bucket robin_ora_4479.trc >tmp.lst
cat tmp.lst
sed 's/size=/ksmchsiz>=/' tmp.lst >tmp2.lst
cat tmp2.lst
sed 's/ Bucket //' tmp2.lst | sort -nr > tmp.lst
cat tmp.lst
vi hxc.sh
echo 'select ksmchidx,(case'? ?? ?? ???
cat tmp.lst | while read LINE
do
??echo $LINE | awk '{print "when " $2 " then " $1}'
done
echo 'end) bucket#,'??
echo '? ???count(*) free_chunks,'??
echo '? ???sum(ksmchsiz) free_space,'??
echo '? ???trunc(avg(ksmchsiz)) avg_chunk_size'??
echo 'from x$ksmsp'??
echo "where ksmchcls = 'free'"
echo 'group by ksmchidx,(case';
cat tmp.lst | while read LINE
do
??echo $LINE | awk '{print "when " $2 " then " $1}'
done
echo 'end);'? ?
monitor:/home/oracle $chmod 777 hxc.sh
monitor:/home/oracle $sh hxc.sh
下面是輸出結果(簡略):
select ksmchidx,
? ?? ? (case
? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ? 254
? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ? 253
? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ? 1
? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ? 0
? ?? ? end) bucket#,
? ?? ? count(*) free_chunks,
? ?? ? sum(ksmchsiz) free_space,
? ?? ? trunc(avg(ksmchsiz)) avg_chunk_size
??from x$ksmsp
where ksmchcls = 'free'
group by ksmchidx,
? ?? ?? ? (case
? ?? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ?? ? 254
? ?? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ?? ? 253
? ?? ?? ?? ?when ksmchsiz >= 16408 then
? ?? ?? ?? ? 2
? ?? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ?? ? 1
? ?? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ?? ? 0
? ?? ?? ? end);
可以創建一張表,將結果存儲起來進行分析
create table hxc_tmp as (select ksmchidx,
? ?? ? (case
? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ? 254
? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ? 253
? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ? 1
? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ? 0
? ?? ? end) bucket#,
? ?? ? count(*) free_chunks,
? ?? ? sum(ksmchsiz) free_space,
? ?? ? trunc(avg(ksmchsiz)) avg_chunk_size
??from x$ksmsp
where ksmchcls = 'free'
group by ksmchidx,
? ?? ?? ? (case
? ?? ?? ?? ?when ksmchsiz >= 65560 then
? ?? ?? ?? ? 254
? ?? ?? ?? ?when ksmchsiz >= 32792 then
? ?? ?? ?? ? 253
? ?? ?? ?? ?when ksmchsiz >= 16408 then
? ?? ?? ?? ? 2
? ?? ?? ?? ?when ksmchsiz >= 40 then
? ?? ?? ?? ? 1
? ?? ?? ?? ?when ksmchsiz >= 32 then
? ?? ?? ?? ? 0
? ?? ?? ? end));
查詢其中的列
select t.bucket#,t.free_chunks from tmp_hxc t;
并生成圖片如下:
說明:
Size越小的高峰的峰值越多,說明共享池中的碎片越多,表明bucket經過很多次分割,分割后較小的chunk越來越多,即表明每個桶(Bucket)對應的自由的內存片越多,碎片越嚴重,管理越復雜,從而使得搜索時間變長,latch持有時間變長,性能變差。當然,size較大的bucket的峰值可以較高,這說明內存分割不厲害。
可以對比一下,將共享池內存flush后,看看對應的圖片,可以進行簡單對比。
alter system flush shared_pool;
從上面可以看出,將共享池flush之后,碎片情況有所減輕。
總結
以上是生活随笔為你收集整理的使用shell脚本监控共享池内存碎片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Oracle管理及常用基础脚本
- 下一篇: 实例讲解如何通过Oracle成功发送邮件