一 简介 谈谈磁盘IO的问题二 目的:如何进行IO性能问题的排查
二 linux角度
一 机械硬盘基本定义
寻道时间,表示磁头在不同磁道之间移动的时间(最耗时)。
旋转延迟,表示在磁道找到时,中轴带动盘面旋转到合适的扇区开头处。
传输时间,表示盘面继续转动,实际读取数据的时间
二 机械盘与SSD盘的对比
1 无论是SSD还是机械盘,随机读写IO的效率都远远低于顺序读写IO
1 对于机械盘,随机读写IO会增加更多的盘片旋转和磁头寻道时间
2 对于SSD硬盘,随机读写IO会造成的大量的垃圾回收(垃圾需要先擦除回收然后再进行写入)
2 机械硬盘的基本单位是扇区(通常是512字节) SSD硬盘的基本单位是页(通常是4K 8K)
3 SSD对比机械盘最大的优势就是没有寻道时间,对于机械盘消耗时间最大的也就是寻道时间
4 SSD本身有写入次数限制(寿命),还有写磨损问题 这个需要注意,一般服务器情况下都是SSD+机械硬盘混合搭配
三 linux系统的算法
CFQ 完全公平调度器,为每个进程都创建不同的IO调度队列,并按照时间片来平均分配每个进程的IO请求,常用于多进程的场景
DEADLINE 为读写请求分别创建不同的IO队列,并保证最先到达deadline的请求会被优先处理,常用于数据库场景,能提高机械磁盘的吞吐量
NOOP 是一个先入先出的队列,只做一些合并IO的操作,适合SSD
四 文件系统层
选择xfs或者ext4文件系统,推荐xfs
五 mysql角度
控制脏页刷新
1 innodb_flush_neighbors 设置为0 关闭该特性
2 innodb_io_capacity 脏页刷新数量,建议设置为iops的60%,如果设置的过低,会限制tps的能力,如果设置的过高,会加大磁盘io的压力,因为一次性刷新的脏页数量会多
3 调整redo log大小,建议单个redo大于1G,增加多个redo文件,防止出现写磨损问题
4 调整 innodb_max_dirty_pages_pct 脏页占用比,进行调低. nnodb_max_dirty_pages_pct和 innodb_io_capacity 进行合理搭配调节
参数说明
当刷新一个脏页时,innodb存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新,这样做能合并多个IO,减少硬盘压力
建议 机械硬盘开启 SSD硬盘关闭
六 压测
1 压测磁盘组的随机读写能力
fio -filename=/data/d.txt -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=1500M -numjobs=40 -runtime=10 -group_reporting -name=mytest
关心参数
read and write的iops
2 通过压力测试得出服务器的最大承受值
请注意:util并不能真正反映磁盘组的整体性能,反过来,util值忙,代表磁盘繁忙程度,想要看磁盘压力
1 观察iowait.
2 观察磁盘的IOPS(w/s+r/s)
3 观察await
三 mysql角度
一 事务
1 写日志文件
1 流程 redo log+binlog 二阶段提交-> 写日志文件 顺序写
2 控制参数
innodb_flush_log_at_trx_commit = 1 控制redo log的磁盘刷新
sync_binlog = 1 控制binlog 的磁盘刷新
2 脏页刷新
1 将内存中改变的数据页刷新到磁盘中
2 控制参数
innodb_flush_neighbors 控制相邻脏页的刷新
innodb_io_capacity 控制脏页刷新的数量
innodb_max_dirty_pages_pct 脏页占用比
二 查询
1 慢语句
使用索引不当的慢sql查询会造成磁盘的繁忙,这种情况多出现在
1 大表的慢sql查询
2 表的主键碎片化也会造成大量的随机读,常见于uuid作为主键或者执行过大量更改的情况
3 单个慢sql出现在慢日志,慢sql本身受到影响(1 脏页刷新 2 日志刷新 3 并发sql查询)
2 并发语句
大量并发语句并发查询导致的磁盘繁忙情况
四 判断分析
磁盘没有到达瓶颈
1 根据上文提出的,要分析mysql哪一部分出了问题,日志刷新->脏页刷新->慢日志,根据某一个环节进行优化
磁盘到达瓶颈
1 mysql慢日志出现了很多不该出现的慢日志语句,通常表现在扫描行数很少,单体执行很快
2 监控图的iops经常性报警,尤其是在业务高峰期,由于IO限制导致的负载升高,iowait值很高
解决办法:1 拆分业务 2 做读写分离 3 升级硬盘,采用ssd硬盘
五 补充
分析数据库的IO问题 可以采用 pt-ioprofile定位文件信息
mysql 与linux ~ 内存分析与调优
一 简介:linux内存和mysql二 分类 1 用户空间和内核空间 用户空间内存,从低到高分别是五种不同的内存段 1 只读段 包含代码和常量等 2 数据段 包含全局 ...
linux性能分析及调优
第一节:cpu 性能瓶颈 计算机中,cpu是最重要的一个子系统,负责所有计算任务: 基于摩尔定律的发展,cpu是发展最快的一个硬件,所以瓶颈很少出现在cpu上: 我们线上环境的cpu都是多核的,并且基 ...
linux性能调分析及调优
转:https://blog.csdn.net/luokehua789789/article/details/53007456 Linux 性能分析以及调优介绍 写在前面:计算机要解决的基本问题之一是 ...
linux 内核参数VM调优 之 参数调节和场景分析
1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时 ...
(转)linux IO 内核参数调优 之 参数调节和场景分析
1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时 ...
linux概念之性能调优
目前,对系统进行性能调试的工具有很多,这些可以两大类:一类是标准的分析工具,即所有的UNIX都会带的分析工具: 另一类是不同厂商的UNIX所特有的性能分析工具,比如HP-UX就有自己的增值性能分析工具 ...
MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》
最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离 ...
MySQL管理之道:性能调优、高可用与监控》迷你书
MySQL管理之道:性能调优.高可用与监控>迷你书 MYSQL5.5.X主要改进 1.默认使用innodb存储引擎2.充分利用CPU多核处理能力3.提高刷写脏页数量和合并插入数量,改善I/O4. ...
x86服务器中网络性能分析与调优 转
x86服务器中网络性能分析与调优 2017-04-05 巨枫 英特尔精英汇 [OpenStack 易经]是 EasyStack 官微在2017年新推出的技术品牌,将原创技术干货分享给您,本期我们讨论 ...
随机推荐
(转)java中的进程与线程
(转自地址http://www.ibm.com/developerworks/cn/java/j-lo-processthread/) Java 进程的建立方法 在 JDK 中,与进程有直接关系的类为 ...
学习mongo系列(十一)关系
准备工作:首先在maxh数据库的address集合中先插入数据 > db.address.insert({child_address:"gansu"}) WriteResul ...
数据库连接池dbcp基本配置
DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包: com ...
C语言之将无符号字符型转化为ascii码值
这个宏是在linux内核中获取的,主要的功能是能够将一个无符号字符型的参数转化为ASCII码值. ASCII : ASCII 编码里包括了128个字符.用 十进制 0 到 127 来表示 .那就对了 ...
Mybatis中sql语句中的in查询,判断null和size为0的情况
不严谨的写法,可能会报错:in (),这种情况不符合SQL的语法,导致程序报错. 如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据! 所以一个比 ...
Eclipse创建Dynamic Web部署
Eclipse创建Dynamic Web部署 http://blog.csdn.net/sweblish/article/details/6686046 Eclipse3.x中热部署项目,启动错误问题 ...
JAVA GC优化入门
为什么需要优化GC? JAVA的GC是面试必考的题目,可是在实际项目中什么时候使用GC哪?或者应该什么时候优化GC哪?有句名言:“GC优化永远是最后一项任务”. 在使用GC之前,应该考虑一下进行GC的 ...
BZOJ2957: 楼房重建(线段树&;LIS)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3727 Solved: 1793[Submit][Status][Discus ...
#define 与 typedef
1.#define:预编译指令,在预编译的时候,进行文本替换. 2.typedef:编译时处理,为类型取一个别名. 3.#define与typedef的顺序是相反的,记住typedef就行了.type ...
「小程序JAVA实战」小程序我的个人信息-注销功能(42)
转自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/ 注 ...