MySQL教程:关于I/O内存方面的一些优化(2)

With too many threads executing in parallel, context switching overhead is high. This also presents a challenging task to the operating system scheduler. The thread pool controls the number of active threads to keep the parallelism within the MySQL server at a level that it can handle and that is appropriate for the server host on which MySQL is executing.

Too many transactions executing in parallel increases resource contention. In InnoDB, this increases the time spent holding central mutexes. The thread pool controls when transactions start to ensure that not too many execute in parallel.

三、mysql访问文件流程

Transaction 来自网络

三、影响IO/内存的一些参数

1、innodb_flush_log_at_trx_commit 设置为2

这参数是指 事务log(ib_logfile0、ib_logfile1)以怎样的方式写入到log buffer

=0 mysql crash 就丢失了,性能最好

buffer pool -> log buffer 每秒 wirte os cache & flush磁盘

=1 不会丢失,效率低

buffer pool -> log buffer 每次 write os cache & flush磁盘

=2  即使mysql崩溃也不会丢数据

buffer pool -> os cache 每秒flush 磁盘

注意:由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒

2、sync_binlog

二进制日志(binary log)同步到磁盘的频率。binary log 每写入sync_binlog 次后,刷写到磁盘。


如果 autocommit 开启,每个语句都写一次 binary log,否则每次事务写一次。

默认值是 0,不主动同步,而依赖操作系统本身不定期把文件内容 flush 到磁盘

设为 1 最安全,在每个语句或事务后同步一次 binary log,即使在崩溃时也最多丢失一个语句或事务的日志,但因此也最慢。

大多数情况下,对数据的一致性并没有很严格的要求,所以并不会把 sync_binlog 配置成 1,为了追求高并发,提升性能,可以设置为 100 或直接用 0

3、write/read thread

异步IO线程数

innodb_write_io_threads=16
innodb_read_io_threads=16

(该参数需要在配置文件中添加,重启mysql实例起效)脏页写的线程数,加大该参数可以提升写入性能

4、innodb_max_dirty_pages_pct

最大脏页百分数,当系统中脏页所占百分比超过这个值,INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。默认75,一般现在流行的SSD硬盘很难达到这个比例。可依据实际情况在75-80之间调节

5、innodb_io_capacity=5000

从缓冲区刷新脏页时,一次刷新脏页的数量。根据磁盘IOPS的能力一般建议设置如下:


SAS 200
SSD 5000
PCI-E 10000-50000

6、innodb_flush_method=O_DIRECT(该参数需要重启mysql实例起效)

控制innodb 数据文件和redo log的打开、刷写模式。有三个值:fdatasync(默认),O_DSYNC,O_DIRECT。

fdatasync模式:写数据时,write这一步并不需要真正写到磁盘才算完成(可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。

O_DSYNC模式:写日志操作是在write这步完成,而数据文件的写入是在flush这步通过fsync完成。

O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲。

MySQL教程:关于I/O内存方面的一些优化


通过图可以看出O_DIRECT相比fdatasync的优点是避免了双缓冲,本身innodb buffer pool就是一个缓冲区,不需要再写入到系统的buffer,但是有个缺点是由于是直接写入到磁盘,所以相比fdatasync的顺序读写的效率要低些。

在大量随机写的环境中O_DIRECT要比fdatasync效率更高些,顺序写多的话,还是默认的fdatasync更高效。

7、innodb_adaptive_flushing 设置为 ON (使刷新脏页更智能)

影响每秒刷新脏页的数目

规则由原来的“大于innodb_max_dirty_pages_pct时刷新100个脏页到磁盘”变为 “通过buf_flush_get_desired_flush_reate函数判断重做日志产生速度确定需要刷新脏页的最合适数目”,即使脏页比例小于 innodb_max_dirty_pages_pct时也会刷新一定量的脏页。

8、innodb_adaptive_flushing_method 设置为 keep_average

影响checkpoint,更平均的计算调整刷脏页的速度,进行必要的flush.(该变量为mysql衍生版本Percona Server下的一个变量,原生mysql不存在)

9、innodb_stats_on_metadata=OFF

关掉一些访问information_schema库下表而产生的索引统计。

当重启mysql实例后,mysql会随机的io取数据遍历所有的表来取样来统计数据,这个实际使用中用的不多,建议关闭.

10、innodb_change_buffering=all

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

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