
问题说明:
业务人员反馈有一个跑批作业中的一条update耗时变长,之前2分钟执行完成,最近需要30多分钟还未返回结果。
环境说明:
DB:Oracle 11.2.0.3.0 RACOS:AIX 7.1
问题分析:
猜测update语句变慢有如下几个原因:
(1)数据量发生了变化。经检查,数据量没有太大变化。(2)执行计划发生了变化。经检查,执行计划并没有发生改变。(3)出现锁等待。问题期间,检查此update操作并没有被阻塞。(4)触发器并没有触发器。(5)数据库出现性能瓶颈。通过等待事件可以看到最严重的的两个等待事件分别是"gc cr block lost" 和 "gc current block lost"
排查过程:
通过tfactl收集问题时间段的日志。$ORACLE_HOME/bin/tfactl diagcollect -asm -crs -database all -os -from "Jul/26/2021 08:00:00" -to "Jul/26/2021 08:10"没有执行成功,默认11203没有安装tfactl。
在检查update语句时,业务又反馈出现大批量select语句也执行慢的问题,比之前慢很多。此刻意识到并不是某一个SQL出现了问题,可能是整个数据库出现了瓶颈。根据"gc cr block lost" 和 "gc current block lost"等待事件,可以知道私网通信的包处理效率低或者包的处理存在异常。
"gc cr block lost" 和 "gc current block lost"等待事件出现的原因:
Troubleshooting gc block lost and Poor Network Performance in a RAC Environment (Doc ID 563566.1)
1.网线/网卡/交换机问题2.UDP设置太小/UDP buffer socket溢出3.私网性能差,出现packet reassembly failures4.网络传输坏块5.通信通道中设置了不匹配的MTU的值6.使用非专用的私网链接7.服务器/交换机缺少“邻接”(adjacency)配置8.配置了 IPFILTER9.过时的网卡驱动程序10.特别的私网链接和网络协议11.错误配置的网卡绑定/链路聚合12.错误的巨帧(Jumbo Frame)配置13.网卡双工( Duplex)模式不匹配14.私网通信链路流量控制(Flow-control)不匹配15.OS,网卡,交换机层面的数据包丢弃16.网卡驱动/固件配置问题17.网卡发送(tx)和接受(rx)队列的长度18.有限的负载能力和过于饱和的带宽19.过度的CPU申请和调度延迟20.和交换机相关的数据包处理问题21.QoS对私网数据包处理产生的负面影响22.重聚过程中生成树限电23.STREAMS队列的sq_max_size 配置太小24.VIPA和DGD设置不正确(仅限Aix平台)25.Solaris+Vertis LLT的环境上,交换机的错误配置
综上所述,出现gc cr/current block lost主要原因:
(1)网线/网卡/交换机出现问题。(2)网络相关参数配置不合理。
收集问题期间AWR报告:
gc cr block lost等待了1万多次,平均等待时长568ms通过AWR报告中的Global Cache Load Profile可以看到Estd Interconnect traffic(KB)只有400多KB,流量也不大。
检查操作系统网络信息:
发现有大量的fragments dropped after timeoutsy-creditrisk-db02[/home/oracle]$netstat -s|grep fragments21625481 fragments dropped after timeoutno -a | grep -E'udp_sendspace|udp_recvspace|tcp_sendspace|tcp_recvspace|rfc1323|sb_max|ipqmaxlen|tcp_ephemeral|udp_ephemeral'no -a | grep ephemeral
udp_sendspace值设置偏小
官方的建议udp_sendspace = ((DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT) + 4 KB)数据库的block_size应该是8192,多块读是128可以考虑调整以下值:# usr/sbin/no -p -o sb_max=20971520# usr/sbin/no -p -o tcp_sendspace=1048576# usr/sbin/no -p -o tcp_recvspace=1048576# usr/sbin/no -p -o udp_sendspace=2097152# /usr/sbin/no -p -o udp_recvspace=20971520
但是由于这些值一直没有改过,并且其他很多数据库都是这种配置,并且出现问题期间,RAC节点间通信流量并不大,所以问题很有可能出在网络上,需要重点排查网卡、交换机的。
网络排查:
测试两节点私有网络ping无延时和丢包现象。最后发现节点1私有网卡光衰特别大,怀疑光模块损坏。
解决方案:
一、联系硬件厂商更换光模块。
二、切换主备网卡
由于心跳网卡做了双网卡绑定,主备模式,当前主网卡出现问题,可以尝试切换到备网卡解决此问题,切换网卡步骤如下:
1.查看bond网卡信息lsdev -Cc adapter2.查看bond卡绑定信息lsattr -El ent01 ---绑定后的网卡名确认ent01由ent2和ent3绑定的bond网卡3.查看bond卡网卡流量输出状态entstat -d ent01 |more确认ent2为主网卡,流量包输出4.强制漂移网卡输入如下命令,点击回车smitty etherchannel5.选择:Force A Failover In An EtherChannel / Link Aggregation选择要漂移网卡回车-回车确认6.查看bond卡网卡流量输出状态entstat -d ent01 |more
三、验证
切换完网卡后,业务反馈恢复正常,可以正常跑批,检查netstat -s|grep fragments值也不在继续增加。
#####chenjuchao 2021-08-13 13:00#####

文章转载自IT小Chen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




