一般硬盘分为机械硬盘和固态硬盘,在mysql的服务器中,强烈建议使用固态硬盘,因为固态硬盘的IOPS, 主要是固态硬盘的随机读取的速度比较高。
IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。
随机读写频繁的应用,如小文件存储(图片)、OLTP数据库、邮件服务器,关注随机读写性能,IOPS是关键衡量指标。
顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播VOD(Video On Demand),关注连续读写性能。数据吞吐量是关键衡量指标。
简单理解就是:
磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。
有些硬盘的厂商有时候给的是吞吐量,也就是带宽。怎么计算IOPS
例如第一个Intel x25-E 64GB 的这个盘的iops = 1M / 4kb * 48 = 1024 / 4 * 48 = 12288
① 1M中有多少个块, 上面是以4kb为一个块,
② 48M/s 的吞吐量, 那么IO就是 1M / 4kb * 48 = 1024 / 4 * 48 = 12288
跟硬盘相关的mysql配置
innodb_flush_neighbors = 0 ##硬盘刷新比较平缓,效率高,
innodb_log_file_size = 4G ##如果硬盘比较大的话,可以设置8G
Linux查看磁盘的性能
① iostat -xm 3
avg-cpu: %user %nice %system %iowait %steal %idle
1.02 0.00 1.02 0.00 0.00 97.95
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0
- rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
- wrqm/s: 每秒对该设备的写请求被合并次数
- r/s: 每秒完成的读次数
- w/s: 每秒完成的写次数
- rkB/s: 每秒读数据量(kB为单位) 读的吞吐量
- wkB/s: 每秒写数据量(kB为单位) 写的吞吐量
- avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
- avgqu-sz: 平均等待处理的IO请求队列长度
- await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
- svctm: 平均每次IO请求的处理时间(毫秒为单位)
- %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
我们上面的IOPS = r/s + w/s 的值
② 使用 sysbench 命令测试硬盘性能
-file-num=N 创建文件的数量,默认值:128。由N个文件组成。
--file-block-size=N 每次IO操作的block大小,默认值:16K。
--file-total-size=SIZE 所有文件大小总和,默认值:2G。
--file-test-mode=STRING 测试模式:seqwr(顺序写), seqrewr(顺序读写), seqrd(顺序读), rndrd(随机读), rndwr(随机写), rndrw(随机读写)。
--file-io-mode=STRING 文件操作模式:sync(同步),async(异步),mmap(快速map映射),默认值:sync。
--file-async-backlog=N 每个线程排队的异步操作数,默认值[128]。
--file-extra-flags=[LIST,...] 使用额外的标志符来打开文件{sync,dsync,direct}。默认值空
--file-fsync-freq=N 在完成N次请求之后,执行fsync(),0表示不使用fsync,默认值:100。
--file-fsync-all[=on|off] 每次写操作后执行fsync(),默认值:off。
--file-fsync-end[=on|off] 测试结束后执行fsync(),默认值:on。
--file-fsync-mode=STRING 使用fsync或fdatasync方法进行同步,默认值:fsync。
--file-merged-requests=N 尽可能的合并N个IO请求数,0表示不合并,默认值:0。
--file-rw-ratio=N 测试时候的读写比例,默认值:1.5(即3:2)。
--max-time=300 ##最大的测试时间 300S, 如果设置5s那么5s就测试完成
--max-requests=0 ## 最大的请求,随便请求
--num-threads=128 ## 多少个线程数进行测试
--report-interval=1 ## 每秒中输出结果
A)准备4块硬盘测试
sysbench --test=fileio --file-num=4 --file-block-size=16384 --file-total-size=4G prepare
B) 刚刚申请的4块硬盘开始测试 这里测试的是 rndrd 随机读的模式
sysbench --test=fileio --file-num=4 --file-block-size=16384 --file-total-size=4G --file-test-mode=rndrd --file-extra-flags=direct --max-time=300 --max-requests=0 --file-fsync-freq=1 --num-threads=128 --report-interval=1 run
用sysbench测试的硬盘结果是吞吐量: reads: 33.45 M/s, 我们这里测试的是块是--file-block-size=16384(16kb) 那么iops = 1M / 16kb * 33.45 = 2112 (需要注意的是我们这里测试的是 16KB的块,我们一般指标是4K) 我这里测试的阿里云的服务器。
这个时候也可以看 iostat -xm 3 的数据
读的吞吐量差不多的都是32/s 33M/s
读的iopss是2089跟我们算的 2112也差不多
如果我们把上面的 --max-time=5 改成5 则跑完之后就会出来测试报告
C) 测试完成后 需要把刚刚分配的空间释放掉
sysbench --test=fileio --file-num=4 --file-block-size=16384 --file-total-size=4G cleanup
③ innodb_io_capacity 的设置
当我们用上面的工具测试出了硬盘的iops,我们就需要在mysql中设置,mysql读写硬盘的iops,
一般来说就用硬盘的 iopo / 2的值, mysql默认是200,这就是为什么有时候我们的服务器买了固态硬盘后,感觉磁盘的读写还是比较慢的原因。
这里还需要介绍一个变量innodb_flush_method = O_DIRECT
意思是说,当我们的mysql在写入磁盘的时候,不经过操作系统层的空间缓存,而是直接写入磁盘。