今天,将一个环境切换成行情优化后的版本后,发现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. js模拟链表---双向链表

    双向链表: 每个元素,有一个 next(指向下一个元素)和一个prev(指向前一个元素) function dbLinkedList(){ var length=0; var head = null; ...

  2. Go linux 实践 1

    引言: 如果,曾经,你以作为一名C语言应用开发者而自豪,那么后来你应该以用C++来开发为时髦,当JAVA出现时,你可能会说“这小子,有两下子嘛!” 但是,当你以JAVA专家出厂时,哈哈,返过头来面对J ...

  3. 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...

  4. Cocos Creator scrollview添加事件的两种方法

    scrollview添加事件 方法一这种方法添加的事件回调和使用编辑器添加的事件回调是一样的,通过代码添加, 你需要首先构造一个 cc.Component.EventHandler 对象,然后设置好对 ...

  5. java生成随机六位数的验证码&随机生成十位数ValidCode码,用于邮件的验证&检查是不是符合为合法的中国的手机号码

    package com.demo.test1; import java.security.NoSuchAlgorithmException; import java.security.SecureRa ...

  6. python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod

    python基础-abstractmethod.__属性.property.setter.deleter.classmethod.staticmethod

  7. clear/reset select2,重置select2,恢复默认

    4.0 version //方法一$('#yourButton').on('click', function() { $('#yourfirstSelect2').val(null).trigger( ...

  8. Python之函数&参数&参数解构

    1.1函数定义 def 函数名(参数列表): 函数体(代码块) [return 返回值] p 函数名就是标识符,命名要求一样 语句块必须缩进,约定4个空格 Python的函数没有return语句,隐式 ...

  9. 步进电机 28BYJ-48介绍和驱动及编程

    28BYJ-48步进电机: 步进电机是一种将电脉冲转化为角位移的执行机构.通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角).您可以通过控制脉冲个来 ...

  10. C语言堆栈的区别

    堆(heap)和栈(stack)有什么区别?? 简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. astack:是自动分配变量,以及函数调用的时候所使用的 ...