June 8, 2013

[MySQL 5.6] Innodb 新特性之 multi purge thread

在做5.6.12 vs 5.6.11的性能对比时,大量update产生了很长的purge history list。手贱把innodb_fast_shutdowns设置为0了,结果Purge线程一直干活了,差不多两个小时才结束…. 我们知道,在MySQL5.5版本中,就已经开始将purge 任务从master线程中独立出来,而到了5.6,已经支持多个purge线程同时进行,简单的理了下代码逻辑. //////////////////////////////////////////////////////// 在5.6中,提供了参数Innodb_purge_threads来控制做purge操作的后台线程数,最大允许设置为32. purge线程被分为两类,一类是coordinator thread,只有一个这样的线程,另外的Innodb_purge_threads-1个是worker线程. 线程在Innodb启动时创建 quoted code in innobase_start_or_create_for_mysql: 2584 if (!srv_read_only_mode 2585 && srv_force_recovery < SRV_FORCE_NO_BACKGROUND) { 2586 2587 os_thread_create( 2588 srv_purge_coordinator_thread, 2589 NULL, thread_ids + 5 + SRV_MAX_N_IO_THREADS); 2590 2591 ut_a(UT_ARR_SIZE(thread_ids) 2592 > 5 + srv_n_purge_threads + SRV_MAX_N_IO_THREADS); 2593 2594 /* We’ve already created the purge coordinator […]

MySQL 5.6.12的Innodb性能改进

简单的记录下,在MySQL5.6.12中innodb层的3点跟性能相关的改进 1.在文件操作部分,移除了许多sleep操作,而是改用condition wait 对应的bug http://bugs.mysql.com/bug.php?id=68588。 在Mark的测试中,有近一倍的性能提升 http://bazaar.launchpad.net/~mysql/mysql-server/5.6/revision/4981 主要修改都几种在函数fil_flush中: 每个文件结构体node都增加了一个event: fil_node_create: node->sync_event = os_event_create(); fil_node_free: os_event_free(node->sync_event) fil_flush: 当文件上已经有线程在做flush时: 5638 if (node->n_pending_flushes > 0) { 5639 /* We want to avoid calling os_file_flush() on 5640 the file twice at the same time, because we do 5641 not know what bugs OS’s may contain in file 5642 i/o */ […]