SSD 下的 MySQL IO 优化尝试(3)

网络上的文章,针对 SSD 的优化,MySQL 方面需要把 innodb_io_capacity 设置为 4000,或者更高。然而实际上,此业务 UPDATE 较多,每次的修改量大概有 20K,并且基本上都是离散写。innodb_io_capacity 达到 4000,SSD 并没有给整个系统带来很大的性能提升。相反,反而使 IO 压力过大,until 甚至达到 80% 以上。

5.3 修改 innodb_max_dirty_pages_pct = 25

修改方法如下:

SET GLOBAL innodb_max_dirty_pages_pct =25;

修改之后的 MySQL 配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 4000

innodb_max_dirty_pages_pct 25

innodb_adaptive_flushing ON

innodb_write_io_threads 4

innodb_read_io_threads 4

之前已经将 innodb_max_dirty_pages_pct 设置为 30,此处将 innodb_max_dirty_pages_pct 下调为 25%,目的为了查看脏数据对 I/O 的影响。修改的结果是,I/O 出现波动,innodbBuffPoolPagesFlushed 同样出现波动。然而,由于 39 是 24 的从库,暂时还没有切换,所有压力不够大,脏数据也不够多,所以调整此参数看不出效果。

5.4 修改 innodb_io_capacity = 2000

修改方法不赘述。

修改之后的 MySQL 配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 2000

innodb_max_dirty_pages_pct 25

innodb_adaptive_flushing ON

innodb_write_io_threads 4

innodb_read_io_threads 4

因为 innodb_io_capacity 为 4000 的情况下,I/O 压力过高,所以将 innodb_io_capacity 调整为 2000。调整后,w/s 最高不过 2000 左右,并且 I/O until 还是偏高,最高的时候有 70%。我们同时可以看到,I/O 波动幅度减小,innodbBuffPoolPagesFlushed 同样如此。

5.5 修改 innodb_io_capacity = 1500

修改方法不赘述。

修改之后的 MySQL 配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 1500

innodb_max_dirty_pages_pct 25

innodb_adaptive_flushing ON

innodb_write_io_threads 4

innodb_read_io_threads 4

I/O 持续出现波动,我们接着继续下调 innodb_io_capacity,调整为 1500。I/O until 降低,I/O 波动幅度继续减小,innodbBuffPoolPagesFlushed 同样如此。

5.6 关闭 innodb_adaptive_flushing

修改方法如下:

SET GLOBAL innodb_adaptive_flushing = OFF;

修改之后的 MySQL 配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 1500

innodb_max_dirty_pages_pct 25

innodb_adaptive_flushing OFF

innodb_write_io_threads 4

innodb_read_io_threads 4

既然落地仍然有异常,那我们可以试着关闭 innodb_adaptive_flushing,不让 MySQL 干预落地。调整的结果是,脏数据该落地还是落地,并没有受 I/O 压力的影响,调整此参数无效。

5.7 打开 innodb_adaptive_flushing

修改方法如下:

SET GLOBAL innodb_adaptive_flushing = ON;

修改之后的 MySQL 配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 1500

innodb_max_dirty_pages_pct 25

innodb_adaptive_flushing ON

innodb_write_io_threads 4

innodb_read_io_threads 4

经过以上调整,关闭 innodb_adaptive_flushing 没有效果,还是保持默认打开,让这个功能持续起作用吧。

5.8 设置 innodb_max_dirty_pages_pct = 20

修改方法不赘述。

修改之后的 MySQL 配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 1500

innodb_max_dirty_pages_pct 20

innodb_adaptive_flushing ON

innodb_write_io_threads 4

innodb_read_io_threads 4

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e3e8cc0cb55ae652e23854b0f668f4c9.html