今天,将一个环境切换成行情优化后的版本后,发现io等待还是挺高,这还是第一次出现的。其他很多套环境都没有这个问题了,故iotop看了下,基本可以确定为是mysql进程的问题,如下:

但是iotop只能看到进程级别,对于rdbms而言,通常力度并不够,此时需要进一步使用其他工具比如io-profile(io-profile需要安装percona-toolkit,具体可搜索网上,比如http://www.cnblogs.com/zping/p/5678652.html),可以进一步attach到具体的进程,然后定位到具体的文件,如下:

[root@iZbp112kwadw1qt8emked5Z local]# pt-ioprofile  --profile-pid=26256 --cell=sizes --run-time=30
Fri Feb 17 10:57:45 CST 2017
Tracing process ID 26256
total pread read pwrite write fsync open close lseek fcntl filename
64987456040 9890596 48180 0 0 0 0 0 64977517264 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/mysql/proc.MYD
17101824 0 0 17101824 0 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/ib_logfile0
8159232 0 0 8159232 0 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_act/tb_act_stock_quotation_tmp.ibd
5329976 137 591 5308416 0 0 0 0 20832 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_sys/tb_sys_stock_info_tmp.ibd
1474560 0 0 1474560 0 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/ibdata1
632856 3400 14800 114688 0 0 0 0 499968 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_sys/tb_sys_stock_info_tmp.frm
564372 4150 18590 0 0 0 0 0 541632 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_act/tb_act_stock_quotation_tmp.frm
132508 0 0 0 132508 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/mysql-bin.000056
15028 0 0 0 15028 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/iZbp112kwadw1qt8emked5Z.err
9189 0 0 0 9189 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/iZbp112kwadw1qt8emked5Z-slow.log
2742 0 0 0 0 0 0 0 2742 0 /tmp/ibpJOVg5
0 0 0 0 0 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_sys/tb_sys_stock_info.ibd
0 0 0 0 0 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_rsk/tb_rsk_compliancecalcservice.ibd
0 0 0 0 0 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_act/tb_act_stock_quotation.ibd
[root@iZbp112kwadw1qt8emked5Z local]#

pread/read/pwrite/write的区别如下:

内核文件I/O->标准库I/O->高级I/O->IPC

关于read/pread和write/pwrite的解释,可以参考http://www.cnblogs.com/brill/p/3226439.html,但是关于引入pread/pwrite的背景原因,应该来说现行网上的解释都不是很好,只有帖子http://tieba.baidu.com/p/2850517299的一个答复者精确的说明了这个问题,如下:

首先pread、pwrite提出的背景是早期的UNIX没有正确地实现O_APPEND,因而引入一对原子操作,来解决append过程中的“脏写”问题。解决方法就是靠第四个参数来给每个进程(线程)分配各自的读写空间,避免它们的读写空间相互覆盖。前提是程序员清楚地知道每个线程需要多大的读写空间。
其次,如果有循环读写的需求,也需要修改第四个参数,从而改变起始位置。
总之,pread、pwrite是一对很实用的随机读写接口。

很多框架或者类库发展到成熟版本后,很多特性或者接口为何以当前这样的方式实现或者提供,有时候真得知道或者了解当时的技术限制、业务场景,才能领会,否则很可能就是觉得很多今天看起来很普通的特性、为什么框架作者绕了一个大圈子来实现。

在我们的系统中,因为大量使用了存储过程,所以导致proc.MYD的lseek奇高。而tb_act_stock_quotation_tmp.ibd和tb_sys_stock_info_tmp.ibd则是load infile local到innodb文件所致。将这两个表的引擎改成memory后,io等待就降低到1%以下,而且从io-profile中消失了,如下:

[root@iZbp112kwadw1qt8emked5Z logs]# pt-ioprofile  --profile-pid=26256 --cell=sizes --run-time=30
Fri Feb 17 11:25:23 CST 2017
Tracing process ID 26256
total pread read pwrite write fsync open close lseek filename
68397517302 9658786 49780 0 0 0 0 0 68387808736 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/mysql/proc.MYD
4276736 0 0 4276736 0 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/ib_logfile2
1991058 13836 60678 0 0 0 0 0 1916544 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_sys/tb_sys_stock_info_tmp.frm
138261 0 0 0 138261 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/mysql-bin.000056
86948 660 2960 0 0 0 0 0 83328 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/db_act/tb_act_stock_quotation_tmp.frm
16041 0 0 0 16041 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/iZbp112kwadw1qt8emked5Z.err
2742 0 0 0 0 0 0 0 2742 /tmp/ibpJOVg5
460 0 0 0 460 0 0 0 0 /usr/local/Percona-Server-5.6.31-rel77.0-Linux.x86_64.ssl101/data/iZbp112kwadw1qt8emked5Z-slow.log

但是,这个时候绝大部分的读写都在mysql/proc.MYD,该文件保存是mysql存储过程的表所存储的文件。

因为proc.MYD是MyIsam表,它只能cache index,mysql层面无法缓存data,要解决这个问题,就得看看有没有方法在linux层面将其缓存起来。

mysql优化之使用iotop+pt-ioprofile定位具体top io文件的更多相关文章

  1. 4个MySQL优化工具AWR,帮你准确定位数据库瓶颈!(转载)

    对于正在运行的mysql,性能如何,参数设置的是否合理,账号设置的是否存在安全隐患,你是否了然于胸呢? 俗话说工欲善其事,必先利其器,定期对你的MYSQL数据库进行一个体检,是保证数据库安全运行的重要 ...

  2. mysql 优化

    1.存储过程造数据 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_test_data`(`n` int) begin declare i ...

  3. MySQL优化概述

    一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...

  4. 单表60亿记录等大数据场景的MySQL优化和运维之道

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  5. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  6. 微博MySQL优化之路--dockone微信群分享

    微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...

  7. [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...

  8. mysql优化--博森瑞

    http://blog.itpub.net/28916011/viewspace-1758440/ 现在说一下mysql的内存和I/O方面的两个特点. 一. mysql内存特点: 1.  也有全局内存 ...

  9. mysql优化案例

    MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...

随机推荐

  1. selenium python3

    安装pip3 install selenium 查看版本pip3 show selenium 安装后还是提示找不到相应的模块 Mac安装PyCharm后,将已有工程导入,之前使用Mac终端执行脚本时正 ...

  2. js贪心算法---背包问题

    /* * @param {Object} capacity 背包容量 6 * @param {Object} weights 物品重量 [2,3,4] * @param {Object} values ...

  3. Keras学习率调整

    Keras提供两种学习率适应方法,可通过回调函数实现. 1. LearningRateScheduler keras.callbacks.LearningRateScheduler(schedule) ...

  4. excel 常用法

    粘贴格式化数据 数据如下 206190 98604 20991 2807.20 236584 113705 24599 3268.68 272083 128111 29021 3721.33 2487 ...

  5. php 获取 mime type 类型,fileinfo扩展

    背景: version < php-5.3 没有API能够查看文件的 mime_type, 故需要编译扩展 fileinfo 来扩展PHP的API(finfo_*系列函数).php-5.3 以后 ...

  6. MySQL--7MySQL自定义函数

    在函数体的内部可以书写多个sql语句,写多个sql语句的话就称为复合结构

  7. windows 服务器硬盘的分区

    进入Server 2012的操作系统,打开CMD框,输入:diskmgmt.msc,回车. 操作完第一步后会弹出“磁盘管理”的框.鼠标右键点击红框所在位置,选中“压缩卷”. 在“输入压缩空间量(MB) ...

  8. linux整理

    文件查看命令 cat [OPTION]... [FILE]...  - E: 显示行结束符$ -n: 对显示出的每一行进行编号 -A:显示所有控制符 -b:非空行编号 -s:压缩连续的空行成一行 he ...

  9. 6.Daemon线程

    1.如下代码: package com.bawei.multithread; public class Recursive { private static int counter = 0; publ ...

  10. 记一次CentOS5.7更新glibc导致libc.so.6失效,系统无法启动

      以下是错误示范,错误过程还原,请勿模仿!!! wkhtmltopdf 启动,提示/lib64/libc.so.6版本过低 $ ./wkhtmltopdf http:www.baidu.com 1. ...