mysql 高tps sys_【原创】MySQL CPU %sys高的案例分析(一)

【现象】

最近关注MySQL CPU告警的问题时,发现有一种场景,有一些服务器最近都较频繁的出现CPU告警,其中的现象是 SYS CPU占比较高。

下面的截图来源于“MySQL CPU报警”采集的文件

c33e9d57707e2d31d85994ebc3adac2b.png

【问题分析】

可以分析出这服务器CPU升高的原因是由于表的高并发写入引起。优化方案通常是通知开发停止写入或降低写入频率。

究竟是什么原因导致高并发写入时CPU sys的占比这么高。

从采集的【Perf Stat】指标看到CPU有大量消耗是集中kernel的spin_lock上,推测sys的消耗占比是由spin lock引起的

b147276ede260f6bec6ccc8227c7402c.png

同时从这个系统调用中也可以比较清晰的看出一个INSERT语句的执行过程(只是执行路径上的部分关键函数),简单整理如下:

43e85d56cdf5f8c9b3730f9ef245426b.png

insert当获取不到rw-lock时,保持spin lock,进入短暂等待。高并发的大量访问出现资源竞争,大量线程出现spin lock及context switch,导致CPU飙升。

为了防止自旋锁循环过快,耗费CPU,MySQL中引入了innodb_spin_wait_delay参数,具体可参考下面的官方手册

7f069e6c36fe1dd3ca8fd22850ad5d5c.png

【问题重现】

在测试环境中,启用1000个并发线程模拟高并发写入的场景

1、innodb_spin_wait_delay和innodb_sync_spin_loops保持默认值不变

CPU idle在18%左右,sys占比40%多,TPS在1.5W左右

147c0b96daf43734b2d81df8fc169a94.png

83e8fb05008bcf79dec276890b4e2026.png

2、将变量适当增大SET GLOBAL innodb_spin_wait_delay=18;

(注意:18是在Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz 40核的CPU经过多次测试得出的相对合理的值,建议该值大小不要超过24)

可以观察到CPU idle在15%左右,sys占比降到20%多,TPS增加到1.75W左右,MySQL的插入性能约提升了16.7%

266b7ccd93591055008398c4e231fb9a.png

08e8d24eb4ef7a22712cd529175cb682.png

【结论】

对于MySQL高并发写入的场景,我们可以通过微调innodb_spin_wait_delay参数,减少kernel的spin_lock消耗,降低CPU的sys占比,从而提升MySQL的TPS处理能力。

dc944c804a85da95af7c105266e10138.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值