iar最高优化模式选择size对代码的影响_优化innochecksum实战,四倍加速榨干NVMe SSD磁盘带宽...

2e2c140a8641699bcc1321ea306cab83.png

innodhecksum[1]是MySQL自带的offline工具bin,可检查innodb数据文件是否损坏。使用方式如下。

shell> bin/innochecksum [options] file_name

MySQL的系统表空间(ibdata)、用户表空间(*.ibd)、redo log(ib_logfile)等文件,结构类似,都由page构成,UNIV_PAGE_SIZE默认16KB,定义如下。了解更多可参考文章[2]或者innodb-java-reader工具[3]。

#define UNIV_PAGE_SIZE     (2 * 8192)

如下图所示,page前后是38字节的header和8字节的trailer。checksum校验算法会利用index4-26以及index38-16376这两部分计算。详细实现参考ut0crc32.cc[4]。

682254850471a896e08460d70045cfcc.png
图片一部分参考链接[5]

page的checksum算法有三种,参考官方文档[6]。

innodb
crc32
none

从MySQL 5.7.7版本之后crc32是默认的checksum算法。
crc32的校验算法有两种实现,如果CPU支持SIMD SSE4_2指令集,则硬件加速,直接inline汇编代码;如果不支持,fallback到软件算法实现。
innochecksum执行的逻辑很简单。

while (!feof(fil_in)) {
   bytes = read_file //read 16KB
   is_page_corrupted //using crc32/innodb/none algorithm
}

优化innochecksum前,先看看基准性能如何。环境如下。

  • CPU: Intel Xeon CPU E5-2682 v4 @ 2.50GHz(开启超线程,逻辑核数64)
  • 内存: 256G
  • NVMe SSD硬盘:PCIe 3.0 x4, NVMe, Intel® SSD DC P3600 Series, 1.6TB

Intel官方上查企业级DC P3600 1.6TB这块盘[7]。正面如下。

bc57f4bf43e10a9d9a2df9c446d1dd18.png

背面图如下,可以看到排列整齐的MLC NAND闪存颗粒[8]。

5fb979abfc1e885ade27d1b4792581f6.png

规格如下。官方资料,顺序写1600 MB/s,顺序读2600 MB/s。

d94b28fd55b976a14d8fa03b08c93a69.png

测试数据文件是TPC-H的LINEITEM,大小有72G左右。(dbgen -s 70生成后导入MySQL,文件较大,为了更好的观测)。
直接上图,MySQL自带的bin执行innochecksum -C crc32 file_name,带宽只有642 MB/s,远低于这块盘的顺序读吞吐限。

00f96f06d824bfaa4b8e67f19079648e.png

优化后的最优版本可以达到2503 MB/s,非常接近官方最高吞吐。
下面第一部分 测试NVMe SSD读写极限吞吐,第二部分 阐述优化实现方案。

1. 测试NVMe SSD读写极限吞吐

fio[9]测试读写吞吐,ioengine选择libaio。

fio写:

./fio --filename=test -iodepth=16 -ioengine=libaio -direct=1 -rw=write -bs=1m -size=512g -numjobs=8 -runtime=50 -gro
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值