MySQL优化班13期课后作业,20180904

请简述下InnoDB几个主要的后台线程作用,及其相应的优化策略。主要有:
1、master thread
2、checkpoint thread
3、flushing thread
4、purge thread
5、change buffer thread
6、buffer pool dump thread
7、table dict thread
8、read/write thread
已邀请:

aaron8219 - Oracle DBA

赞同来自:

1、master thread:
innodb中的大部分工作都是由该线程来完成的(新版本将有独立线程去完成)
主要有4种循环(loop,background loop,flush loop,suspend loop),并在这4种循环状态中切换
其分为每秒和每10秒两种机制,分别执行不同的操作:
每秒:刷脏页到磁盘,刷redo到磁盘,执行change buffer合并,执行checkpoint,检查并更新数据字典缓存
10秒:除了以上几种操作,还多了删除undo页

2、checkpoint thread
定期执行检查点操作,将脏页落盘,减少crash recovery时丢失数据的风险
主要有以下几个触发点:
1)buffer pool 脏数据太多
2)redo logfile快不够用时
3)日志切换时
主要有两种执行模式:
1)sharp:将全部脏页刷新到磁盘,量大时系统会hang
2)fuzzy:持续地将脏页刷新到磁盘,对系统影响较小

3、flushing thread
也称为page cleaner thread(innodb 1.2.x之后加入),将刷新操作从原master thread中独立出来
主要负责以下操作:
1)刷新脏页到double write buffer
2)将double write burffer刷盘
3)将脏页刷盘
支持两种刷新模式:
1)LRU flushing,基于LRU list,即按最后访问的时间顺序进行刷新
2)adaptive flushing,基于flush list,即按最后修改的时间顺序进行刷新

4、purge thread
innodb 1.2.x之后支持多个purge thread,可以尽快释放innodb buffer pool空间
主要用于清理事务提交后那些无用的undo page,删除辅助索引中已经不存在的记录,删除标记为delete-marked的记录

5、change buffer thread
早期版本叫做insert buffer thread,该线程将非唯一索引上等插入、更新、删除操作进行合并(转化为顺序I/O),可以提高I/O效率

6、buffer pool dump thread
5.6版本以后支持innodb buffer pool预热功能,由该线程负责在重启服务器时对innodb buffer pool中的MRU的页进行dump和load操作(加载比例由参数innodb_buffer_pool_dump_pct来控制),将页的数据加载到文件中进行预热,优化启动速度

7、table dict thread
也是从master thread中独立出来,用于检查有没有需要清除table cache的专用线程

8、read/write thread
作为IO thread的一部分,5.7中各有4个read thread和4个write thread,负责以异步IO的方式来处理innodb引擎的读写请求

相关参数优化建议:
1)innodb_max_dirty_pages_pct=50,innodb_max_dirty_pages_pct_lwm=0,减少脏页堆积
2)innodb_purge_batch_size,默认300,可以调为较大的值,加快undo清理
3)innodb_max_purge_lag=0,可以使purge thread加速purge操作,尽快释放内存中的undo page
4)innodb_purge_thread,默认4,提高该值可以使涉及多表DML操作的性能更好(大量undo)
5)innodb_adaptive_flushing=1,避免突发I/O,innodb_adaptive_flushing_lwm,默认值10,可以适当增大来提高redo log刷新量
6)innodb_flush_neighbors=1(机械盘),可以提高刷脏页的I/O效率,innodb_flushing_avg_loops,默认30,调大可以使刷脏页的过程更平滑
7)innodb_io_capacity,默认200,如果有大量的脏页待刷,可以提高这个值
8)inndob_flush_log_at_trx_commit=1,保证事务一致性,对性能会有一些影响,建议从库设置为2
 

要回复问题请先登录注册