mysql 案例 ~ sys占用率太高的问题分析

spin lock(自旋锁讲解)
一 定义和内容:
    1 spinlock叫做自旋锁,主要作用是给临界数据加锁,从而保护临界数据不被同时访问,实现多任务的同步。如果临界数据当前不可访问,那么就自旋直到可以访问为止。
    2 spinlock的工作方式本身就体现了它的优缺点,优点是执行速度快,不涉及上下文切换;缺点是耗费CPU资源,具体表现为sys占用率很高
    3 获取临界区的锁称为进入临界区,而把锁的释放称为离开临界区。Spinlock就是为了保护这临界区。
    4 cpu核心在很多对资源的申请和释放的时候都会通过spin lock对临界资源进行保护。需要进一步分析__spin_lock的来源。
二  mysql排查手段
    1 通过perf pid of mysqld 定位到 _spin_lock占用率太高
    2 利用pstack跟踪mysqld进程
       ptsack `pid of mysqld`
    3 分析ptsack日志
    4 查看mysql innodb status状态线程争用热点
三  具体表现
    sys cpu负载高主要以下:
     (1)cpu内核态spin,大量线程cpu在内核态自旋等待
     (2)系统上下文切换,又分为:
         spin仍然失败的,最终进入os wait,调用pthread_cond_wait等待条件满足时被唤醒 关键函数 pthread_cond_wait
         malloc()频繁加减os mutex,且系统内存紧张 关键函数 malloc
     (3)常见案例
         1 linux与mysql时区不一致导致的系统时区转化函数
         2 numa频繁分配内存导致的问题
        3  待补充
四 mysql内部全局锁说明
     kernel_mutex是个全局锁,保护事务,buffer pool,锁,等InnoDB存储引擎实现的大部分对象.当MySQL突然有大量访问,并发一旦非常高的时候,mutex冲突非常剧烈,此时临界区变得非常大,同时也会浪费cpu很多时间空转。所以这也解释了sys cpu大量消耗在自选空转中.在mysql8.0后 会对这个锁进行拆分
五  补充案例
   https://mp.weixin.qq.com/s/hXtCzSnlVfo9Cq92538ipw?

猜你喜欢

转载自www.cnblogs.com/danhuangpai/p/11790527.html