1问题
9月1日接监控告警,8月份批量生成文件缓慢,没有在窗口内完成。
2分析
生成批量文件的逻辑很简单,针对一个查询语句进行循环,依次使用utl_file.put_line写入文件(文件在集群文件系统GPFS上)。
查询SQL执行计划,未发现异常。
查询gv$active_session_history,发现会话等待事件集中在“utl_file I/O”上:
|
sql_id |
wait_class |
event |
count |
|
5nddq6b1a4bbu |
User I/O |
utl_file I/O |
22708 |
|
5nddq6b1a4bbu |
|
|
391 |
|
75m4xybvbvj7y |
Concurrency |
os thread startup |
3 |
|
75m4xybvbvj7y |
|
|
735 |
|
|
Other |
enq: PS - contention |
4 |
查询dba_hist_event_histogram中对应的utl_file I/O等待事件等待时间分布如下:
|
SNAP_ID |
INSTANCE_NUMBER |
EVENT_NAME |
WAIT_TIME_MILLI |
WAIT_COUNT |
|
80837 |
1 |
utl_file I/O |
1 |
608614205 |
|
80837 |
1 |
utl_file I/O |
2 |
123584 |
|
80837 |
1 |
utl_file I/O |
4 |
970730 |
|
80837 |
1 |
utl_file I/O |
8 |
25320 |
|
80837 |
1 |
utl_file I/O |
16 |
363 |
|
80837 |
1 |
utl_file I/O |
32 |
90 |
|
80837 |
1 |
utl_file I/O |
64 |
16 |
|
80837 |
1 |
utl_file I/O |
128 |
56 |
|
80837 |
1 |
utl_file I/O |
256 |
1 |
|
80837 |
1 |
utl_file I/O |
512 |
1 |
|
80837 |
2 |
utl_file I/O |
1 |
3069290 |
|
80837 |
2 |
utl_file I/O |
2 |
1 |
|
80837 |
2 |
utl_file I/O |
4 |
2 |
|
80837 |
2 |
utl_file I/O |
8 |
1 |
|
80837 |
2 |
utl_file I/O |
32 |
5 |
|
80837 |
2 |
utl_file I/O |
64 |
8624 |
|
80837 |
2 |
utl_file I/O |
128 |
17714 |
|
80837 |
2 |
utl_file I/O |
256 |
4315 |
|
80837 |
2 |
utl_file I/O |
512 |
118 |
|
80837 |
2 |
utl_file I/O |
1024 |
6 |
从上表中可以发现,实例1等待次数wait_count随等待时长wait_time_milli增加快速稳定下降,实例2等待次数wait_count没有随等待时长wait_time_milli增加下降,在wait_time_milli=128ms时存在一个明显的高峰17714,怀疑写入GPFS缓慢。
3测试验证
通过测试比较写本地文件系统与写GPFS文件性能差异。
--写本地文件系统,
declare
g_file utl_file.file_type;
begin
dbms_output.enable(null);
g_file := UTL_FILE.fopen('LOCAL_DIR','test20170805.txt','W');
for x in 1..1000000 loop
utl_file.put_line(g_file, x||rpad('x',1000,'x'));
end loop;
utl_file.fclose(g_file);
end;
/
--写GPFS文件系统
declare
g_file utl_file.file_type;
begin
dbms_output.enable(null);
g_file := UTL_FILE.fopen('GPFS_DIR','test20170805.txt','W');
for x in 1..1000000 loop
utl_file.put_line(g_file, x||rpad('x',1000,'x'));
end loop;
utl_file.fclose(g_file);
end;
/
测试结果如下:
|
次序 |
文件大小 |
本地文件(sec) |
GPFS文件(sec) |
备注 |
|
1 |
100MB |
7.4 |
7.5 |
打开新文件,写入 |
|
2 |
100MB |
8.2 |
72 |
重新打开未删除原文件,写入 |
|
3 |
1GB |
74 |
75 |
打开新文件,写入 |
|
4 |
1GB |
75 |
756 |
重新打开未删除原文件,写入 |
|
5 |
1GB |
74 |
676 |
重新打开未删除原文件,写入 |
从上表中可以发现:
规律1:在重复写同一个文件时,写GPFS文件系统比写本地文件慢一个数量级
规律2:如果写入一个新文件,写入速度与本地文件系统相当
至此,确定问题根源为GPFS写缓慢导致批量文件未能在窗口内完成。
4后续措施
(1)敦促维护部门联系厂商更新相关补丁。
(2)如再次出现生成文件失败问题,通过手工删除文件,很可能会加快写GPFS速度。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18922393/viewspace-2153318/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/18922393/viewspace-2153318/
本文分析了8月份批量文件生成缓慢的问题,通过查询SQL执行计划及会话等待事件,定位到GPFS上的文件写入操作为性能瓶颈,并通过对比本地文件系统与GPFS文件系统的写入测试进一步确认问题所在。
1143

被折叠的 条评论
为什么被折叠?



