立即咨询
2024.10.09 |
All in?跑步入场?清仓?为了这些动作,Ta们在......
是时候放下手中的“大盘”,看看技术啦~

国庆节前的几天A股大涨,很多资深股民纷纷狂晒朋友圈,“All in!”、“跑步入场”、“再涨30%,我就回本了”、“ 牛回,速归,记住不要卖掉电动车!”、“3点收盘太早啦,强烈要求国庆节加班”。老股民解套在望,新股民跃跃欲试。交易量和用户活跃度都在急剧增加,证券公司的系统性能成为了保障交易顺利进行的关键。终于,大家期待的证券公司“加班”,真的来啦!


640.png



国庆假期期间,为了保障高并发下的系统稳定运行,bat365中国官方网站配合一些证券公司客户加班进行了压力测试,其中一个客户遇到了意想不到的瓶颈,可能导致系统运行缓慢,影响交易。我们今天就一起来看看这个“新鲜”的案例!

一、问题描述



某证券客户对系统进行性能压测,结果系统运行缓慢,大量会话积压,无法达到交易目标。这一问题亟需优化处理,以确保在股市热潮中系统能够稳定运行。

二、问题分析



1. 问题现象分析
收集问题时段AWR报告,可以看到系统的等待事件如下:
640 (1).png





从系统的负载来看,系统中硬解析的并发量不算大,每秒161.7多左右的:
640 (2).png





数据库时间模型上看,大量时间花在(硬)解析上:
640 (3).png




因主要在解析阶段,在AWR报告中就并不进一步观察SQL语句执行阶段的问题。

2. 异常等待事件分析
AWR报告显示,系统异常等待主要是`latch:row cache objects`的等待,即出现在row cache层面的争用。
在AWR报告中,对于row cache部分的统计如下:
640 (4).png



可以看到在dc_tablespaces和 dc_users 层面出现大量访问请求。
压测阶段通过对系统做hanganalyze,可以看到如下相关信息:
640 (5).png



分析阻塞链上的各会话的short stack,可以看到:
640 (6).png

640 (7).png



在short stack中,可以看到此时进程处于硬解析的过程中,为了计算hash join的成本,需要用ktatminextsz函数从row cache中查找临时表空间的最小扩展的大小,作为计算因子。我们知道要想访问row cache,首先要拿到shared pool里的latch: row cache object,以得到相应row cache的地址。当有大量进程需要访问dc_tablespace这个row cache object时,首先会在latch: row cache object发生争用。由于这个争用引发的等待,硬解析时间会变长,从而引发cursor: pin S wait on X的等待。

三、解决方案



针对这一问题,我们考虑了以下三个可能的解决方案:


1、减少CBO对hash join的路径尝试。(显然可能性不大)

2、减少硬解析。(每秒161次不算过分)

3、提高获取临时表空间最小扩展的性能。(查下有没有相应的bug或者enhance)


针对该现象,先核查相关MOS文档,可以查到对应的文档,描述类似情况:

对应的文档号为2189126.1:

640 (8).png



产生该问题的原因为bug引发:

640 (9).png



具体查看对应的bug 13902396 如下:


640 (9).png


640 (10).png

640 (11).png

640 (12).png

可以看到,根据bug 13902396 的描述,产生大量对于dc_users和dc_tablespaces的row cache访问是因为,在调用ktatminextsz函数时,高频的访问数据字典获取”minimum extent

size for the users temporary tablespace”这个信息,事实上通过该bug的修复,在于直接设定返回一个值,而不再去数据字典中查找,避免出现latch争用;
从实际情况来看,临时表空间的最小扩展基本是个固定的值,通过设备事件直接返回这个值,是可行的,几乎不会存在什么隐患。我们只需要从ts$中查出这个最小扩展的大小,然通过event设置一下,就可以绕过对latch: row cache object及dc_tablespace、dc_user的访问。

在修复该bug后,还需要设置事件来进行优化处理。

640 (13).png




四、最终选择




经过综合分析,我们最终选择了第三个方案——提高获取临时表空间最小扩展的性能。具体实施步骤如下:


1. 修复bug

针对客户数据库版本(11.2.0.4版本),为客户打上补丁13902396,修复了高频访问数据字典的问题。


2. 设置事件

通过设置事件45053,绕过对`latch: row cache object`及`dc_tablespace`、`dc_user`的访问,直接返回临时表空间的最小扩展大小。

640 (14).png


通过这一方案,系统性能得到了显著提升,解决了硬解析导致的性能瓶颈问题。
在股市热潮中,证券公司的系统性能至关重要。技术优化不仅是提升系统性能的关键,更是抓住市场机遇的重要保障。希望这篇文章能为大家提供有价值的参考。如果大家有相关的技术问题,欢迎留言联系我们。


相关推荐
助力IT企业信创服务,和企业一起走向成功
立即领取企业福利 预约您的专属顾问
400-1037-370