innodb中master线程的调度的算法改进(mysql 5.6.26)

作者:周琳

QQ:715169549源码交流群:196380905

1.master线程的调度:/*********************************************************************//**

The master thread controlling the server.

os_thread_ret_t DECLARE_THREAD(srv_master_thread)

如下是核心代码:

ulint old_activity_count = srv_get_activity_count();

if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) {

goto suspend_thread;

}

while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {

/*在linux下就是1000000/1000000,在针对这个整除的值%1000000;

*这个就是os_thread_sleep( microseconds);的计算方式

srv_master_sleep(); //

MONITOR_INC(MONITOR_MASTER_THREAD_SLEEP);

/*很显然并没有按照1秒和10秒的算法来,而是通过当前服务器活动的数量来决定。

if (srv_check_activity(old_activity_count)) { //srv_check_activity(old_activity_count)返回:return(srv_sys->activity_count != old_activity_count);

old_activity_count = srv_get_activity_count(); //srv_get_activity_count返回:return(srv_sys->activity_count);

srv_master_do_active_tasks();

} else {

srv_master_do_idle_tasks();

}

}

while (srv_master_do_shutdown_tasks(&last_print_time)) {

/* Shouldn't loop here in case of very fast shutdown*/ut_ad(srv_fast_shutdown< 2);

}

}

srv_master_do_active_tasks做的事情://#define PCT_IO(p) ((ulong) (srv_io_capacity * ((double) (p) / 100.0)))//# define SRV_MASTER_CHECKPOINT_INTERVAL (7)

1.log_free_check,检查是否有空闲的log buffer。2.ibuf_contract_in_background(0, FALSE),合并PCT_IO(5)个插入缓冲3.srv_sync_log_buffer_in_background,后台同步刷新log buffer日志到log file4.cur_time % SRV_MASTER_CHECKPOINT_INTERVAL == 0,就做log_checkpoint(TRUE, FALSE),而log_checkpoint仅仅是检查bp中的lsn以及把lsn的值写入到redo file中。

真正做检查点刷新脏页到磁盘的是log_make_checkpoint_at函数。

srv_master_do_idle_tasks做的事情:1.log_free_check,检查是否有空闲的log buffer。2.ibuf_contract_in_background(0, TRUE),合并PCT_IO(100)个插入缓冲.3.srv_sync_log_buffer_in_background,刷新log buffer到磁盘。4.cur_time % SRV_MASTER_CHECKPOINT_INTERVAL == 0,就做log_checkpoint(TRUE, FALSE),而log_checkpoint仅仅是检查bp中的lsn以及把lsn的值写入到redo file中。

真正做检查点刷新脏页到磁盘的是log_make_checkpoint_at函数。

如下是srv_sys_t结构:

元素包含一个线程表和一个task queue。/** The server system struct*/

structsrv_sys_t{

ib_mutex_t tasks_mutex;/*!< variable protecting the

tasks queue*/UT_LIST_BASE_NODE_T(que_thr_t)

tasks;/*!< task queue*/ib_mutex_t mutex;/*!< variable protecting the

fields below.*/ulint n_sys_threads;/*!< size of the sys_threads

array*/srv_slot_t* sys_threads; /*!< server thread table*/ulint n_threads_active[SRV_MASTER+ 1];/*!< number of threads active

in a thread class*/srv_stats_t::ulint_ctr_1_t

activity_count;/*!< For tracking server

activity*/};

接下来介绍下activity_count,这个函数是由srv_inc_activity_count(srv_sys->activity_count.inc();)进行自增的,这个函数会在哪些动作中调用呢?

我们看下调用该函数的函数流程:1.row_undo_step:在表中回滚一行的操作->srv_inc_activity_count()2.srv_active_wake_master_thread:如果需要主线程处理,切主线程处于挂起状态就唤醒主线程。->srv_inc_activity_count()3.srv_wake_master_thread:如果主线程挂起或者正在被挂起,唤醒主线程。->srv_inc_activity_count()

上述函数还被很多函数调用,activity_count可以理解为mysql运行中操作的计数器,每个操作都会累加。所以master线程依据时间间隔的

activity_count计数器来判断执行srv_master_do_active_tasks还是srv_master_do_idle_tasks。可以看出这个计数器如果在1秒以后这个值如果

不发生变化就切换到srv_master_do_idle_tasks。2.page cleaner线程:(buf0flu.c中)

核心代码:

ulint next_loop_time= ut_time_ms() + 1000;while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {//服务器没有关闭的状态下

/*The page_cleaner skips sleep if the server is

idle and there are no pending IOs in the buffer pool

and there is work to do.*/

if (srv_check_activity(last_activity) //检查当前服务器的活动次数

||buf_get_n_pending_read_ios()|| n_flushed == 0) {

page_cleaner_sleep_if_needed(next_loop_time);//休眠min(1000000,(next_loop_time-当前时间)*1000))

}

next_loop_time= ut_time_ms() + 1000; //重新计算当前next_loop_time值

if (srv_check_activity(last_activity)) { //检查当前服务器活动数量

last_activity =srv_get_activity_count();/*Flush pages from end of LRU if required*/n_flushed=buf_flush_LRU_tail();/*Flush pages from flush_list if required*/n_flushed+=page_cleaner_flush_pages_if_needed();

}else{

n_flushed=page_cleaner_do_flush_batch(

PCT_IO(100), //刷新srv_io_capacity个脏页到磁盘

LSN_MAX);

}

}if (srv_fast_shutdown == 2) {/*In very fast shutdown we simulate a crash of

buffer pool. We are not required to do any flushing*/

gotothread_exit;

}do{

n_flushed= page_cleaner_do_flush_batch(PCT_IO(100), LSN_MAX); //刷新srv_io_capacity个脏页到磁盘

/*We sleep only if there are no pages to flush*/

if (n_flushed == 0) {

os_thread_sleep(100000); //休眠1秒

}

}while (srv_shutdown_state ==SRV_SHUTDOWN_CLEANUP);do{

success= buf_flush_list(PCT_IO(100), LSN_MAX, &n_flushed);

buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);

}while (!success || n_flushed > 0);

mysql的多master调度_innodb中master线程的调度的算法改进(mysql 5.6.26)相关推荐

  1. innodb中master线程的调度的算法改进(mysql 5.6.26)

    innodb中master线程的调度的算法改进(mysql 5.6.26)作者:周琳QQ:715169549源码交流群:1963809051.master线程的调度:/**************** ...

  2. linux 编程 调度,Linux的进程线程及调度

    搜索热词 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PC ...

  3. mysql删除没有索引页_InnoDB中没有主键是如何运转的

    InnoDB聚簇索引的背景 在InnoDB索引页的物理结构中,"我"讲述了"InnoDB中一切都是索引".这意味着每个InnoDB引擎的表必须有一个" ...

  4. 线程池 调度 java_java调度器和线程池总结

    一.推荐使用的调度器和线程池 1.调度器 //2个线程的调度器 private static ScheduledThreadPoolExecutor pool = new ScheduledThrea ...

  5. java死锁怎么用jvm调试,线程死锁演示,线程锁演示,模拟JVM的线程次序调度

    线程死锁演示,线程锁演示,模拟JVM的线程次序调度 模拟JVM的线程次序调度 注释A,不注释B,一般不死锁 注释B,不注释A,死锁 都不注释,随机package org.he.bin;/** * @a ...

  6. mysql数据库取证_1earn/取证.md at master · doanhnhq-uit/1earn · GitHub

    取证 免责声明 本人撰写的手册,仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 大纲 操作系统取证 Android win 工具 windows 日志 ...

  7. mysql master slave区别_mysql master/slave 使用感受

    使用mysql的master/slave部署已经有一段时间.这种架构不能从根本上弥补数据结构设计失误带来的性能问题.聊胜于无. master/slave模式中,数据同步非常快.而master/slav ...

  8. mysql master 配置_MySQL双Master配置的方法详解

    刚刚抽空做了一下MYSQL 的主主同步.把步骤写下来,至于会出现的什么问题,以后随时更新.这里我同步的数据库是TEST1.环境描述.主机:192.168.0.231(A)主机:192.168.0.23 ...

  9. mysql主从切换机制torch_MySQL Replication设置(Master/Slave)实现主从复制

    一.Master配置 1.my.cnf配置 # vim /etc/mysql/mariadb.conf.d/50-server.cnf [mysqld] log-bin=mysql-bin //[必须 ...

最新文章

  1. 解决fragment replace 重叠现象
  2. AI基础:正则表达式
  3. SAP UI5 jQuery.sap.setObject
  4. 7-3 逆序的三位数 (10 分)
  5. linux生产环境下安装anaconda总结
  6. python数据分析的步骤排序_Python数据分析
  7. table标签+css代码实现选项卡效果(用)
  8. 《云计算架构技术与实践》连载(12)2.2.7 应用管理自己主动化技术
  9. 化工企业数据分析中心项目之采购模块分析
  10. [图解]管理九段的新排列
  11. 【路径规划】基于matlab A_star算法机器人避障自动寻路路径规划【含Matlab源码 496期】
  12. 可线性渐变的环形进度条的实现探究
  13. 看得上瘾的斗鱼,首次开源了自家项目 Jupiter !
  14. 如何通过a链接实现图片下载
  15. java转换成kotlin语言教程_#7 Kotlin教程 | 把Java转换为Kotlin
  16. Python贴吧邮箱爬虫
  17. 一名软件测试工程师的日常
  18. 【业务人员第一视角】氚云低代码开发平台测评
  19. 如何用python处理文件(图文详解)
  20. 游戏产业迎新机遇,KuPlay平台助力多元化发展

热门文章

  1. 单核工作法19:给创意充电(上)
  2. Git学习笔记:如何删除GitHub上的项目
  3. typeset的常见用法
  4. 分享 C++命名空间的解释
  5. vb跨域访问ajax,解决AJAX的跨域访问-两种有效示例
  6. [云炬创业基础笔记]第四章测试24
  7. 科大星云诗社动态20210427
  8. 从马克思哲学客观原理角度——反思大学生创业2017-12-15
  9. Redis批量操作详解及性能分析
  10. 在stringgrid的drawcell事件处理过程中,给单元格赋值时,要用textout输出,不要像一般给cell[i,j]赋值那样。