后台进程默认有15个。
1.master thread(1个)。
2.IO thread
(1)read/write thread(8个,默认各4个)
(2)insert buffer thread(1个)
(3)log io thread(1个)
3.lock monitor thread(1个)
4.error monitor thread(1个)
5.purge thread(1个)
6.purge cleaner(flushing) thread(1个)
7.MySQL 5.6起,master thread的工作已被大大减轻,purge,page clean等成独立线程了。
后台进程
1.master thread(主线程)的线程优先级别最高。
2.其内部几个循环(loop)组成:主循环(loop),后台循环(background loop),刷新循环(flush loop),暂停循环(suspend loop)。
3.会根据数据运行的状态在loop,backgroup loop,flush loop和suspend loop中进行切换。
4.loop称为住循环,因为大多数的操作都在这个循环中。
5.loop循环通过thread sleep来实现,这意味着所谓的每秒一次或每10秒一次的操作时不精确的。
6.在负载很大的情况下可能会有延迟。
master thread
1.每秒要做的事
(1)刷新dirty page到磁盘。
(2)执行insert buffer merge。
(3)刷redo log buffer到磁盘。
(4)checkpoint。
(5)检查dict table cache,判断有无要删除table cache对象。
2.每10秒要做的事
(1)刷新dirty page到磁盘。
(2)执行insert buffer merge。
(3)刷redo log buffer到磁盘
(4)undo purge。
(5)checkpoint。
3.实例关闭时
(1)刷redo log到磁盘。
(2)insert buffer merge。
(3)刷redo log buffer到磁盘。
(4)执行checkpoint。
master thread 优化建议
1.避免dirty page堆积,适当调整 innodb_max_dirty_pages_pct(<=50)。
2.避免undo堆积,调整innodb_max_pruge_lag/innodb_max_purge_lap_delay/innodb_purge_batch_size。
3.及时调整checkpoint,调整innodb_flush_flush_log_at_trx_commit/innodb_adaptive_flushing/innodb_adaptive_flushing_lwm/innodb_flush_neighbors/innodb_flusing_avg_loops。
4.保持事务持续平稳提交,不要瞬间大事务,或者高频率小事务。
checkpoint
1.定期确认redo log落盘,避免数据丢失,并提高crash recover效率。
2.buffer pool脏数据太多,把脏页刷到磁盘,释放内存。
3.redo log快用完了,把脏页刷到磁盘。
4.redo log切换时,需要执行checkpoint。
5.sharp checkpoint
(1)将所有的脏页都刷新回磁盘。
(2)刷新时系统hang住。
(3)比较暴力,只有在需要干净重启时才需要innodb_fash_shutdown=0
6.fuzzy checkpoint
(1)持续将脏页刷新回磁盘。
(2)对系统影响较小,但可能刷新较慢,会有迟滞。
(3)innodb_max_dirty_pages_pct = 75
(4)innodb_max_dirty_pages_pct_lwm =0
purge
1.简单说,就是做GC(garbage collection).
2.purge都做啥?
(1)删除辅助索引中不存在的记录。
(2)删除已被打了delete-marked标记的记录。
(3)删除不再需要的undo log。
3.从5.6开始,将purge thread独立出来
(1)innodb_purge_threads=1
(2)innodb_max_purge_lag=0
(3)innodb_purge_batch_size-300
4.案例:删除大量旧数据后,统计min(pkid)很慢。
insert buffer/change buffer
1.将非唯一辅助索引上的IUD操作从随机变成顺序I/O,提高I/O效率。
2.工作机制:
(1)先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入。
(2)若不在,则先放入到一个change buffer对象中。(change buffer也是课B+树。每次最多缓存2K的记录)
(3)当读取辅助索引到缓冲池,将insert buffer中该页的记录合并到辅助索引页。
3.innodb_change_buffer_max_size
4.innodb_change_buffering
(1)fast shutdown不进行insert buffer合并。
(2)insert buffer进行合并时插入时,tps会受到影响。
(3)insert buffer占用一部分buffer pool,如果辅助索引不多,可以考虑关闭或调低insert buffer。
double write,双写
1.目的/作用:保证数据写入的可靠性(防止数据页损坏,又无从修复)
2.因为InnoDB有partial write问题。
(1)16k的页只写入了部分数据时发生crash。
(2)redo里记录的是逻辑操作,不是物理块,无法通过redo log恢复。
3.怎么解决partial write问题
(1)双写,double write。
(2)2个1M的空间,共2M(既有磁盘文件,也有内存空间)。
(3)页在刷新时首先顺序地写入到doublewrite buffer。
(4)然后再刷新回磁盘。
4.在可以保证原子写的硬件设备或文件系统下,可以被关闭。
5.slave上也可关闭。
6.double write写入时顺序的,性能损失很小(SSD设备上损失则比较大)。
7.MySQL 5.7起,采用PCIE SSD设备时会自动判断,是否要关闭double write buffer。