墨墨导读:经常会看到看到cpu 使用率非常高的情况。在这种情况下,资源的使用监控分析才是性能故障分析的根本首要任务,通过这些分析,理解服务器如何运行,资源损耗在哪些方面对问题进行故障诊断是非常有价值有意义的。

经常会看到看到cpu 使用率非常高的情况。在这种情况下,资源的使用监控分析才是性能故障分析的根本首要任务,通过这些分析,理解服务器如何运行,资源损耗在哪些方面对问题进行故障诊断是非常有价值有意义的。MySQL那些情况,会导致cpu上升。

CPU的5种状态

在linux平台下cpu存在5种状态使用组合。


  • us:用户空间占用CPU百分比

  • sy:内核空间占用CPU百分比

  • ni:用户进程空间内改变过优先级的进程占用CPU百分比

  • id:空闲CPU百分比

  • wa: 等待输入输出的CPU时间百分比

  • hi: 硬件中断

  • si: 软件中断

  • st: 实时

备注:从上述情况介绍来看,sy系统和ni&si软硬中断,基本系统自动控制,干涉部分不是太多.us,id,wa有一定的优化空间,有效的使用资源。

通过上述介绍,已经了解了cpu的基础,下面看看MySQL方面cpu的表现。

MySQL常见CPU案例

以往的MySQL案例中,因为使用上的一些问题,经常会导致高CPU使用率上升情况:这里包括连接数增加、执行差效率的查询SQL、哈希连接或多表合并连接、写和读IO慢、参数设置不合理等。

1. SQL语句
那些常见的SQL语句会导致cpu上升 先从最直观的SHOW PROCESSLIST,查询时间长、运行状态(State列)
“Sending data”、
“Copying to tmp table”、
“Copying to tmp table on disk”、
“Sorting result”、
“Using filesort”等都可能是有性能问题的查询(SQL)。

“Sending data”官网解释:

The thread is reading and processing rows for a SELECT statement, and sending data to the client. Because operations occurring during this state tend to perform large amounts of disk access (reads), it is often the longest-running state over the lifetime of a given query.

状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

体现在:
1. 没有使用索引
2. mysql索引表结构,要是没有使用主键查询的话,需要进行回表操作,在返回客户端。
3. 返回的行数太多,需要频繁io交互

Copying to tmp table,Copying to tmp table on disk:官网解释:

Copying to tmp table
The server is copying to a temporary table in memory.
Copying to tmp table on disk
The server is copying to a temporary table on disk. The temporary result set has become too large

整体来说生成临时表内存空间,落磁盘临时表,临时表使用太
体现在 多表join,buffer_size设置不合理,alter algrithem copy等方式

Sorting result:

For a SELECT statement, this is similar to Creating sort index, but for nontemporary tables.

结果集使用大的排序,基本上SQL语句上order by 字段上没有索引

上述的情况大量堆积,就会发现CPU飙升的情况,当然也有并发量太高的情况。

优化方向:
1.添加索引,组合索引,坚持2张表以内的join方式 这样查询执行成本就会大幅减少。
2.隐私转换避免,系统时间函数的调用避免
3.相关缓存大小设置:join_buffer_size,sort_buffer_size,read_buffer_size ,read_rnd_buffer_size ,tmp_table_size。

在紧急情况下,无法改动下,通过参数控制并发度,执行时间 innodb_thread_concurrency ,max_execution_time都是有效的临时控制手段。

2. SQL语句
CPU对于IO方面的处理方式如下:等待的IO队列信息,会放置CPU里进行spin操作。

MySQL事务关联操作方面有redo, undo, binlog日志。但实际InnoDB实现方式是同步IO和异步IO两种文件读写方式

1.对于读操作,通常用户线程触发的数据请求都是同步读,其他后台线程触发的是异步读。
同步读写操作通常由用户线程来完成,当用户线程执行一句SQL时,如果请求的数据页不在buffer pool中,就需要将文件中的数据页加载到buffer pool中,如果IO有瓶颈,响应延迟,那么该线程就会被阻塞。

2.对于写操作,InnoDB是WAL(Write-Ahead Logging)模式,先写日志,延迟写数据页然后在写入磁盘,这样保证数据的安全性 数据不丢失;
异步写,主要在下面场景下触发

  • binlog,undo,redo log 空间不足时 ;

  • 当参数innodb_flush_log_at_trx_commit,sync_binlog设置为1时,每次事务提交都会做一次fsync,相当于是同步写;

  • master线程每秒做一次redo fsync;

  • Checkpoint

  • undo,binlog切换时

  • Page cleaner线程负责脏页的刷新操作,其中double write buffer的写磁盘是同步写, 数据文件的写入是异步写。

大量的io堆积,等待的状态下,都会导致CPU使用率上升。
log方面多注意以下方面配置:
1.相关mysql参数 innodb_flush_log_at_trx_commit ,sync_binlog,innodb_io_capacity ,sync_relay_log的参数合理设置。
2.独立表空间 (innodb_file_per_table),日志文件伸缩大小,临时表使用,
3.尽量使用IOPS高的硬件设备

SQL语句定位cpu核

通过sys库定位当前执行pid, 先对应3247

mysql> select thd_id,conn_id,user,pid,program_name,command,current_statement  from sys.processlist where conn_id>0 and pid>0;
+--------+---------+----------------+------+--------------+---------+-------------------------------------------------------------------+
| thd_id | conn_id | user           | pid  | program_name | command | current_statement                                                 |
+--------+---------+----------------+------+--------------+---------+-------------------------------------------------------------------+
|     33 |       3 | root@localhost | 3247 | mysql        | Query   | select thd_id,conn_id,user,pid ... list where conn_id>0 and pid>0 |
+--------+---------+----------------+------+--------------+---------+-------------------------------------------------------------------+
  • ps方式

通过ps工具查看对应的cpu是在哪个核上执行

[root@ss30 ~]# ps -o pid,psr,comm -p 3247PID PSR COMMAND3247   3 mysql

输出表示进程的 PID 为 3247(名为”mysql”)目前在编号为 3的CPU 上运行着。如果该过程没有被固定,PSR 列会根据内核可能调度该进程到不同CPU而改变显示。

  • top方式
    通过top方式查看对应的cpu是在哪个核上执行,
    按下 “F”键->使用上下键选择P = Last Used Cpu,并按下空格键,出现 “*”即可->ESC 退出,这时候top界面上的P列就是对应的CPU信息.

[root@ss30 ~]# top -p 3247

总结

以往的CPU案例中,优化的方向:

  • 对于MySQL硬件环境资源,建议CPU起步8核开始,SSD硬盘;

  • 索引 ,合理设计表结构,优化SQL。

  • 读写分离,将对数据一致性不敏感的查询转移到只读实例上,分担主库压力。

  • 对于由应用负载高导致的 CPU 使用率高的状况,从应用架构、实例规格等方面来解决。

  • 使用 Memcache 或者 Redis缓存技术,尽量从缓存中获取常用的查询结果,减轻数据库的压力。

MySQL性能测试CPU优化方向:

  • 系统参数:磁盘调度算,SHELL资源限制,numa架构,文件系统ext4,exfs

  • 刷新mysql log相关刷新参数:
    临近页(innodb_flush_neighbors)
    死锁检查机制(innodb_deadlock_detect),
    双1刷新:sync_binlog,innodb_flush_log_at_trx_commit

  • 并发参数: innodb_buffer_pool_instances, innodb_thread_concurrency 等

  • 因为一些服务器的特性,导致cpu通道 和 内存协调存在一些问题,导致cpu性能上去得案例也存在

墨天轮原文链接:https://www.modb.pro/db/26704(复制到浏览器中打开或者点击“阅读原文”)

推荐阅读:144页!分享珍藏已久的数据库技术年刊

数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

MySQL CPU性能定位相关推荐

  1. 计算机未来新CPU,桌面CPU性能排行 CPU天梯图2017年11月最新版 (全文)

    又到了月末,每个月本站都会带来最新的桌面CPU天梯图.对于那些喜欢了解CPU性能定位的网友来说,比较关注CPU天梯图.这样直观了解到处理器性能的大概情况.此次的CPU天梯图11月版主要是在之前的「CP ...

  2. 台式计算机排行榜2018,电脑CPU天梯图2018年7月最新版 台式电脑cpu性能排行榜

    电脑CPU天梯图2018年7月最新版分享给大家,包括Intel平台和AMD平台.七月电脑CPU天梯图性能排行,主要在之前版本当中进行细节优化和处理,对于那些老款处理器,已经过时的产品进行删除,新增了一 ...

  3. 【Linux 性能优化】利用perf和CPU使用率定位异常函数

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 文章目录 CPU 使用率 进程运行情况查询 使用工具查看CPU使用率 定位导致CPU 使用率过高的函数 perf to ...

  4. Mysql数据库高CPU问题定位和优化

    本课程的主旨及目标 •导致mysql数据库CPU高的常见原因 •常见定位问题的方法 •一般定位步骤 •数据库注意事项 导致mysql数据库CPU高的常见原因 占用CPU过高,可以做如下考虑: 1)一般 ...

  5. MySQL服务器性能(通过Sysbench测试cpu、io、内存以及mysql服务等)

    – Sysbench测试 Sysbench的安装请参考:http://blog.csdn.net/csdnhsh/article/details/8951289 1 CPU测试 sysbench采用寻 ...

  6. mysql怎样快速定位当前比较耗费cpu的sql

    先使用top命令查看cpu整体使用情况: 再使用top -H查看线程cpu使用情况: #记录下pid,然后进数据库里查询下其对应的sql: 1.查看线程信息 SELECT * FROM perform ...

  7. DBA很忙—MySQL的性能优化及自动化运维实践

    作者:王辰 来自:高效运维(ID:greatops) DBA的日常工作 首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 D ...

  8. Intel PAUSE指令变化影响到MySQL的性能,该如何解决?

    MySQL得益于其开源属性.成熟的商业运作.良好的社区运营以及功能的不断迭代与完善,已经成为互联网关系型数据库的标配.可以说,X86服务器.Linux作为基础设施,跟MySQL一起构建了互联网数据存储 ...

  9. #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)

    Linux + JVM + Mysql高级性能优化课程 课程名称:      Linux + JVM + Mysql高级性能优化 QQ群:      243242580(小白.菜鸟勿进)跟Java.M ...

最新文章

  1. java aio事件模型_IO模型之AIO代码及其实践详解
  2. MYSQL基础--学习笔记
  3. 二级c语言上机编程技巧,二级C语言上机编程题技巧总结
  4. @ResponseBody,@RequestBody,@PathVariable
  5. C# does not contain a constructor that takes no parameter
  6. 创建自定义Tabs组件-01
  7. python多任务笔记
  8. 【Spark-core学习之六】 Spark资源调度和任务调度
  9. layui第三方插件引入_插件分享 | 可以进行web爬虫的Xray插件(文章末尾有福利)...
  10. 7. 查看当前库状态
  11. 记一次Win7连接XP共享打印机
  12. java自动洗扑克牌算法_扑克牌 洗牌算法 的java实现
  13. CTFHUB中的文件上传——文件头检查
  14. Android 7.0 APN 拨号上网流程分析
  15. 第7章第31节:四图排版:四张图片两两一组并行排列 [PowerPoint精美幻灯片实战教程]
  16. nabc模型_团队开发-极速蜗牛-NABC模型
  17. Python绘制小红花
  18. windows10 家庭版 Hyper-V 虚拟机服务开启与应用 (一)
  19. Java3D加载obj文件+mtl文件
  20. 正点原子FreeRTOS(上)

热门文章

  1. 使用Ansible进行硬件引导
  2. WOOTConf 2017:Lockpicking,Willie Nelson开发人员等等
  3. 面试 | 你说你熟悉MySql,那你就来谈谈InnoDB如何解决幻读的?
  4. 一个基于Node.js的本地快速测试服务器 1
  5. 脚本化HTTP 取得响应 指定请求
  6. Bootstrap 进度条
  7. es6 for...of 循环
  8. 视觉SLAM笔记(32) 2D-2D: 对极几何
  9. android逆向分析有什么用,如何开始对Android应用的逆向分析?
  10. 机器人J中WPR_机器人经颅磁刺激(Robotized TMS)技术知多少?