MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析

问题背景

我们在管理繁忙的 MySQL 数据库时,可能都有碰到 SYS CPU 高的经历:系统突然 SYS CPU 高起来,甚至比 USER CPU 高很多,这时系统 QPS、TPS 急剧下降。

SYS CPU高是什么造成的呢?主要有2种可能:

1. context switch 不高,但在内核态 spin,导致 SYS CPU 高

2. context switch 高,每秒超过 200K,有时超过1M,过多 context switch 导致 SYS CPU 高

下面我们对这两种情况逐一分析。

context switch 不高,但在内核态 spin

MySQL 在内核态 spin,说明需要系统资源,当这个资源紧张不足时,就会在内核态 spin。

有些资源,用户进程(或线程)通过执行系统调或因中断进入内核,一般来说申请这些资源的执行时间很短,当出现资源争用时,如果采用 sleep 再唤醒机制,代价较大,因此多采用在内核态spin的策略。

例如申请内存或发生缺页中断,没有 free 内存可用时,进程或线程就可能在内核态先执行内存回收再执行内存分配,但系统内存是共享资源,分配回收时需要锁保护,当多个进程(或线程)同时回收分配内存时。就会在内核态 spin。

当 free 内存不足时,可能出现这种情况。典型症状:

MySQL running 高,但系统 qps、tps 下降

系统 free 内存不足;或系统 free 内存充足时,但启用了 numa 内存分配策略,有的节点 free 内存很少

系统 context switch 不高

MySQL InnoDB 的 mutex、RWlock 查不到等待信息

sar -B 显示有 pgscand 产生

分析

当系统内存不足时,MySQL 突然有大量访问,紧急需要大量内存,kswapd 在短时间内回收不了足够多的 free 内存,或 kswapd 还没有触发执行,这时 MySQL 用户线程就会在内核态执行内存回收操作,从而出现以上症状。

sar -B 输出中,pgscank 是表示内核线程 kswapd 回收内存,k意思是 kernel;pgscand是表示用户进程或线程直接回收内存,d意思是direct。

解决办法:保证系统有充足 free 内存可用,NUMA 环境要求每个节点都有足够free内存可用。

由于 Linux 系统会尽量使用 free 内存,一个运行很久的 Linux 系统,free内存通常很少,存在大量 filecache 内存,但 Linux 没有直接提供控制 filecache 占用多少的参数,那怎么能够保留足够可用的 free 内存,以应对突然内存需求呢?

对此,Linux 2.3.32+ 内核中增加一个新的参数vm.extra_free_kbytes,就是控制free内存的。

关于系统free内存,有2个重要参数:vm.min_free_kbytes 和 vm.extra_free_kbytes(2.6.32+)

vm.min_free_kbytes:系统保留给内核用的内存。

这个值决定/proc/zoneinfo 中 zone 的min值。当系统 free 内存小于这个值时,kswapd 会回收内存,直到free内存达到/proc/zoneinfo中 high 值才停止回收;

当用户进程或线程分配内存或发生缺页中断时,free 内存少于vm.min_free_kbytes,会在用户线程上下文中直接进行回收内存(pgscand)和分配内存。

vm.extra_free_kbytes:系统保留给应用的free内存。

这个值决定了/proc/zoneinfo中Normal zone的low值。当系统free内存小于vm.min_free_kbytes+vm.extra_free_kbytes 时,kswapd会开始回收内存,直到free内存达到 /proc/zoneinfo 中high值才停止回收。

这个额外的vm.extra_free_kbytes就是给应用突发内存需求时使用的,避免急需内存时发生pgscand或kswapd回收内存不及时。

vm.extra_free_kbytes 分配多大合适呢?一般能应对流量高峰时1-2秒内存需求就可以了。free内存减少后,kswapd进程会在后台回收内存的,一般512M-2G可以满足要求。

context switch 高

有很多种情况都会导致 context switch。MySQL 中的 mutex 和 RWlock 在获取不成功后,短暂spin,还不成功,就会发生 context switch,sleep,等待唤醒。

在 MySQL中,mutex 和 RWlock导致的 context switch,一般在showglobalstatus,show engine innodb mutex,show engine innodb status,performance_schema等中会体现出来,针对不同的mutex和RWlock等待,可以采取不同的优化措施。

除了MySQL的mutex和RWlock,还发现一种情况,是MySQL外的mutex竞争导致context switch高。

典型症状:

MySQL running 高,但系统 qps、tps 低

系统context switch很高,每秒超过200K

在 MySQL 内存查不到mutex和RWlock竞争信息

SYS CPU 高,USER CPU 低

并发执行的SQL中出现timestamp字段,MySQL的time_zone设置为system

分析

对于使用 timestamp 的场景,MySQL 在访问 timestamp 字段时会做时区转换,当 time_zone 设置为 system 时,MySQL 访问每一行的 timestamp 字段时,都会通过 libc 的时区函数,获取 Linux 设置的时区,在这个函数中会持有mutex,当大量并发SQL需要访问 timestamp 字段时,会出现 mutex 竞争。

MySQL 访问每一行都会做这个时区转换,转换完后释放mutex,所有等待这个 mutex 的线程全部唤醒,结果又会只有一个线程会成功持有 mutex,其余又会再次sleep,这样就会导致 context switch 非常高但 qps 很低,系统吞吐量急剧下降。

解决办法:设置time_zone=’+8:00’,这样就不会访问 Linux 系统时区,直接转换,避免了mutex问题。

另外,对于spin消耗,MySQL配置变量中的innodb_spin_wait_delay 和 innodb_sync_spin_loops 可以用于微调。

作者介绍

高亚芳 北京理工大学计算机系毕业,IT行业老兵,目前负责数据存储基础架构工作,开源爱好者。

来源: http://mysql.taobao.org/monthly/2015/05/02/

高亚芳 mysql_MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析相关推荐

  1. MySQL数据库SYS CPU高的可能性分析

    问题背景 我们在管理繁忙的 MySQL 数据库时,可能都有碰到 SYS CPU 高的经历:系统突然 SYS CPU 高起来,甚至比 USER CPU 高很多,这时系统 QPS.TPS 急剧下降. SY ...

  2. linux mysql cpu 高,Linux系统中关于Mysql数据库导致CPU很高的问题解决

    Linux系统中关于Mysql数据库导致CPU很高的问题解决 发布时间:2007-11-19 00:01:12来源:红联作者:spworks 服务器环境 Liunx AS4 + PHP5 + Mysq ...

  3. 连接MySQL数据库时常见故障问题的分析与解决

    连接MySQL数据库时常见故障问题的分析与解决 初学的mysql网友好象经常会碰到mysql无法连接的错误.特开贴收集这样问题的现象和原因. 先自己扔块砖头出来. 归纳如下: 故障现象 : 无法连接 ...

  4. mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决

    本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨 ...

  5. Mysql数据库基础及高阶

    基础篇 通用语法及分类 DDL: 数据定义语言,用来定义数据库对象(数据库.表.字段) DML: 数据操作语言,用来对数据库表中的数据进行增删改 DQL: 数据查询语言,用来查询数据库中表的记录 DC ...

  6. MySQL 数据库之 MMM 高可用架构构建

    文章目录 一.MMM 概述 1. 什么是 MMM 2. 应用场景 3. MMM 特点 4. 关于 MMM 高可用架构的说明 5. 用户及授权 二.案例环境 1. 服务器配置 2. 服务器环境 3. 修 ...

  7. mysql怎么定位cpu高_Mysql数据库服务器CPU冲高问题定位及分析

    1.现象概述和初步分析<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /& ...

  8. 瀚高数据库和mysql区别,MySQL数据库迁移瀚高数据库

    1.瀚高数据库安装 下载Highgo Database安全版rpm包并上传至服务器,使用如下命令进行安装 rpm -ivh hgdb5.6.4-enterprise-rhel7.x-x86-64-20 ...

  9. MySQL数据库迁移瀚高数据库

    1.瀚高数据库安装 下载Highgo Database安全版rpm包并上传至服务器,使用如下命令进行安装 rpm -ivh hgdb5.6.4-enterprise-rhel7.x-x86-64-20 ...

最新文章

  1. javaScript入门之常用事件
  2. 工具类静态方法注入dao
  3. 基于MATLAB的OSPF协议网络仿真
  4. gitlab linux版本下载,Linux安装GitLab版本控制软件
  5. freebsd从安装到想要的状态配置
  6. 【蓝桥杯嵌入式】【STM32】9_PWM之实现交替呼吸灯
  7. 深度学习系列--1.入坑模型: 线性回归,logistic 回归,softmax分类器
  8. OC对象之旅 weak弱引用实现分析
  9. 常用数据库的字段类型及大小
  10. Photoshop/PS中如何写维吾尔语等语言 乱码
  11. android开源音乐播放器简单demo,Android开源在线音乐播放器——波尼音乐
  12. 阿里矢量图标及其引入方式
  13. 《王垠、赵海平列传(1)》:“成为最伟大的计算机科学家!”
  14. Qt安装包下载(Windows平台)
  15. iPad/iPhone内存管理五之如何确定对象返回的值是autorelease
  16. IDM UEStudio 19中文版
  17. 《RCLane:Relay Chain Prediction for Lane Detection》论文笔记
  18. 技术一般的程序员找工作,如今真的一年比一年难...
  19. 计算机系单身率排行榜,单身率最高的专业排行!脱不了单的原因找到了
  20. php形参问号?的作用

热门文章

  1. 使用Hash直接登录Windows
  2. 1.4. Rosegarden
  3. Mysql主从复制及Tomcat的相关介绍
  4. Bootstrap框架中的字形图标的理解
  5. 高清视频实时对讲SDK源码
  6. struts2+hibernate-jpa+Spring+maven 整合(1)
  7. 快速上手RaphaelJS-Instant RaphaelJS Starter翻译(一)
  8. c++,不能声明为虚函数的函数
  9. 时序数据采样、原始循环神经网络RNN、RNN梯度爆炸原因推导
  10. Spark RDD API:Map和Reduce