mysql内存和IO优化一些重要参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql内存和IO优化一些重要参数相关的知识,希望对你有一定的参考价值。
1、innodb_flush_log_at_trx_commit
0:日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。
1:在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新。
2:在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。对日志文件每秒刷新一次。
默认值是 1,也是最安全的设置,即每个事务提交的时候都会从 log buffer 写到日志文件(buffer log),而且会实际刷新磁盘,但是这样性能有一定的损失。
如果可以容忍在数据库崩溃的时候损失一部分数据,那么设置成 0 或者 2 都会有所改善。
设置成 0,则在数据库崩溃的时候会丢失那些没有被写入日志文件的事务,最多丢失 1 秒钟的事务,这种方式是最不安全的,也是效率最高的。
设置成 2 的时候,因为只是没有刷新到磁盘,但是已经写入日志文件,所以只要操作系统没有崩溃,那么并没有丢失数据 ,比设置成 0 更安全一些。
在 mysql 的手册中,为了确保事务的持久性和复制设置的耐受性、一致性,都是建议将这个参数设置为 1 的。
2、innodb_log_file_size
日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组中日志文件的数目,那么理想的数值为 1M 至下面设置的缓冲池(bufferpool)大小的 1/n。
较大的值,可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。一般用512M左右,具体取决于服务器的空间。
3、innodb_log_buffer_size
InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 8M左右。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。
因此,如果有大的事务处理,设置大的日志缓冲可以减少磁盘I/O。
4、innodb_buffer_pool_size
InnoDB用来高速缓冲数据和索引内存缓冲大小。更大的设置可以使访问数据时减少磁盘I/O。在一个专用的数据库(inndb专用)服务器上可以将它设置为物理内存的80 %,
和key_buffer相同,如果数据量比较小也不怎么增加,那么不要把这个值设太高也可以提高内存的使用率。因为物理内存的使用竞争可能会影响操作系统的页面调用。
5、innodb_additional_mem_pool_size
InnoDB 用来存储数据字典(data dictionary)信息和其它内部数据结构(internal data structures)的存储器组合(memory pool)大小。理想的值为 2M,
如果有更多的表你就需要在这里重新分配。如果 InnoDB 用尽这个池中的所有内存,它将从操作系统中分配内存,并将错误信息写入 MySQL 的错误日志中。
6、innodb_file_io_threads
InnoDB 中的文件 I/O 线程。 通常设置为 4。
7、sync_binlog
二进制日志(binary log)同步到磁盘的频率。binary log 每写入sync_binlog 次后,刷写到磁盘。如果 autocommit 开启,每个语句都写一次 binary log,否则每次事务写一次。
默认值是 0,不主动同步,而依赖操作系统本身不定期把文件内容 flush 到磁盘
设为 1 最安全,在每个语句或事务后同步一次 binary log,即使在崩溃时也最多丢失一个语句或事务的日志,但因此也最慢。
大多数情况下,对数据的一致性并没有很严格的要求,所以并不会把 sync_binlog 配置成 1,为了追求高并发,提升性能,可以设置为 100 或直接用 0。
8、write/read thread
异步IO线程数
innodb_write_io_threads=16
innodb_read_io_threads=16
(该参数需要在配置文件中添加,重启mysql实例起效)脏页写的线程数,加大该参数可以提升写入性能
9、innodb_max_dirty_pages_pct
最大脏页百分数,当系统中脏页所占百分比超过这个值,INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。默认75,一般现在流行的SSD硬盘很难达到这个比例。可依据实际情况在75-80之间调节
10、innodb_io_capacity=5000
从缓冲区刷新脏页时,一次刷新脏页的数量。根据磁盘IOPS的能力一般建议设置如下:
SAS 200
SSD 5000
PCI-E 10000-50000
11、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缓冲,在大量随机写的环境中O_DIRECT要比fdatasync效率更高些,顺序写多的话,还是默认的fdatasync更高效。
12、innodb_adaptive_flushing
设置为 ON (使刷新脏页更智能)
13、innodb_max_dirty_pages_pct
这个参数据控制脏页的比例如果是innodb_plugin或是MySQL5.5以上的版本,建议这个参数可以设制到75%-90%都行。如果是大量写入,而且写入的数据不是太活跃,可以考虑把这个值设的低一点。 如果写入或是更新的数据也就是热数据就可以考虑把这个值设为:95%
本文出自 “用户和存储过程” 博客,请务必保留此出处http://9548010.blog.51cto.com/9538010/1744203
以上是关于mysql内存和IO优化一些重要参数的主要内容,如果未能解决你的问题,请参考以下文章