记一次生产环境卡顿优化过程:大事务并发回滚

数据库 SQL Server
最近生产环境有这么个现象,平时的订单调度只需要2s内可以出结果,但是多个人调度就会卡住,超过15分钟都没有结果出来,有时还会失败然后导致数据不准确。

 [[273847]]

概述

最近生产环境有这么个现象,平时的订单调度只需要2s内可以出结果,但是多个人调度就会卡住,超过15分钟都没有结果出来,有时还会失败然后导致数据不准确。

记一次生产环境卡顿优化过程--大事务并发回滚

下面记录一下生产环境卡顿时排查的过程。

1、获取ASH报告

  1. SQL> @?/rdbms/admin/ashrpt.sql 
  2. --To specify absolute begin time: 
  3. --[MM/DD/YY]] HH24:MI[:SS] 
  4. --08/09/19 08:40:00 

 

记一次生产环境卡顿优化过程--大事务并发回滚

 

记一次生产环境卡顿优化过程--大事务并发回滚

 

记一次生产环境卡顿优化过程--大事务并发回滚

 

记一次生产环境卡顿优化过程--大事务并发回滚

2、ASH分析

(1)Top User Events

记一次生产环境卡顿优化过程--大事务并发回滚

(2)相关sql

Top SQL with Top Events

记一次生产环境卡顿优化过程--大事务并发回滚

sql明细

记一次生产环境卡顿优化过程--大事务并发回滚

(3)存储过程

记一次生产环境卡顿优化过程--大事务并发回滚

(4)TOP sessions

记一次生产环境卡顿优化过程--大事务并发回滚

从上面分析可以看到两个明显的等待事件:wait for stopper event to be increased 等待事件和wait for a undo record 等待事件,这个应该是批量任务调度的时候产生了大量的大事务,产生了一些回滚造成了严重的资源消耗

3、处理大事务并发回滚

一般情况下wait for stopper event to be increased 等待事件是跟wait for a undo record 等待事件联系起来的。

对于这个等待事件metalink上面有一篇文档

  1. 464246.1 
  2. Sometimes Parallel Rollback of Large Transaction may become very slow. After killing a large running transaction  
  3. (either by killing the shadow process or aborting the databasethen database seems to hang, or smon and parallel query servers  
  4. taking all the available cpu. 
  5. In fast-start parallel rollback, the background process Smon acts as a coordinator and rolls back a set of transactions in parallel  
  6. using multiple server processes. Fast start parallel rollback is mainly useful when a system has transactions that run a long time  
  7. before comitting, especially parallel Inserts, Updates, Deletes operations. When Smon discovers that the amount of recovery work is  
  8. above a certain threshold, it automatically begins parallel rollback by dispersing the work among several parallel processes. 
  9. There are cases where parallel transaction recovery is not as fast as serial transaction recovery, because the pq slaves are interfering 
  10. with each other. It looks like the changes made by this transaction cannot be recovered in parallel without causing a performance problem.  
  11. The parallel rollback slave processes are most likely contending for the same resource, which results in even worse rollback performance  
  12. compared to a serial rollback

解决的办法:

  1. --关掉并发回滚,变成串行回滚(直接重启解决) 
  2. sql> alter system set fast_start_parallel_rollback = false scope=spfile;  

 

记一次生产环境卡顿优化过程--大事务并发回滚

通常,如果有很多并发进程,可以根据v$px_session视图去查看,查看v$px_session视图,发现所有的并发进程都是由smon进程导致(即qcsid列为smon进程的session id)

而smon进程的等待事件为wait for stopper event to be increased

即smon进程在做大事务的回滚,默认参数fast_start_parallel_rollback参数为low,即回滚时会启动2*CPU个数 个并发进程。而由于是使用并发,所以可能由于并发之间相互使用共同的资源,导致回滚速度更慢。因为是生产环境,不能随便重启,所以我用了下面的方法来修改这个参数:

(1)查找smon进程ID

  1. select pid,spid,pname,username,tracefile from v$process where pname='SMON' 

 

记一次生产环境卡顿优化过程--大事务并发回滚

(2)禁用smon进程的事务清理(Disable SMON transaction cleanup)

  1. oradebug setorapid 'SMON's Oracle PID'; 
  2.  oradebug event 10513 trace name context forever, level 2 

 

记一次生产环境卡顿优化过程--大事务并发回滚

(3)查询V$FAST_START_SERVERS视图,将所有smon启用的并发进程杀掉

记一次生产环境卡顿优化过程--大事务并发回滚

(4)修改fast_start_parallel_rollback参数

  1. alter system set fast_start_parallel_rollback=false

(5)启用smon进程的事务清理(enable transaction recovery)

  1. oradebug setorapid 'SMON's Oracle PID'; 
  2. oradebug event 10513 trace name context off 

(6)获得tracefile name

  1. oradebug tracefile_name 
记一次生产环境卡顿优化过程--大事务并发回滚

(7)验证

记一次生产环境卡顿优化过程--大事务并发回滚

4、业务验证

修改后去业务验证,到高峰期还是有卡顿现象,不过频率减少了很多,报错之类的也没有了,同时观察新的报告可以发现并发回滚之类的等待事件已经没有了。

责任编辑:华轩 来源: 今日头条
相关推荐

2021-03-01 06:14:50

环境高并发延迟

2019-09-24 07:00:01

SQL Server服务器卡顿内存分配

2022-06-01 06:17:42

微服务Kafka

2019-08-19 01:34:38

数据库SQL数据库优化

2019-12-12 10:38:10

mysql数据库nnodb

2019-01-21 11:17:13

CPU优化定位

2019-09-27 17:24:26

数据库优化sql

2018-12-06 16:25:39

数据库服务器线程池

2020-09-25 07:57:42

生产事故系统

2020-11-03 07:34:12

Kafka后端工程师

2019-11-18 13:42:55

MySQL数据库迁移

2019-11-22 08:05:01

数据库mysql分区

2019-09-08 17:52:10

数据库log file sy等待事件

2019-12-16 07:18:42

数据库SQL代码

2019-12-02 08:09:57

境数据库连接超时自动回收

2021-01-12 07:57:36

MySQLBinlog故障处理

2019-12-27 10:43:48

磁盘数据库死锁

2019-07-25 08:30:58

数据库服务器故障

2020-12-15 11:18:43

系统磁盘lvm数据库

2022-10-17 08:31:03

生产环境P0项目
点赞
收藏

51CTO技术栈公众号