我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Mysql】主机cpu 之-sys使用率过高

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Mysql】主机cpu 之-sys使用率过高

学习大神的http://mp.weixin.qq.com/s/hXtCzSnlVfo9Cq92538ipw自己整理一点思路
1.0top看cpu消耗,发现sys比usr要高不少,这非常不正常


1.1使用pstack看 MySQL所有线程的调用栈:

InnoDB线程同步机制

我们知道linux线程同步有Mutex,spin lock,条件变量,rw lock等多种同步机制,InnoDB并没有直接使用系统的同步机制,而是自己定义了互斥结构数据结构kernel_mutex,将系统的spin lock,mutex,和条件变量融合一起

【Mysql】主机cpu 之-sys使用率过高

如图,kernel_mutexmutex对象的中重要的结构成员为os_event和lock_word。

  • kernel_mutex主要涉及mutex_create,mutex_enter,mutex_exit函数,会分别使用glibc的malloc()和free()调用动态分配和释放内存

  • 封装mutex和条件变量,图中绿色框区域
    MySQL线程之间发送异步信号来进行同步主要通过os_event_struct结构体中的os_mutex(封装os的pthread_mutex_t)和cond_var(封装os的pthread_cond_t)成员对象实现。当InnoDB在获取锁的时候,首先先努力自旋一段时间,如果超过innodb_sync_spin_loops的阈值,就会通过函数os_event_wait_low()在os_event_struct->cond_var上等待。如图,当某个线程释放了锁的时候,通过os_cond_broadcast尝试发送广播唤醒所有等待os_event_struct->cond_var条件变量的线程.这些线程被唤醒后又继续竞争争抢os_event_struct->os_mutex

  • spin lock,图中黄色框区域
    通过lock_word做spin wait。线程想要争抢锁的时候先判断这个值,如果lock_word为1就继续自旋等待。如果发现其他线程释放了锁该值变为0的时候,就通过test_and_set改为1,"告诉"其他线程这把锁被持有了

InnoDB这样设计的目的都是延缓线程被挂起并进入os wait的速度,因为每一次进入os wait等待被唤醒或者唤醒都会进行一次上下文切换.但是也只能是延缓,并不能阻止,如果持续恶化得不到环境,最后仍然会进入os的等待队列,将会产生大量的上下文切换。但是有两个问题:

  • kernel_mutex是个全局锁,保护事务,buffer pool,锁,等InnoDB存储引擎实现的大部分对象.当MySQL突然有大量访问,并发一旦非常高的时候,mutex冲突非常剧烈,此时临界区变得非常大,同时也会浪费cpu很多时间空转。所以这也解释了sys cpu大量消耗在自选空转中

  • 并且并发高的时候会频繁调用malloc()申请内存,而glibc本身的malloc()本书频繁调用系统mutex_lock()和unlock(),在多线程高并发场景下并且资源不足的场景下,也会造成系统各种mutex竞争严重。大量线程被挂起等待os pthread_cond_broadcast广播被唤醒,随之而来的是大量的上下文切换

通过dstat看到此时cpu每秒有近20W次的上下文切换,综上所述,sys cpu负载高主要以下:

  • (1)cpu内核态spin,大量线程cpu在内核态自旋等待

  • (2)系统上下文切换,又分为:

    • spin仍然失败的,最终进入os wait,调用pthread_cond_wait等待条件满足时被唤醒

    • malloc()频繁加减os mutex,且系统内存紧张


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Mysql】主机cpu 之-sys使用率过高

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

排查WMI CPU使用率过高问题

排查WMI CPU使用率过高问题的步骤如下:1. 确认问题:首先,确认系统的CPU使用率确实过高。可以通过任务管理器或性能监视器来查看CPU的使用情况。2. 确定WMI进程:在任务管理器的进程选项卡中,查找名为"wmiprvse.exe"的
2023-09-13

虚拟主机cpu占用率高如何解决

虚拟主机的 CPU 占用率高可能是由以下原因导致:1. 资源不足:虚拟主机所分配的 CPU 资源不足以满足当前的负载需求。解决方法可以是增加虚拟主机所分配的 CPU 资源,或者升级至更高配置的虚拟主机。2. 应用程序负载过高:虚拟主机上运行
2023-09-06

电脑cpu使用率过高如何解决

高CPU使用率可能是由于以下原因引起的:1. 病毒或恶意软件:运行一个病毒扫描程序来检测和清除任何可能感染计算机的恶意软件。2. 后台进程:检查任务管理器,找出哪些进程占用了大量的CPU资源。如果是不必要的进程,可以尝试关闭它们或卸载相关软
2023-08-23

防止Golang后台进程CPU使用率过高

一分耕耘,一分收获!既然打开了这篇文章《防止Golang后台进程CPU使用率过高》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢
防止Golang后台进程CPU使用率过高
2024-04-05

虚拟主机cpu占用率很高如何解决

如果虚拟主机的CPU占用率很高,可以尝试以下解决方法:1. 优化网站代码:检查网站的代码是否存在效率低下的部分,尽量减少不必要的计算和循环,优化数据库查询语句等,以减少CPU的负载。2. 缓存数据:对于频繁访问的数据,可以使用缓存技术,将数
2023-09-12

Linux系统CPU使用率过高的排查技巧

本篇内容介绍了“Linux系统CPU使用率过高的排查技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面,介绍几个 CPU 使用率过高的排
2023-06-16

遇见Linux系统CPU使用率过高怎么办?

导读对于新手来说,可能各种进程管理工具用的还不算熟悉,那么遇见Linux系统CPU系统使用率过高怎么办?那么就学习一下吧。查看CPU使用
2023-06-05

win8开机后CPU占用率过高只因开启了云同步

现在很多朋友的是使用的win8系统,得益于win8系统本身的云属性,很多设置、文件都可以在云端同步,即使在别的系统中只要我们用自己的微软账户登录,就能通过联网同步我们熟悉的设置和文件,很方便的说。但与此同时,我们如果一直微软的账户登录,并开
2022-06-04

mysql内存使用率过高怎么解决

如果MySQL内存使用率过高,可以尝试以下方法来解决:优化数据库配置:检查MySQL配置文件,根据实际情况调整缓冲区大小、连接数等参数,以减少内存使用。优化查询语句:优化查询语句,避免不必要的全表扫描和索引扫描,提高查询效率,减少内存占用。
mysql内存使用率过高怎么解决
2024-04-09

无需备案虚拟主机为什么会出现cpu占用率高

无需备案虚拟主机出现cpu占用率高的原因有:1、CPU硬件问题,如CPU温度过高、硬件配置不合理、CPU核心频率不足、硬件驱动程序未经认证或认证不合法等原因造成;2、系统软件问题,如多个程序同时运行导致CPU使用率过高;3、虚拟主机被流量攻
2023-02-08

编程热搜

目录