日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Know more about Cache Buffer Handle

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Know more about Cache Buffer Handle 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在之前的文章《latch free:cache buffer handles造成的SQL性能問(wèn)題》中我介紹了cache buffer handle latch的一些知識(shí),在這里我們復(fù)習(xí)一下: "當(dāng)會(huì)話(huà)需要pin住buffer header時(shí)它首先要獲去buffer handle,得到buffer handle的過(guò)程中首先要搶占cache buffer handles栓,為了避免對(duì)于cache buffer handles栓的過(guò)度爭(zhēng)用,每個(gè)會(huì)話(huà)被允許cache一小撮buffer handles,也叫保留集(reserved set)。該保留集的上限由隱式參數(shù)_db_handles_cached(默認(rèn)為5)所控制,在此基礎(chǔ)上會(huì)話(huà)在執(zhí)行不是十分復(fù)雜的SQL時(shí)不必反復(fù)申請(qǐng)栓。 同時(shí)存在一些十分復(fù)雜的語(yǔ)句,需要同時(shí)pin住大量的緩存,此時(shí)若存在空閑的handle,會(huì)話(huà)被允許索要手頭5個(gè)cached buffer handles以外的handle。也為了限制單個(gè)會(huì)話(huà)的資源占用量,Oracle通過(guò)內(nèi)部算法總是盡量讓每個(gè)進(jìn)程能夠pin住”合理份額“的buffer,由此單個(gè)會(huì)話(huà)同一時(shí)間所能持有的總handle數(shù)等于db_block_buffers/processes,隱式參數(shù)_cursor_db_buffers_pinned指出了該值。另cache buffer handles并沒(méi)有子栓,僅有父栓本身,所以如果系統(tǒng)中有大量復(fù)雜SQL,會(huì)話(huà)所能cache的buffer handles遠(yuǎn)不足以滿(mǎn)足需求時(shí),該栓就成為整個(gè)系統(tǒng)性能的瓶頸,甚至可能出現(xiàn)潛在的死鎖/餓死問(wèn)題。" 應(yīng)網(wǎng)友在T.ASKMACLEAN.COM上的提問(wèn),我們介紹更多cache Buffer handle相關(guān)的知識(shí): ? cache buffer handle 結(jié)構(gòu): ? ------------------------------ | Buffer state object | ------------------------------ | Place to hang the buffer | ------------------------------ | Consistent Get? | ------------------------------ | Proc Owning SO | ------------------------------ | Flags(RIR) | ------------------------------ ? 來(lái)看一個(gè) cache buffer handle SO: 70000046fdfe530, type: 24, owner: 70000041b018630, flag: INIT/-/-/0x00 (buffer) (CR) PR: 70000048e92d148 FLG: 0x500000 lock rls: 0, class bit: 0 kcbbfbp: [BH: 7000001c7f069b0, LINK: 70000046fdfe570] where: kdswh02: kdsgrp, why: 0 BH (7000001c7f069b0) file#: 12 rdba: 0x03061612 (12/398866) class: 1 ba: 7000001c70ee000 set: 75 blksize: 8192 bsi: 0 set-flg: 0 pwbcnt: 0 dbwrid: 2 obj: 66209 objn: 48710 tsn: 6 afn: 12 hash: [700000485f12138,700000485f12138] lru: [70000025af67790,700000132f69ee0] lru-flags: hot_buffer ckptq: [NULL] fileq: [NULL] objq: [700000114f5dd10,70000028bf5d620] use: [70000046fdfe570,70000046fdfe570] wait: [NULL] st: SCURRENT md: SHR tch: 0 flags: affinity_lock LRBA: [0x0.0.0] HSCN: [0xffff.ffffffff] HSUB: [65535] where: kdswh02: kdsgrp, why: 0 # Example: #?? (buffer) (CR) PR: 37290 FLG:??? 0 #?? kcbbfbp??? : [BH: befd8, LINK: 7836c] (WAITING) Buffer handle (X$KCBBF) kernel cache, buffer buffer_handles Query x$kcbbf? - lists all the buffer handles 相關(guān)參數(shù) _db_handles ?? ???????? System-wide simultaneous buffer operations ,no of buffer handles _db_handles_cached ??? ?Buffer handles cached each process , no of processes? default 5 _cursor_db_buffers_pinned? additional number of buffers a cursor can pin at once _session_kept_cursor_pins? ??? ?Number of cursors pins to keep in a session When a buffer is pinned it is attached to buffer state object. ? ? 接下來(lái) 我們實(shí)際體驗(yàn)一下 cache buffer handles latch 和 buffer pin的影響: ? ? SESSION A :SQL> select * from v$version;BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi PL/SQL Release 10.2.0.5.0 - Production CORE??? 10.2.0.5.0????? Production TNS for Linux: Version 10.2.0.5.0 - Production NLSRTL Version 10.2.0.5.0 - ProductionSQL> create table test_cbc_handle(t1 int);Table created.SQL> insert into test_cbc_handle values(1);1 row created.SQL> commit;Commit complete.SQL> select rowid from test_cbc_handle; ROWID ------------------ AAANO6AABAAAQZSAAASQL> select * from test_cbc_handle where rowid='AAANO6AABAAAQZSAAA';T1 ----------1 SQL> select addr,name from v$latch_parent where name='cache buffer handles';ADDR???????????? NAME ---------------- -------------------------------------------------- 00000000600140A8 cache buffer handlesSQL> select to_number('00000000600140A8','xxxxxxxxxxxxxxxxxxxx') from dual;TO_NUMBER('00000000600140A8','XXXXXXXXXXXXXXXXXXXX') ----------------------------------------------------1610694824注意cache buffer handles只有一個(gè)parent latch 而沒(méi)有 child latch我們讓SESSION A hold 住唯一的一個(gè)cache buffer handles parent latch 這會(huì)用到 oradebug call kslgetl 命令, kslgetl是oracle內(nèi)部get latch的函數(shù)SQL> oradebug setmypid; Statement processed.SQL> oradebug call kslgetl 1610694824 1; Function returned 1另外開(kāi)一個(gè)SESSION B 來(lái)觀(guān)察:SQL> select * from v$latchholder;PID??????? SID LADDR??????????? NAME?????????????????????????????????????????????????????????????????? GETS ---------- ---------- ---------------- ---------------------------------------------------------------- ----------15??????? 141 00000000600140A8 cache buffer handles??????????????????????????????????????????????????? 119cache buffer handles latch 確實(shí)被session A hold住了,這將阻塞其他進(jìn)程acquire cache buffer handle latchSQL> select * from test_cbc_handle where rowid='AAANO6AABAAAQZSAAA';T1 ----------1但此時(shí)其他Server Process還是可以正常 read buffer, 這是因?yàn)殡[藏參數(shù)"_db_handles_cached", 默認(rèn)process會(huì)cache 5個(gè) cache buffer handle 修改"_db_handles_cached"=0,讓process不再擁有5個(gè)緩存的cache buffer handle , 這將導(dǎo)致 process 若需要pin buffer,則必須hold cache buffer handle latch以便分配一個(gè)cache buffer handleSQL> alter system set "_db_handles_cached"=0 scope=spfile;System altered.并重啟實(shí)例 shutdown immediate; startup;session A:SQL> oradebug setmypid; Statement processed.SQL> oradebug call kslgetl 1610694824 1; Function returned 1session B:select * from test_cbc_handle where rowid='AAANO6AABAAAQZSAAA';session B hang!!WHY?SQL> oradebug setmypid; Statement processed.SQL> oradebug dump systemstate 266; Statement processed.SO: 0x11b30b7b0, type: 2, owner: (nil), flag: INIT/-/-/0x00(process) Oracle pid=22, calls cur/top: (nil)/0x11b453c38, flag: (0) -int error: 0, call error: 0, sess error: 0, txn error 0(post info) last post received: 0 0 0last post received-location: No postlast process to post me: nonelast post sent: 0 0 0last post sent-location: No postlast process posted by me: none(latch info) wait_event=0 bits=8holding??? (efd=4) 600140a8 cache buffer handles level=3SO: 0x11b305810, type: 2, owner: (nil), flag: INIT/-/-/0x00(process) Oracle pid=10, calls cur/top: 0x11b455ac0/0x11b450a58, flag: (0) -int error: 0, call error: 0, sess error: 0, txn error 0(post info) last post received: 0 0 0last post received-location: No postlast process to post me: nonelast post sent: 0 0 0last post sent-location: No postlast process posted by me: none(latch info) wait_event=0 bits=2Location from where call was made: kcbzgs:waiting for 600140a8 cache buffer handles level=3FBD93353:000019F0??? 10?? 162 10005?? 1 KSL WAIT BEG [latch: cache buffer handles] 1610694824/0x600140a8 125/0x7d 0/0x0 FF936584:00002761??? 10?? 144 10005?? 1 KSL WAIT BEG [latch: cache buffer handles] 1610694824/0x600140a8 125/0x7d 0/0x0PID=22 holding 持有cache buffer handles latchPID=10 等待 cache buffer handles latch, 這是因?yàn)?#34;_db_handles_cached"=0 導(dǎo)致 process自身沒(méi)有緩存cache buffer handles這個(gè)systemstate中找不到 kcbbfbp cache buffer handle對(duì)象, 因?yàn)?"_db_handles_cached"=0 且 cache buffer handles latch被hold 住了我們釋放cache buffer handles latch , 來(lái)觀(guān)察 buffer被pin住而不是釋放時(shí)的情境session A exit session B:SQL> select * from v$latchholder;no rows selectedSQL> insert into test_cbc_handle values(2);1 row created.SQL> commit;Commit complete.SQL> SQL> select t1,rowid from test_cbc_handle;T1 ROWID ---------- ------------------1 AAANPAAABAAAQZSAAA2 AAANPAAABAAAQZSAABSQL> select spid,pid from v$process where addr = ( select paddr from v$session where sid=(select distinct sid from v$mystat));SPID??????????????? PID ------------ ---------- 19251??????????????? 10用 GDB 對(duì) SPID=19215 做debug , 使用 kcbrls 函數(shù)作為breakpoint 這會(huì)讓 進(jìn)程無(wú)法release buffer[oracle@vrh8 ~]$ gdb $ORACLE_HOME/bin/oracle 19251 GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.? Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /s01/oracle/product/10.2.0.5/db_1/bin/oracle...(no debugging symbols found)...done. Attaching to program: /s01/oracle/product/10.2.0.5/db_1/bin/oracle, process 19251 Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libskgxp10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libskgxp10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libhasgen10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libhasgen10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libskgxn2.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libskgxn2.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libocr10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libocr10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libocrb10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libocrb10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libocrutl10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libocrutl10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libjox10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libjox10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libclsra10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libclsra10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libdbcfg10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libdbcfg10.so Reading symbols from /s01/oracle/product/10.2.0.5/db_1/lib/libnnz10.so...(no debugging symbols found)...done. Loaded symbols for /s01/oracle/product/10.2.0.5/db_1/lib/libnnz10.so Reading symbols from /usr/lib64/libaio.so.1...(no debugging symbols found)...done. Loaded symbols for /usr/lib64/libaio.so.1 Reading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done. Loaded symbols for /lib64/libdl.so.2 Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done. Loaded symbols for /lib64/libm.so.6 Reading symbols from /lib64/libpthread.so.0...(no debugging symbols found)...done. [Thread debugging using libthread_db enabled] Loaded symbols for /lib64/libpthread.so.0 Reading symbols from /lib64/libnsl.so.1...(no debugging symbols found)...done. Loaded symbols for /lib64/libnsl.so.1 Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib64/libc.so.6 Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 Reading symbols from /lib64/libnss_files.so.2...(no debugging symbols found)...done. Loaded symbols for /lib64/libnss_files.so.2 0x00000035c000d940 in __read_nocancel () from /lib64/libpthread.so.0(gdb) break kcbrlsBreakpoint 1 at 0x10e5d24session B:select * from test_cbc_handle where rowid='AAANPAAABAAAQZSAAA'; select hang !!GDB(gdb) c Continuing.Breakpoint 1, 0x00000000010e5d24 in kcbrls () (gdb) bt #0? 0x00000000010e5d24 in kcbrls () #1? 0x0000000002e87d25 in qertbFetchByUserRowID () #2? 0x00000000030c62b8 in opifch2 () #3? 0x00000000032327f0 in kpoal8 () #4? 0x00000000013b7c10 in opiodr () #5? 0x0000000003c3c9da in ttcpip () #6? 0x00000000013b3144 in opitsk () #7? 0x00000000013b60ec in opiino () #8? 0x00000000013b7c10 in opiodr () #9? 0x00000000013a92f8 in opidrv () #10 0x0000000001fa3936 in sou2o () #11 0x000000000072d40b in opimai_real () #12 0x000000000072d35c in main ()SQL> oradebug setmypid; Statement processed.SQL> oradebug dump systemstate 266; Statement processed.此時(shí)可以看到 kcbbfbp buffer cache handle 將? SO state object 和 BH BUFFER HEADER? link在一起----------------------------------------SO: 0x11b452348, type: 3, owner: 0x11b305810, flag: INIT/-/-/0x00(call) sess: cur 11b41bd18, rec 0, usr 11b41bd18; depth: 0----------------------------------------SO: 0x1182dc750, type: 24, owner: 0x11b452348, flag: INIT/-/-/0x00(buffer) (CR) PR: 0x11b305810 FLG: 0x108000class bit: (nil)kcbbfbp: [BH: 0xf2fc69f8, LINK: 0x1182dc790]where: kdswh05: kdsgrp, why: 0BH (0xf2fc69f8) file#: 1 rdba: 0x00410652 (1/67154) class: 1 ba: 0xf297c000set: 3 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 272dbwrid: 0 obj: 54208 objn: 54202 tsn: 0 afn: 1hash: [f2fc47f8,1181f3038] lru: [f2fc6b88,f2fc6968]obj-flags: object_ckpt_listckptq: [1182ecf38,1182ecf38] fileq: [1182ecf58,1182ecf58] objq: [108712a28,108712a28]use: [1182dc790,1182dc790] wait: [NULL]st: XCURRENT md: SHR tch: 12flags: buffer_dirty gotten_in_current_mode block_written_onceredo_since_readLRBA: [0xc7.73b.0] HSCN: [0x0.1cbe52] HSUB: [1]Using State Objects----------------------------------------SO: 0x1182dc750, type: 24, owner: 0x11b452348, flag: INIT/-/-/0x00(buffer) (CR) PR: 0x11b305810 FLG: 0x108000class bit: (nil)kcbbfbp: [BH: 0xf2fc69f8, LINK: 0x1182dc790]where: kdswh05: kdsgrp, why: 0buffer tsn: 0 rdba: 0x00410652 (1/67154)scn: 0x0000.001cbe52 seq: 0x01 flg: 0x02 tail: 0xbe520601frmt: 0x02 chkval: 0x0000 type: 0x06=trans datatab 0, row 0, @0x1f9a tl: 6 fb: --H-FL-- lb: 0x0? cc: 1 col? 0: [ 2]? c1 02 tab 0, row 1, @0x1f94 tl: 6 fb: --H-FL-- lb: 0x2? cc: 1 col? 0: [ 2]? c1 15 end_of_block_dump?? ??? ?(buffer) (CR) PR: 0x11b305810 FLG: 0x108000st: XCURRENT md: SHR tch: 12 該 buffer header的status= XCURRENT mode=KCBMSHARE KCBMSHR???? current share也可以通過(guò)? x$kcbbf 找到相關(guān)的 cache buffer handleSQL> select distinct KCBBPBH from? x$kcbbf ;KCBBPBH ---------------- 00 00000000F2FC69F8??????????? ==>0xf2fc69f8SQL> select * from x$kcbbf where kcbbpbh='00000000F2FC69F8';ADDR?????????????????? INDX??? INST_ID KCBBFSO_TYP KCBBFSO_FLG KCBBFSO_OWN ---------------- ---------- ---------- ----------- ----------- ----------------KCBBFFLG??? KCBBFCR??? KCBBFCM KCBBFMBR???????? KCBBPBH ---------- ---------- ---------- ---------------- ---------------- KCBBPBF????????? X0KCBBPBH??????? X0KCBBPBF??????? X1KCBBPBH ---------------- ---------------- ---------------- ---------------- X1KCBBPBF??????? KCBBFBH??????????? KCBBFWHR?? KCBBFWHY ---------------- ---------------- ---------- ---------- 00000001182DC750??????? 748????????? 1????????? 24?????????? 1 000000011B4523481081344????????? 1????????? 0 00?????????????? 00000000F2FC69F8 00000001182DC750 00?????????????? 00000001182DC750 00 00000001182DC7F8 00????????????????????? 583????????? 0SQL> desc x$kcbbf;Name????????????????????????????????????? Null???? Type----------------------------------------- -------- ----------------------------ADDR?????????????????????????????????????????????? RAW(8)INDX?????????????????????????????????????????????? NUMBERINST_ID??????????????????????????????????????????? NUMBERKCBBFSO_TYP??????????????????????????????????????? NUMBERKCBBFSO_FLG??????????????????????????????????????? NUMBERKCBBFSO_OWN??????????????????????????????????????? RAW(8)KCBBFFLG?????????????????????????????????????????? NUMBERKCBBFCR??????????????????????????????????????????? NUMBERKCBBFCM??????????????????????????????????????????? NUMBERKCBBFMBR?????????????????????????????????????????? RAW(8)KCBBPBH??????????????????????????????????????????? RAW(8)KCBBPBF??????????????????????????????????????????? RAW(8)X0KCBBPBH????????????????????????????????????????? RAW(8)X0KCBBPBF????????????????????????????????????????? RAW(8)X1KCBBPBH????????????????????????????????????????? RAW(8)X1KCBBPBF????????????????????????????????????????? RAW(8)KCBBFBH??????????????????????????????????????????? RAW(8)KCBBFWHR?????????????????????????????????????????? NUMBERKCBBFWHY?????????????????????????????????????????? NUMBERgdb 退出 讓process能夠順利完成kcbrls release buffer后 相關(guān)的cache buffer handle被清理SQL> select distinct KCBBPBH from? x$kcbbf ;KCBBPBH ---------------- 00

轉(zhuǎn)載于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968290.html

總結(jié)

以上是生活随笔為你收集整理的Know more about Cache Buffer Handle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。