1. 程式人生 > >buffer busy wait一例

buffer busy wait一例

架構 導致 inf 單位 AR dbm 測試 assm 分配

一張記錄用戶登錄退出的表,每天9點會突然慢一下,等待事件為buffer busy wait並發插入量為230左右。oracle使用assm(如圖)也就是L3,L2,L1架構理論上100個L1每個L1管理64個塊就支持6400並發,實際也是如此嗎?

技術分享圖片

進行插入實驗發現,插入都是插入到1個分區裏面,我們知道分區是一個接一個分配的,因為還沒分配到分區所以才導致插到1個分區裏,手動分配好多個分區。不幸的是結果還是一樣。

插入實驗一:

SQL> create table ye (id int,name char(10)) tablespace ye;

Table created.

[oracle]$cat   insert.sh                                                

sqlplus 
/ as sysdba<<EOF insert into ye values($1,qqqq); commit; exec dbms_lock.sleep(100000) #防止pid不變導致插入同一個數據塊 EOF [oracle]$./insert.sh 1& [oracle]$./insert.sh 2& [oracle]$./insert.sh 3& [oracle]$./insert.sh 4& SQL> / ID FNO BLOCKID ROW_ID ---------- ---------- ---------- ---------- 1
8 161 0 2 8 171 0 1 8 172 0 3 8 172 1 3 8 178 0 4 8 181 0 5 8 184 0 2 8 185 0 6 8 186 0 7 8 187 0 8 8 188 0 9 8 189 0 10 8 190 0

插入實驗二:

SQL> /

    ID      FNO     BLOCKID     ROW_ID
---------- ---------- ---------- ----------
    11
8 132 0 66 8 132 1 12 8 133 0 67 8 133 1 12 8 134 0 68 8 134 1 12 8 135 0 69 8 135 1 12 8 136 0 70 8 136 1 13 8 137 0 14 8 138 0 15 8 139 0 16 8 140 0 17 8 141 0 18 8 142 0 19 8 143 0 20 8 144 0 21 8 145 0 22 8 146 0 23 8 147 0 24 8 148 0 25 8 149 0 25 8 150 0 26 8 151 0 27 8 152 0 28 8 153 0 29 8 154 0 30 8 155 0 31 8 156 0 32 8 157 0 33 8 158 0 34 8 159 0 35 8 160 0 1 8 161 0 36 8 161 1 37 8 162 0 38 8 163 0 39 8 164 0 40 8 165 0 4 8 166 0 41 8 167 0 42 8 168 0 43 8 169 0 44 8 170 0 2 8 171 0 45 8 171 1 1 8 172 0 3 8 172 1 46 8 172 2 47 8 173 0 48 8 174 0 49 8 175 0 50 8 176 0 51 8 177 0 3 8 178 0 52 8 178 1 53 8 179 0 54 8 180 0 4 8 181 0 55 8 181 1 56 8 182 0 57 8 183 0 5 8 184 0 58 8 184 1 2 8 185 0 59 8 185 1 6 8 186 0 60 8 186 1 7 8 187 0 61 8 187 1 8 8 188 0 62 8 188 1 9 8 189 0 63 8 189 1 10 8 190 0 63 8 190 1 11 8 191 0 65 8 191 1 79 rows selected.

在進行70次插入發現,block到191之後開始重新向132號塊插入了,這也就能解釋128,129號塊為L1,130是L2,131是L3,128-191,64個塊的同時插入不夠230並發量所以有些塊在插入過程中又有新的會話要插入,所以導致了buffer busy wait,那麽為什麽只插入前64個塊呢?此時可以dump下131號段頭塊,可以看到前10位為文件號,後面為塊地址,正好看到是192號塊。插入的時候都是插入到高水位線以下,因此都插到了前64個塊。解決方法就是拉高水位線,每天先使用append方式插入數據再刪除,結果等待消失。

技術分享圖片

在總結下,如果塊是8K,區大小是1M,高水位就是一64個塊為單位依次往後挪,但是每次並發插入其實都只是往64個塊插入。

這裏還有個問題L1管理64個塊是固定的麽?

SQL> create table tbs(id int ,name char(10)) tablespace ye1;

Table created.

SQL>  alter table tbs allocate extent(size 200m); 

Table altered.

SQL> select extent_id,block_id,blocks,file_id from dba_extents where segment_name=TBS order by 1;

 EXTENT_ID   BLOCK_ID      BLOCKS    FILE_ID
---------- ---------- ---------- ----------
     0      128           8      9
     1      256         128      9
     2      384         128      9
     3      512         128      9
     4      640         128      9
     5      768         128      9
     6      896         128      9
     7     1024         128      9
     8     1152         128      9
     9     1280         128      9
    10     1408         128      9
    11     1536         128      9
    12     1664         128      9
    13     1792         128      9
    14     1920         128      9
    15     2048         128      9
    16     2176         128      9
    17     2304         128      9
    18     2432         128      9
    19     2560         128      9
    20     2688         128      9
    21     2816         128      9
    22     2944         128      9
    23     3072         128      9
    24     3200         128      9
    25     3328         128      9
    26     3456         128      9
    27     3584         128      9
    28     3712         128      9
    29     3840         128      9
    30     3968         128      9
    31     4096         128      9
    32     4224         128      9
    33     4352         128      9
    34     4480         128      9
    35     4608         128      9
    36     4736         128      9
    37     4864         128      9
    38     4992         128      9
    39     5120         128      9
    40     5248         128      9
    41     5376         128      9
    42     5504         128      9
    43     5632         128      9
    44     5760         128      9
    45     5888         128      9
    46     6016         128      9
    47     6144         128      9
    48     6272         128      9
    49     6400         128      9
    50     6528         128      9
    51     6656         128      9
    52     6784         128      9
    53     6912         128      9
    54     7040         128      9
    55     7168         128      9
    56     7296         128      9
    57     7424        1024      9
    58     8448        1024      9
    59     9472        1024      9
    60    10496        1024      9
    61    11520        1024      9
    62    12544        1024      9
    63    13568        1024      9
    64    14592        1024      9
    65    15616        1024      9
    66    16640        1024      9
    67    17664        1024      9
    68    18688        1024      9
    69    19712        1024      9
    70    20736        1024      9
    71    21760        1024      9
    72    22784        1024      9
    73    23808        1024      9
    74    24832        1024      9

75 rows selected.

dump256和21760號塊,發現第一個塊的L1是管理64個塊第二個是有256個塊。經測試8M區大小的分區第8個分區以後L1中數據塊的數量就會達到256個塊。因此只要建立8m區大小的表空間插入一些數據將高水位擡到第8個分區以後就可以了。

技術分享圖片

技術分享圖片

buffer busy wait一例