MySQL SYS CPU高的案例分析(一)
【现象】
最近关注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处理能力。
MySQL SYS CPU高的案例分析(一)的更多相关文章
- MySQL SYS CPU高的案例分析(二)
原文:MySQL SYS CPU高的案例分析(二) 后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压 ...
- MySQL CPU %sys 高的案例分析(三)
[现象] 最近有台服务器晚上CPU告警,系统抓取的故障期间的snapshot显示CPU %sys较高,同时context switch在300K以上. 是否过高的context switch引起的%s ...
- 【原创】MySQL CPU %sys高的案例分析(一)
[现象] 最近关注MySQL CPU告警的问题时,发现有一种场景,有一些服务器最近都较频繁的出现CPU告警,其中的现象是 SYS CPU占比较高. 下面的截图来源于“MySQL CPU报警”采集的文件 ...
- 【原创】MySQL CPU %sys高的案例分析(二)
后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压测程序,保持压测程序持续运行,保持innodb_sp ...
- CPU 上下文切换及案例分析
什么是CPU 上下文 我们都知道,Linux是一个多任务操作系统,它远支持大于CPU数量的任务同时运行,当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短时间内,将CPU轮流分配给他们,造成 ...
- 【MySQL】排序原理与案例分析
前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...
- Java Mysql连接池配置和案例分析--超时异常和处理
前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...
- MySQL服务器 IO 100%的案例分析
[问题] 有台MySQL 5.6.21的数据库实例以写入为主,IO %util接近100% 写入IOPS很高 [分析过程] 1.通过iotop工具可以看到当前IO消耗最高的mysql线程 2.查看线程 ...
- MySQL服务器发生OOM的案例分析
[问题] 有一台MySQL5.6.21的服务器发生OOM,分析下来与多种因素有关 [分析过程] 1.服务器物理内存相对热点数据文件偏小,62G物理内存+8G的SWAP,数据文件大小约550G 触发OO ...
随机推荐
- okhttp的简介(二)之简单封装
前一篇文章简单的介绍了okhttp的简单使用.okhttp的简介(一):http://blog.csdn.net/wuyinlei/article/details/50579564 相信使用还是非常好 ...
- ios开发网络学习:一:NSURLConnection发送GET,POST请求
#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...
- iOS开发Quartz2D之八:图形上下文状态栈
#import "DrawView.h" @implementation DrawView - (void)drawRect:(CGRect)rect { // Drawing c ...
- Android 圆角ListView
方法一:定义 <?xml version ="1.0" encoding ="UTF-8" ?> <shape xmlns:android = ...
- 小梦词典WP8.1应用发布
这几天一直在做这款应用,今天终于发布了! 小梦词典简介: 小梦词典是一款永久免费无广告的网络词典. 支持英汉单词查询: 支持中,英,法,韩,德,俄,日七国语言翻译,多语言极致体验: 支持生词本记忆,查 ...
- Android中动态设置GridView的列数、列宽和行高
在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的.但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量 ...
- Tampermonkey版Vimium
Tampermonkey版Vimium https://zhuanlan.zhihu.com/p/27222664
- Hibernate之HQL检索(查询)方式
HQL(Hibernate Query Language)是面向对象的查询语言,与SQL非常相似.在Hibernate中,HQL是使用最广泛的检索方式. 具有下面经常使用功能: (1)在查询语句中,能 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(5)有趣的指针
一.指针是C语言的灵魂 # include <stdio.h> int main(){ int *p; //p是变量名,int *表示p变量存放的是int类型变量的地址,p是一个指针变量 ...
- [Django] Building the rest API
Install the rest api framework: pip install djangorestfamework In settings.py: INSTALLED_APPS = [ 'd ...