第一次遇到在awr top 5 event中出现enq:SS-contention 和enq:TS-contention

开发环境数据库出现卡顿,AWR报告显示高db time并伴随enq:SS-contention和enq:TS-contention等待事件。通过对MOS文档的解读,发现可能由于开发人员直接rename正在使用的临时表空间,导致SMON与前台进程的竞争状态,引发问题。重启数据库后,前台应用释放,问题得到解决。

开发人员跟我说有台测试环境数据库有问题,很卡,应用程序启动起来就卡住,根本无法使用。但没有报任何ora-相关的错误,让我瞧瞧T

我用plsql developer登录下,发现还好,看了下最近的alert日志,也没有异常。下意识的觉得不应该是数据库问题,可能是开发那边网络之类导致出现卡顿的情况。恰巧到饭点,无心恋战,开发人员就让我将数据库重启下,我内心不深处觉得重启是解决不了问题的,但开发给我的回复是重启后好了。

心里一直挂着这事,午休后上班就再次登录上去仔细查验一番。首先看了下最近几天awr DB Time耗时,果然,有问题。从昨天下午5点多开始,awr中每小时db time竟然高达2000多分钟,这肯定是不正常的。于是生成了一个时段的awr,迎面而来的就是标题的两个等待事件:enq:SS-contention,enq:TS-contention

其中enq:SS-contention是第一次遇到,在mos上找到了这样一段描述:

We get disk sort space from sort segment. There is one sort segment for

one instance, and it is created if we don't find sort segment.

To create sort segment, we send message to SMON to do it.

When SMON require sort segment, it goes same path like other process,

except SMON don't message to itself basically.

However, SMON try to acquire SS message enqueue to post smon.

As a result, if some FG want sort segment at the same timing,

FG can get SS enqueue faster than SMON and SMON can goes into wait,

then SMON cannot respond message and goes into deadlock situation.

The problem could be understood as due to a race condition between SMON and

the Foreground processes.

读起来感觉有点绕,于是我又看了下昨天5点后的alert日志,发现存在将表空间直接rename的动作,结合这个事件,再和上面的描述相推断,我理解成:

开发人员将应用正在使用的临时表空间直接命名了,但前台应用进程应该还在持有这相关temp信息,后台进程smon呢又要做表空间名字变化后的相关处理操作,但由于前台应用进程的一直持有,导致smon进程一直处理不成功,僵持在那里了。后来数据库重启,前台应用连接全部释放,smon进程瞬间完成工作,一切恢复正常,大家美滋滋

---------------------------------------

这个问题也是第一次遇到,不常见。一般我们更换临时表空间,都是新建一个新的,然后改下用户默认临时表空间,倒是很少直接rename表空间名称的。

至于说希望自己下次处理问题要仔细点的话,哈,左耳进右耳出咯。

### ### enq: SV - contention 等待事件的含义 在 Oracle 数据库中,`enq: SV - contention` 是一种与序列(Sequence)相关的等待事件,通常出现在 RAC(Real Application Clusters)环境中。当多个实例同时请求同一个设置了 `CACHE` `ORDER` 属性的序列的 `NEXTVAL` 时,需要通过 SV 锁(SV enqueue)来保证序列值的有序性一致性。由于 SV 锁是以 SSX(Shared Sub-Exclusive)模式获取的,因此在争用发生时,会引发 `enq: SV - contention` 等待事件[^2]。 ### ### 原因分析 1. **高并发插入操作**:如果多个会话或实例频繁地请求同一个具有 `CACHE + ORDER` 属性的序列对象,会导致大量对 SV 锁的请求冲突,从而产生 `enq: SV - contention` 等待[^3]。 2. **RAC 环境下的锁竞争**:在 RAC 架构下,由于序列的 `ORDER` 属性要求生成的数值必须全局有序,Oracle 使用 SV 锁来同步不同节点间的访问。这种跨节点的同步机制会引入额外的锁资源竞争[^2]。 3. **序列缓存不足**:即使启用了 `CACHE`,若缓存大小不足以应对并发请求频率,仍然可能导致频繁的锁获取释放操作,加剧争用问题[^4]。 ### ### 解决方法 1. **调整序列属性**: - 如果业务允许无序的序列值,可以移除 `ORDER` 属性,这样可以避免使用 SV 锁,从而减少争用。 - 示例修改语句如下: ```sql ALTER SEQUENCE your_sequence_name NOORDER; ``` 2. **增加缓存大小**: - 提高 `CACHE` 参数值可以减少对共享资源的访问频率,降低争用概率。 - 修改示例如下: ```sql ALTER SEQUENCE your_sequence_name CACHE 1000; ``` 3. **使用多个序列或分区序列**: - 如果系统支持,可以通过创建多个独立的序列,并在应用层进行轮询分配,从而分散单个序列的并发压力。 4. **优化事务设计**: - 减少每次事务中调用 `NEXTVAL` 的次数,尽量将多个插入操作合并到一个事务中,以减少锁的持有时间。 5. **评估是否真的需要 `ORDER` 属性**: - 若业务逻辑并不严格依赖全局递增的顺序,则建议关闭 `ORDER` 选项,以提升性能并避免 SV 锁争用问题。 6. **监控诊断**: - 利用 AWR 报告、ASH 视图以及 `V$SESSION_WAIT` 等工具持续监控该等待事件的发生频率影响范围,以便及时采取措施。 7. **升级数据库版本**: - 在某些较新的 Oracle 版本中,针对序列争用进行了优化,如引入了更高效的锁管理机制。考虑升级至更高版本可能有助于缓解此类问题。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值