在开启了多线程回放的从库error log,我们经常能看到Note级别的日志信息MY-010559
让我们来看看这些日志的含义
Seconds elapsed:当前时间与上次输出日志时间的间隔秒数
Events assigned:自slave协调线程启动后,累计处理分发给worker线程的event数量。简单理解为slave启动后处理的event数量。
Worker queues filled over overrun level:worker线程处理的event队列长度超过最大队列数(目前代码硬编码16384)的90%的次数,如果0则说明未发生该情况。
Waited due to worker queue full:worker线程处理的event队列长度达到最大(目前代码硬编码16384)的次数,如果为0则说明未发生该情况,是前面Worker queues filled over overrun level的情况升级。
Waited due to the total size:协调线程分发event大小达到replica_pending_jobs_size_max或者slave_pending_jobs_size_max限制而产生等待的次数。前面两个参数是限制worker线程处理event队列能够申请的最大内存(即大事务)。如果遇到此种大事务,在回放该大事务之前,会等待其他worker线程处理完已分配event,然后再进行该大事务的回放,回放过程中,后续的event回放,也会进入等待状态。总之,大事务回放特别影响并行回放的性能,只能串行回放。
Waited at clock conflicts:由于不能并行回放的累计等待时间,单位纳秒。如果并行回放策略设置的是DATABASE而不是LOGICAL_CLOCK,该值一直为0。
Waited (count) when workers occupied:协调线程休眠次数。有两种情况会累加此状态值:1、worker线程达到最大队列数(目前代码硬编码16384)的90%,此种情况协调线程最多休眠1毫秒;2、并行回放策略设置为LOGICAL_CLOCK时,由于没有空闲的worker线程导致无法分配事务的第一个event而产生的等待,此种情况协调线程会一直处于等待状态直到有空闲的worker线程能够处理回放。
Waited when workers occupied:等待空闲的worker线程累计时间,单位纳秒,对应Waited (count) when workers occupied的第二种等待情况。
代码分析
在8.0.26版本的代码中,我们通过错误信息关键字waited at clock conflicts查找,发现信息记录在变量ER_RPL_MTS_STATISTICS中,
继续按变量查找,发现其使用在rpl_replica.cc文件的apply_event_and_update_pos函数中,主要逻辑代码如下
可以看到,满足如下几个条件,日志信息就会输出