###一、问题来源

这是一位朋友给我的一个截图,说show slave status一直处于Wating for Slave workers to free pending events状态,这个库是MTS从库,版本为5.7.25

![image.png](https://upload-images.jianshu.io/upload_images/7398834-9041e43c7f636efc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

###二、关于等待

我曾经在我的主从原理系列中(已经成书)解释过大部分协调线程的等待,如下:

– “Waiting for dependent transaction to commit”

由于协调线程判定本事务由于last commit大于current_lwm因此不能并行回放,协调线程处于等待,大事务会加剧这种情况。

– “Waiting for slave workers to process their queues”

由于没有空闲的工作线程,协调线程会等待。这种情况说明理论上的并行度是理想的,但是可能是参数slave_parallel_workers设置不够。当然设置工作线程的个数应该和服务器的配置和负载相结合考虑。

– “Waiting for Slave Worker queue”

由于工作线程的任务队列已满,协调线程会等待。这种情况前面说过是由于一个事务包含了过多的Event并且工作线程应用Event的速度赶不上协调线程分配Event的速度,导致了积压并且超过了16384个Event。

但是对于Wating for Slave workers to free pending events等待,只是简单的提及了可能涉及到big event,这里想说的就是实际上这个等待可能和两方面有关:

1. 如果涉及到big event,那么要求worker线程当前没有积压的event正在执行

2. 如果不是big event,那么需要判断当前worker线程积压的event大小加上本次进入worker线程对列的event大小之和不能超过参数slave_pending_jobs_size_max的大小

什么是big event呢?很简源码判断如下:

“`

bool big_event= (ev_size > rli->mts_pending_jobs_size_max);

“`

遇到这种问题应该在日志中能够看到

“`

2020-10-28T14:07:49.522388+08:00 14 [Note] Multi-threaded slave statistics for channel ”: seconds elapsed = 676;…..waited due the total size 的大小不为0。

“`

###三、判断的维度

这里我们简单考虑一下判断一下可以进入worker线程队列的维度。首先我们说对于woker线程队列来讲他有一个固定的大小也就是积压不能超过16384个event,这里我们还明白来,这些积压的event还不能太大,如果太大就会出现Wating for Slave workers to free pending events等待,因此总结一下:

– 如果协调线程发现分配的woker线程积压的event个数超过了 16384个event,那么进入Waiting for Slave Worker queue等待

– 如果协调线程发现分配的worker线程积压的event的大小超过了slave_pending_jobs_size_max设置的大小,那么进入Wating for Slave workers to free pending events等待

当然这是从个数和大小两个不同的维度来判断的,如果一个大事务,我们知道这样的事务会形成很多8K左右的event(比如一次delete了1000W的数据),那么如果只用个数来判断那么就是积压的event大小最多达到(8K*16384=128M),实际上我们的参数slave_pending_jobs_size_max 默认为16M,这种情况下可能协调线程会先触发Wating for Slave workers to free pending events等待。

因此不管是触发了Waiting for Slave Worker queue等待还是Wating for Slave workers to free pending events等待,我们都需要检查一下worker线程回放event的效率是不是遇到了问题。

###四、关于源码等待

函数入口append_item_to_jobs

– 关于等待,如下:

“`

bool big_event= (ev_size > rli->mts_pending_jobs_size_max);

/*

C waits basing on *data* sizes in the queues.

If it is a big event (event size is greater than

slave_pending_jobs_size_max but less than slave_max_allowed_packet),

it will wait for all the jobs in the workers’s queue to be

completed. If it is normal event (event size is less than

slave_pending_jobs_size_max), then it will wait for

enough empty memory to keep the event in one of the workers’s

queue.

NOTE: Receiver thread (I/O thread) is taking care of restricting

the event size to slave_max_allowed_packet. If an event from

the master is bigger than this value, IO thread will be stopped

with error ER_NET_PACKET_TOO_LARGE.

*/

while ( (!big_event && new_pend_size > rli->mts_pending_jobs_size_max)//条件1

|| (big_event && rli->mts_pending_jobs_size != 0 ))//条件2

{

rli->mts_wq_oversize= TRUE;

rli->wq_size_waits_cnt++; // 增加由于big event或者积压大小过多导致的等待次数

thd->ENTER_COND(&rli->pending_jobs_cond, &rli->pending_jobs_lock,

&stage_slave_waiting_worker_to_free_events, &old_stage);//进入等待状态

mysql_cond_wait(&rli->pending_jobs_cond, &rli->pending_jobs_lock);//等待条件变量

mysql_mutex_unlock(&rli->pending_jobs_lock);

thd->EXIT_COND(&old_stage);

if (thd->killed)

return true;

if (rli->wq_size_waits_cnt % 10 == 1)

sql_print_information(“Multi-threaded slave: Coordinator has waited ”

“%lu times hitting slave_pending_jobs_size_max; ”

“current event size = %zu.”,

rli->wq_size_waits_cnt, ev_size);

mysql_mutex_lock(&rli->pending_jobs_lock);

new_pend_size= rli->mts_pending_jobs_size + ev_size;

}

“`

– 关于唤醒,如下:

当woker线程执行完event后,会进行减去执行完event size的操作如下,入口函数remove_item_from_jobs:

“`

减去执行完event size

rli->mts_pending_jobs_size-= ev->common_header->data_written;

唤醒

/* coordinator can be waiting */

if (rli->mts_pending_jobs_size mts_pending_jobs_size_max &&

rli->mts_wq_oversize) // TODO: unit/general test wq_oversize

{

rli->mts_wq_oversize= FALSE;

mysql_cond_signal(&rli->pending_jobs_cond);

}

“`

mysql slave_pending_jobs_size_max_MySQL:关于Wating for Slave workers to free pending events等待...相关推荐

  1. mysql wating for_MySQL:关于Wating for Slave workers to free pending events等待

    ###一.问题来源 这是一位朋友给我的一个截图,说show slave status一直处于Wating for Slave workers to free pending events状态,这个库是 ...

  2. MySQL里Wating for Slave workers to free pending events到底在等什么

    作者:八怪(高鹏) 中亦科技数据库专家 一.问题来源 这是一位朋友给我的一个截图,说show slave status一直处于Wating for Slave workers to free pend ...

  3. mysql 部署master slave_MySQL Master Slave 数据同步,集群。

    该文章为原创,作者:梁健,QQ:15141739,时间:2011年5月11日17:55:26 转载注明作者.最近学习了一下MySQL的集群,发现MySQL的集群有很多种方式,下面来介绍下学到的MySQ ...

  4. MySQL主从复制中的“show slave status”详细含义

    MySQL主从复制中的"show slave status"详细含义 正常状态的信息 *************************** 1. row ************ ...

  5. mysql 主从配置(master slave)

    mysql主从复制 (超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:   1.1.版本一致   1.2.初始化表,并在后台启动mysql ...

  6. mysql show slave_Mysql复制 show slave status

    MySQL数据库主从延时如何去判断呢?本文我们介绍了两种判断方法:1. Seconds_Behind_Master vs 2. mk-heartbeat,接下来我们就分别介绍这些内容. 日常工作中,对 ...

  7. mysql从节点放家里_添加MySQL 5.6 从节点 Slave

    mysql版本:5.6.36 xtraback版本:version 2.4.6 1.修改主节点MySQL配置文件,并重启MySQL cat /usr/local/mysql/my.cnf [mysql ...

  8. mysql slave_pending_jobs_size_max_MySQL MTS复制: hitting slave_pending_jobs_size_max

    测试步骤: 从库停止复制:stop slave; 主库创建大表400万条记录. 开启从库复制:start slave; 监测从库error log持续输出: 2018-12-06T10:40:52.6 ...

  9. mysql主从同步错误:The slave I/O thread stops because master and slave have equal MySQL server UUIDs

    在配置mysql主从复制的时候出现错误: Fatal error: The slave I/O thread stops because master and slave have equal MyS ...

最新文章

  1. Java多线程复习:1(进程和线程、并发和并行)
  2. 【 FPGA 】状态机的模型之Mealy型状态机
  3. python读取hdf文件 高效_利用python读取MODIS hdf文件
  4. read write 返回值
  5. sqlplus操作--文件的输入与输出
  6. Spark _26_Spark On Hive的配置
  7. Apache的架构师总结出30条架构设计原则
  8. vue怎么插入接口demo_vue项目如何设置接口
  9. Liferay7 BPM门户开发之46: 集成Activiti用户、用户组、成员关系同步
  10. 金山网盾3.5实战流氓软件
  11. Oracle - TRUNC, ROUND, CEIL, FLOOR
  12. tomcat 配置https 访
  13. 国产计算机设备,国产计算机报价
  14. 用C语言实现正则表达式匹配器
  15. Ensemble_VEP--vcf文件注释
  16. python存钱程序_Python基础(六) 52周存钱demo
  17. 纯粹数学的雪崩效应:庞加莱猜想何以造福了精准医疗?
  18. 国资优选—兰溪市金融控股投资有限公司思想工作会议召开
  19. echarts或vcharts的X轴设置
  20. 斯坦福的《机器学习》课程上线了

热门文章

  1. 史上最简单的springcloud微服务入门实例,满足企业日常需求,开箱即用,工资翻倍不是梦...
  2. 【GlobalMapper精品教程】040:tif转jpg:解决ArcGIS中JPEG压缩仅支持8位或16位无符号数据的问题
  3. Android中的EditText属性说明
  4. Java使用jdbc连接sqlserver2000与2005的语句差别
  5. 数据分析学习技能树 | 养成数据分析师的品质和思维模式
  6. JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1
  7. JSON.stringify()和JSON.parse()
  8. 联想拯救者y7000怎么配置Java环境_联想拯救者Y7000性能配置如何 用起来怎么样...
  9. ZYNQ RFSoc开发板-usrp软件无线电X410mini开发板-5G评估板
  10. 人工智能在游戏领域的应用有哪些?