1.Master Thread 主线程功能介绍:
1.1 控制刷新脏页到磁盘(CKPT)
1.2控制日志缓冲刷新到磁盘(log buffer —-> redo)
1.3undo页回收
1.4 合并插入缓冲(change buffer)
1.4 控制IO刷新数量
参数innodb_io_capacity表示每秒刷新脏页的数量,默认为200。
innodb_max_dirty_pages_pct设置出发刷盘的脏页百分比,即当脏页占到缓冲区数据达到这个百分比 时,就会刷新innodb_io_capacity个脏页到磁盘。 ## 什么叫刷新脏页,在内存中被修改的数据叫做脏页,如果修改一个刷新到磁盘一个,会导致磁盘IO过于频繁,就出现了这个机制,让脏页在内存中达到百分之多少之后,在进行刷新到磁盘。
注意:如果你的IO能力比较好的话可以给百分比调的低一点,百分之50就刷新,一下参数默认应该都是开启的。
参数innodb_adaptive_flushing = ON(自适应地刷新),该值影响每秒刷新脏页的数量。原来的刷新
规则是:脏页在缓冲池所占的比例小于innodb_max_dirty_pages_pct时,不刷新脏页;大于
innodb_max_dirty_pages_pct时,刷新100个脏页。
随着innodb_adaptive_flushing参数的引入,InnoDB存储引擎会通过一个名为
buf_flush_get_desired_flush_rate的函数来判断需要刷新脏页最合适的数量。粗略地翻阅源代码后发
现buf_flush_get_desired_flush_rate通过判断产生重做日志(redo log)的速度来决定最合适的刷
新脏页数量。因此,当脏页的比例小于innodb_max_dirty_pages_pct时,也会刷新一定量的脏页。
2.0 IO Thread 介绍:
在InnoDB存储引擎中大量使用Async IO来处理写IO请求,IO Thread的工作主要是负责这些IO请求的回调处理。
写线程和读线程分别由innodb_write_threads和innodb_read_threads参数控制,默认都为4。
2.1 Purge Thread 介绍:
事务在提交之前,通过undolog(回滚日志)记录事务开始之前的状态,当事务被提交后,undolog便不再需
要,因此需要Purge Thread线程来回收已经使用并分配的undo页。可以在配置文件中添加
innodb_purge_threads=1来开启独立的Purge Thread,等号后边控制该线程数量,默认为4个。
2.2Page Cleaner Thread 介绍
InnoDB 1.2.X版本以上引入,脏页刷新,减轻master的工作,提高性能。
查看方法:
客户端版本:
mysql -V
server 版本:
select @@version;
engine 版本:
SELECT * FROM information_schema.plugins;
SELECT @@innodb_version;
2.InnoDB Buffer Pool(IBP)
作用:
用来缓冲、缓存,MySQL的数据页(data page )和索引页、UNDO。MySQL中最大的、最重要的内存区域
查询:
> select @@innodb_buffer_pool_size; # 默认大小: 128M 生产建议: 物理内存的:50-75%。
> select @@innodb_buffer_pool_instances; # 实例个数, 可以有效的减少内存的争用
在线设置:
mysql> set global innodb_buffer_pool_size = 48318382080;
重新登录mysql生效。
永久设置:
vim /etc/my.cnf
innodb_buffer_pool_size=256M #添加参数
show global status like ‘%innodb%wait%’ #查看 InnoDB_buffer_pool 是否够用,查看 innodb_buffer_pool_wait_free是否有等待
产生不够用的情景有哪些?
1. 设置太小。
2. 大事务。
3. ckpt触发不及时。
4. IO比较慢。
5. 查询语句优化的不好。
2.1InnoDB_buffer_pool LRU 内存回收机制算法,将最近使用不是特别频繁的数据,在内存不够的时候进行回收
1. 采用LRU:最近最少使用原则。
2. LRU链表:“热端”(5/8)+“冷端” (3/8)
3. 新入内存的page,会被放在冷端的头部。
4. 如果page被访问,会被调取到热端的头部。
3.InnoDB log Buffer 介绍:
记录数据页在内存当中的变化,为了保证数据的一致性,还可以减少内存和磁盘的交互。
作用: 用来缓冲 redo log日志信息。
查询:
mysql> select @@innodb_log_buffer_size; #默认大小:16M
生产建议:和innodb_log_file_size有关,1-2倍
设置方式 :
vim /etc/my.cnf
innodb_log_buffer_size=33554432 ##大小
innodb_log_file_size=2G #磁盘大小
innodb_log_files_in_group=3 #3个文件
innodb_log_buffer_size=1G #1G内存
重启生效:
[root@db01 data]# /etc/init.d/mysqld restart
show global status like ‘%innodb%log%’;
