![2e2c140a8641699bcc1321ea306cab83.png](https://i-blog.csdnimg.cn/blog_migrate/783ebc5490e293046d93748ec2983b22.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](https://i-blog.csdnimg.cn/blog_migrate/89c8a28df76949b5bcf07068398b9cf3.jpeg)
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](https://i-blog.csdnimg.cn/blog_migrate/fda94a7d99f27ffc001e28202c8b2eb0.png)
背面图如下,可以看到排列整齐的MLC NAND闪存颗粒[8]。
![5fb979abfc1e885ade27d1b4792581f6.png](https://i-blog.csdnimg.cn/blog_migrate/c3ed0aa14d105585fd3bed66a656caa8.png)
规格如下。官方资料,顺序写1600 MB/s,顺序读2600 MB/s。
![d94b28fd55b976a14d8fa03b08c93a69.png](https://i-blog.csdnimg.cn/blog_migrate/1fa7c5d43c8b0eb88e6ea62e10c660e9.jpeg)
测试数据文件是TPC-H的LINEITEM,大小有72G左右。(dbgen -s 70生成后导入MySQL,文件较大,为了更好的观测)。
直接上图,MySQL自带的bin执行innochecksum -C crc32 file_name,带宽只有642 MB/s,远低于这块盘的顺序读吞吐限。
![00f96f06d824bfaa4b8e67f19079648e.png](https://i-blog.csdnimg.cn/blog_migrate/bdb55c5b798a16ecf556172303b9bddb.jpeg)
优化后的最优版本可以达到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