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 ...
随机推荐
- MySQL--10MySQL图形化管理工具
- linux shell脚本检测硬盘磁盘空间 邮件报警
使用 http://www.weiruoyu.cn/?p=368 shell脚本监控硬盘空间剩余空间 邮件报警 1.先观察一下磁盘,和如何使用脚本 [root@localhost ~]# df -h ...
- python date time
//test.py import time ticks = time.time()print tickslocaltime = time.localtime(time.time())print loc ...
- iOS UI进阶-3.0 核心动画
Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架<Quar ...
- 增删改(DML)操作
增删改(DML)操作 1.1事务(transaction) 事务是数据库操作的最小单元,又ACID的特性,应该保证一个事务的sql语句要么同时成功,要么都不成功. Mybatis中配置了事务管理器,t ...
- 003-SqlHelper.cs/Web.config
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访 ...
- c#之如何转换文本文件编码格式为utf-8
如代码: string content = File.ReadAllText(path, Encoding.Default); File.WriteAllText(path, content, Enc ...
- idea软件上设置爱彼迎字体
- Git-什么是分支
为了理解什么是分支,我们先要回顾Git是如何存储数据的. Git并不会保存文件的差异值或者说变化量,而是直接保存文件的快照. 在Git中提交时,会保存一个commit对象,该对象包含一个指向暂存内容快 ...
- 学习笔记<3>View接触
一.View基本概念 1.界面上显示所有的控件都是用对象表示的,即有类,这些类都是View的子类. 2.View的种类 二.在Activity当中获取代表View的对象 1.根据ID可以用方法获取到对 ...