发生data file init write的等待是数据文件正在发生扩展,在11g中,这往往和SMCO和Wnnn进程的自动预扩展有关。
在生产环境中,如果在生产高峰期出现预扩展,可能会造成短暂的hang住,或者CPU突然的升高,或者查询dba_free_space的hang住。但是,预扩展这个功能是否好处大于坏处,是否需要关闭,我们用一些测试数据来说明。
在测试库测试了load大量数据到表中,触发SMCO进行自动预扩展,在测试中发现如下:
(1)开启预扩展时(即设置_enable_space_preallocation为默认值3),表空间在接近100%进行扩展,扩展的大小为当时表空间大小的5%。该行为收隐含参数_kttext_warning影响,默认值为5.(详见Doc ID 1459097.1),因此如果原来的表空间越大,那么预扩展的空间就越大,需要的时间也越长。处于data file init write的等待时间也越长。
(2)关于Wnnn进程会造成CPU的突然升高,是Bug 13871316 Wnnn space background process may be periodically CPU bound。但是是否hit中bug还是需要看其pstack和errorstack,看是否有和bug相关的call stack:ktslfsum_cfs
(2.1)用循环语句pstack wnnn进程,如Wnnn进程号为19750:
do
echo "======`date`======" >>/tmp/pstack_19750.log
pstack 19750 >>/tmp/pstack_19750.log
sleep 3
done
(2.2)errorstack方法:
Oracle pid: 75, Unix process pid: 19750, image: oracle@z4as2020 (W001)
SQL> oradebug dump errorstack 3
Statement processed.
SQL> oradebug tracefile_name
(3)在我的测试中,由于没有hit BUG 13871316,所以几乎没有看到Wnnn处于data file init write时,对CPU的影响。如下:
处于data file init write的时间:
我们叠加上CPU的趋势,可以看到,在出现Data file init write的时候,绿色的CPU几乎没有受到影响,没有随着Data file init write的出现而出现CPU高峰。
并且观察Wnnn进程的sesstat,”CPU used by this session”在Data file init write也没有看到变化。
(4)对比开启预扩展和关闭预扩展,循环插入100次(插入过程中无预扩展),开启预扩展的时间的插入效率比关闭的高:
(4.1)开启预扩展:
PL/SQL procedure successfully completed
Executed in 43.54 seconds
11:28:20 SQL>
11:28:43 SQL>
PL/SQL procedure successfully completed
Executed in 56.941 seconds
11:29:43 SQL>
11:37:07 SQL>
PL/SQL procedure successfully completed
Executed in 48.22 seconds
11:37:58 SQL>
11:38:48 SQL>
PL/SQL procedure successfully completed
Executed in 55.802 seconds
11:39:45 SQL>
(4.2)关闭预扩展:
PL/SQL procedure successfully completed
Executed in 76.753 seconds
11:53:37 SQL>
PL/SQL procedure successfully completed
Executed in 91.745 seconds
11:55:47 SQL>
11:57:58 SQL>
13:29:13 SQL> /
PL/SQL procedure successfully completed
Executed in 69.062 seconds
13:30:24 SQL>
13:30:38 SQL> /
PL/SQL procedure successfully completed
Executed in 87.439 seconds
13:32:06 SQL>
(5)对比开启预扩展和关闭预扩展,循环插入1000次,那么insert过程中伴随预扩展的进行,则开启和关闭之间的差距不大。
(5.1)开启预扩展:
PL/SQL procedure successfully completed
Executed in 1034.599 seconds (注:期间还有遇到1次init write)
14:33:09 SQL>
14:36:28 SQL>
PL/SQL procedure successfully completed
Executed in 1407.175 seconds (注:期间还有遇到init write 2次)
14:59:58 SQL>
(5.2)关闭预扩展:
13:33:04 SQL>
PL/SQL procedure successfully completed
Executed in 902.341 seconds
13:48:14 SQL>
13:50:06 SQL>
PL/SQL procedure successfully completed
Executed in 1063.849 seconds
14:08:05 SQL>
Oracle在11g推出空间预扩展的功能,是在很大程度上能减轻空间分配争用的问题,对提高效率有好处,建议保留使用该空间预扩展的功能,不设置_enable_space_preallocation为0。因为对于这个新功能带来的好处,是大大多于缺点的。
由 udpwork.com 聚合
|
评论: 0
|
要! 要! 即刻! Now!