暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

expdp 因 Streams AQ: enqueue blocked on low memory导致缓慢问题分析及处理

原创 尚雷 2022-11-21
1763

一、现象描述

同事在对一BI库执行expdp备份,命令执行一段时间后,发现导出变得特别慢,备份日志很久未有刷新。
查看expdp备份命令,其实内容很简单,只是对该库下的三个用户导出元数据,开启并行和压缩,不导出索引、统计信息等内容。
导出日志里显示的最新内容显示是在对某个用户下的分区表做导出,但导出的分区表不含数据。
同事反馈开始导出很快,但现在为什么这么慢了呢?

二、问题分析

通过expdp “sys/oracle as sysdba” attach=SYS_EXPORT_SCHEMA_01命令查看导出进程没有终止,但一直未有更新。
首先想到的是否服务器内存不够,通过top、free -g 查看显示服务器内存及CPU都不紧张,可以排除服务器内存问题。
然后查看数据库当前等待事件,发现了一个特别可疑的等待事件:
image.png
查询MOS,显示有篇文章“由于频繁等待 ”Streams AQ: Enqueue Blocked On Low Memory" 而导致Datapump Expdp或Impdp变慢 (Doc ID 2469587.1)”对该等待事件有描述:
因 Datapump导出和导入(expdp和impdp)可能会遇到突然严重的性能问题,因为DW和DM进程经常等待 “StreamsAQ: enqueue blocked on low memory”。由于streams_pool

大小被修改导致过多等待“ Streams AQ: enqueue blocked on low memory”。该问题是由于Bug 27634991引起的,在版本19.1及更高版本中修复了该问题。
该bug在oracle 11、12c、18c都可能会产生,当前数据库版本是11.2.0.4。
在Auto SGA环境(设置了sga_target或memory_target)下,当 buffer cache 负载较高并且 streams pool 中的内存正被移动到 buffer cache 时,可能会发生此问题。

如果遇到类似的性能问题时,请检查以下查询是否一直返回“1”。该值表示 streams pool 处于收缩阶段。当 streams pool 完成收缩时,该值应返回“0”,但如果它一直返回“1”,则可能遇到此问题。
根据MOS提示,查询到当前数据库是设置了Auto SGA模式,通过show parameter streams_pool_size 显示当前streams_pool_size未设置
执行select shrink_phase_knlasg from X$KNLASG;显示SHRINK_PHASE_KNLASG 值为 1,符合mos描述
image.png

三、解决方案

根据MOS提示,可以通过设置alter system set events ‘immediate trace name mman_create_def_request level 6’; 可以防止该bug发生
先在测试环境执行了alter system set events ‘immediate trace name mman_create_def_request level 6’; 命令执行后,数据库正常。

然后在该导出环境通过sysdba用户执行了 alter system set events ‘immediate trace name mman_create_def_request level 6’;
执行完后,再次执行 elect shrink_phase_knlasg from X$KNLASG; 显示当前SHRINK_PHASE_KNLASG 值为 0

再次查询数据库等待事件显示已无 Streams AQ: enqueue blocked on low memory等待时间。
观察导出日志,显示日志在不断刷新,一段时间后,导出完成。

image.png

最后修改时间:2022-11-29 09:31:25
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论