mysql服务器iowait高优化一例完整深入解析
我们有一服务器,上面运行着两个mysql实例,这几天iowait一直很高,在20-30%,下午特地专门排查和解决了下,相关过程整理如下。
该服务器有两个挂载盘,服务器在阿里云上,一个系统盘,一个数据盘。
因为非生产库,测试kill -9 mysql-pid后,top如下:

虽然mysql占用内存释放了,但是swap还是占着,虽然swap没有释放,但其不一定会用到,如下:

可见,swap没有活动,但是io很高(block out),bo是写磁盘。
如果不放心swap占用的话,可以通过下列命令释放swap
# sync
# echo 3 > /proc/sys/vm/drop_caches
# swapoff -a
执行后,会将swap中缓存的数据刷新到磁盘,并逐渐释放,如下:


# swapon -a # 启用swap
但是io还是很高,此时,可通过iotop确定是那些文件、哪些进程的io读写频繁,可知是mysqld和jbd2(ext4写日志的进程)为主,并且主要在vda盘。

但是,仅仅iotop看不出每个磁盘设备的完整情况,此时可通过sar -d看每块盘的情况,如下:

由上图可知,主要是vda设备的写入特别繁忙。
DEV 磁盘设备
用参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s:每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱
接下去,我们就可以通过pt-ioprofile查看io读写最多的文件(虽然pt-ioprofile是percona发布的,但是它同样可以查看其他程序比如java进程的io读写)。


需要注意的是,pt-ioprofile输出中每列含义的实际意义要根据上下文来说,没有直接的过高或者过低。在本例上,我们上述已经知道磁盘写是瓶颈,所以read/lseek需要忽略。
pwrite/write是消耗iowait的主要部分。
在我们的问题中,data/data2是两个实例的data_dir,都在vda挂载的FS中,所以我们需要将其移动到vdb才能缓解。
因为移动整个实例不太现实,所以,我们打算移动部分文件到vdb。注:iowait的比例范围跟磁盘数有关,越多,iowait可能的值越大。

现在,来说下打算移动哪些文件。
oracle和mysql最大的差别在于:
oracle不存在引擎插件一说,所以,没有mysql的innodb_log和mysql_bin之分,同时mysql还有一个doublewrite文件,应该来说,任何时候这三个是最占据io的文件,data文件一般不会成为瓶颈。
从上可知,doublewrite是消耗大户,应该放到单独磁盘比较合适,只不过5.6版本之后,percona server去掉了innodb_doublewrite_file这个参数(percona 5.7新增了一个相关参数innodb_parallel_doublewrite_path,尚未仔细测试https://www.percona.com/doc/percona-server/5.7/performance/xtradb_performance_improvements_for_io-bound_highly-concurrent_workloads.html),mysql本身不支持自定义doublewrite的位置。所以,打算挪binlog和ib_log,故更改初始化参数innodb_log_group_home_dir=/VDB_DATA、log_bin=/VDB_DATA/mysql-bin、log_bin_index=/VDB_DATA/mysql-bin.index,重启mysql实例后,如下:



虽然vda依然繁忙,但是vdb已经分担了部分的io活动。
再进一步,我们可以通过ps -eLf找到23078线程所属进程,如下:

用ioprofile确定是哪个文件:

此时,主要是slave相关文件。
注意:在很多的优化文章或者PPT中,会见到建议将slave_master_info存储为innodb表,事实上在io是瓶颈的系统中,由于mysql实现体系的原因,将其存储在innodb中会加剧xb_doublewrite的活动,不一定能够达到更好的效果,甚至更差(https://dev.mysql.com/doc/refman/5.7/en/slave-logs.html)。
更改relay-log-index=/VDB_DATA/relay-bin.index,relay-log=/VDB_DATA/relay-bin,重启mysql实例后,如下:

调整后,io分布式是比较均匀了,但是可以发现vdb的iops明显低于vda,所以可能还需要进一步调整以达到较为满意的效果。
iops的测试,请参见拿到新服务器时应做的标准测试。
mysql服务器iowait高优化一例完整深入解析的更多相关文章
- mysql服务器和配置优化
一.存储引擎 mysql中有多种存储引擎,一般常见的有三种: MyIsam InnoDB Memory 用途 快读 完整的事务支持 内存数据 锁 全表锁定 多种隔离级别的行锁 全表锁定 持久性 基 ...
- MySQL派生表(derived)优化一例
1.什么是派生表derived 关键字:子查询–>在From后where前的子查询 mysql; +----+-------------+------------+------+-------- ...
- 如何解决mysql服务器load高
.登录主机 # ssh hostname .确定是否是mysql导致 # top .查看是哪些sql正在慢查询 # mysql -h hostname -P port -u username # sh ...
- MySQL主主高可用(keepalive)
2台新的虚拟机172.16.1.1.172.16.1.2 (配置yum源 ) 安装数据库服务 其中 172.16.1.1.172.16.1.2运行数据库服务并设置数据库管理员从本机登录的密码是xzw ...
- Mysql占用过高CPU时的优化手段
Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...
- MySQL MyISAM/InnoDB高并发优化经验
最近做的一个应用,功能要求非常简单,就是 key/value 形式的存储,简单的 INSERT/SELECT,没有任何复杂查询,唯一的问题是量非常大,如果目前投入使用,初期的单表 insert 频率约 ...
- MySQL优化:使用show status查看MySQL服务器状态信息
在网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL执行了多少SE ...
- (转)Mysql占用过高CPU时的优化手段
Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...
- 【MySQL优化】使用show status查看MySQL服务器状态信息
在网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL执行了多少SE ...
随机推荐
- js抽红包分配
将 50000元随机分给10个人,其中3个人必须分到百位数,4个人分到千位数,3个人分到万位数,每个人所得金额 <!DOCTYPE html> <html lang="zh ...
- 笔记本(ThinkPad)怎样关闭触摸板
随着笔记本电脑的普及,人们越来越习惯于出门使用笔记本,笔记本的便捷高效也大幅度地提升了人们的工作效率.但是如果居家使用笔记本电脑,也有其不便之处.比如在键盘上打字,很容易就会喷到触摸板,以至于光标一下 ...
- 纯HTML和CSS实现点击切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- css 清除一些默认的设置
一.input标签的placeholder的设置 input::-webkit-input-placeholder{ /*WebKit browsers*/ //重置样式 } input::-moz- ...
- net npoi将List<实体>导出excel的最简单方法
只是临时导数据用的.方便.最基本的方法, [HttpGet] [Route("ExportEnterprise")] public BaseResponse ExportEnter ...
- c#关于字符串格式化
1. 如何使用文化来格式化日期 如: /// <summary> /// 根据语言获取文化名称 /// </summary> /// <returns></r ...
- 环形数组 最大子段和 dp
题目链接:https://nanti.jisuanke.com/t/36118 环形数组的连续最大子段和,有两种情况. 1.最大和的这个子段没有包含头尾.所以直接dp[i] = max(dp[i-1] ...
- rpgmakermv(10) GraphicalDesignMode
插件地址:https://github.com/triacontane/RPGMakerMV/blob/master/GraphicalDesignMode.js 原文: メニュー画面や戦闘画面など各 ...
- 导航,头部,CSS基础
1.制作自己的导航条. 2.HTML头部元素: <base> 定义了页面链接标签的默认链接地址 <style> 定义了HTML文档的样式文件 <link> 定 ...
- mybatis源码解析8---执行mapper接口方法到执行mapper.xml的sql的过程
上一篇文章分析到mapper.xml中的sql标签对应的MappedStatement是如何初始化的,而之前也分析了Mapper接口是如何被加载的,那么问题来了,这两个是分别加载的到Configura ...