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


    【现象】

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

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

     

     

    【问题分析】

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

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

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

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

     

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

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

    https://dev.mysql.com/doc/refman/5.6/en/innodb-performance-spin_lock_polling.html

     

    【问题重现】

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

     

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

     

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

     

    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%

     

    【结论】

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


     

  • 相关阅读:
    自适应行高
    IOS各类问题
    KVC
    数据模型的构建及懒加载数据
    NSBundle
    九宫格布局获取行/列索引
    QLineEdit
    QLabel
    排序算法
    SpringBoot配置文件-yaml
  • 原文地址:https://www.cnblogs.com/wangdong/p/9237320.html
Copyright © 2020-2023  润新知