MySQL:Multi-threaded slave statistics for channel日志的补充说明

一、问题来源

这个问题如下:


image.png

朋友也分析了binlog发现并没有大事务的存在,且从库压力很小很小。下面我们稍微再来分析一下。

二、以往的说明

  • “Waiting for dependent transaction to commit”

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

  • “Waiting for slave workers to process their queues”

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

  • “Waiting for Slave Worker queue”

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

另外实际上还有一种等待如下:
“Waiting for Slave Workers to free pending events”:由所谓的‘big event’造成的,什么是‘big event’呢,源码中描述为:event size is greater than slave_pending_jobs_size_max but less than slave_max_allowed_packet。我个人认为出现的可能性不大,因此没做过多考虑。可以在函数append_item_to_jobs中找到答案。

我们下面对应日志中的输出进行详细解释,如下:

指标 解释
seconds elapsed 整个分配过程消耗的时间,单位秒,超过120秒会出现这个日志。
events assigned 本工作线程分配的Event数量。
worker queues filled over overrun level 本工作线程任务队列中Event个数大于90%的次数。当前硬编码大于14746。
waited due a Worker queue full 本工作线程任务队列已满的次数。当前硬编码大于16384。和前面第三点对应。
waited due the total size ‘big event’的出现的次数。
waited at clock conflicts 由于不能并行回放,协调线程等待的时间,单位纳秒。和前面第一点对应。
waited (count) when Workers occupied 由于没有空闲的工作线程而等待的次数。对应前面第二点。
waited when Workers occupied 由于没有空闲的工作线程而等待的时间。对应前面第二点。

三、特殊场景说明

我们这里看到waited at clock conflict比较大,这是一个累计值,来自rli.mts_total_wait_overlap,单位为纳秒,但是由于是累计值可参考性并不是那么强,只能做一个整体的把控。具体的简化代码如下:

    set_timespec_nsec(&ts[0], 0);//设置开始时间

    thd->ENTER_COND(&rli->logical_clock_cond, &rli->mts_gaq_LOCK,
                    &stage_worker_waiting_for_commit_parent, &old_stage); 
    do
    {
      mysql_cond_wait(&rli->logical_clock_cond, &rli->mts_gaq_LOCK);
    }
    while ((!rli->info_thd->killed && !is_error) &&
           !clock_leq(last_committed_arg, estimate_lwm_timestamp()));//一直等待直到last_commit<= estimate_lwm_timestamp
    thd->EXIT_COND(&old_stage);
    set_timespec_nsec(&ts[1], 0);//设置结束时间
    my_atomic_add64(&rli->mts_total_wait_overlap, diff_timespec(&ts[1], &ts[0])); //相减得到等待市场,加入到rli->mts_total_wait_overlap中

而超过120秒,实际上这里做了简化,更加精确的含义为,如果协调线程1024个event分配的时间大于了120秒则会出现这个警告。那么问题来了,说明时候协调线程的分配1024个event会大于120秒呢?那么显然有2种情况

  • 从库worker线程压力较大,也就是以往的说明中描述的这些情况。
  • 还有一种特殊的情况就是本来库的压力就很小,在120秒内没有1024个event生成。

我们知道一个常规的小事务通常为 gitd event、query event、map event、dml event、xid event 5 个组成,那么1024event大概就是205个事务,换句话说如果主库压力过小,2分钟之内连205个事务都没有也会触发这个警告。

简单看看判断标准也是非常的简单:

      if (rli->is_parallel_exec() && rli->mts_events_assigned % 1024 == 1) //这里就是进入判断的前提条件
      {
        time_t my_now= my_time(0);

        if ((my_now - rli->mts_last_online_stat) >=
            mts_online_stat_period)//大于2分钟

这可以说是两种极端,出现这个日志报告,要么是压力太大(忙死)、要么是压力太小(闲死)。

四、测试

测试很简单,我们就在主库慢慢的执行200来个事务一定会超过2分钟,那么从库的MTS当每分配到1024个event的时候必然进入判定流程,日志输出如下:

2021-03-15T08:38:23.676061Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 62849ms. The settings might not be optimal. (flushed=0, during the time.)
2021-03-15T08:38:23.696028Z 15 [Note] Multi-threaded slave statistics for channel '': seconds elapsed = 870; events assigned = 2049; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 0 waited (count) when Workers occupied = 0 waited when Workers occupied = 0
4872              rli->mts_last_online_stat= my_now;
(gdb) 
4880      set_timespec_nsec(&rli->ts_exec[1], 0);
(gdb) c
Continuing.

Breakpoint 6, apply_event_and_update_pos (ptr_ev=0x7fffd71ac880, thd=0x7fffcc000ab0, rli=0x7fff9002ef20) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:4850
4850            if ((my_now - rli->mts_last_online_stat) >=
(gdb) n
4871                                    rli->mts_total_wait_worker_avail);
(gdb) p my_now
$10 = 1615799283
(gdb) p rli->mts_last_online_stat
$11 = 1615797440
(gdb) n
4864                                    (my_now - rli->mts_last_online_stat),
(gdb) n
4871                                    rli->mts_total_wait_worker_avail);
(gdb) n
4862                                    rli->get_for_channel_str(),
(gdb) n
4871                                    rli->mts_total_wait_worker_avail);
(gdb) n
2021-03-15T09:08:21.325551Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 17962ms. The settings might not be optimal. (flushed=0, during the time.)
2021-03-15T09:08:21.327019Z 15 [Note] Multi-threaded slave statistics for channel '': seconds elapsed = 1843; events assigned = 3073; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 14903300 waited (count) when Workers occupied = 0 waited when Workers occupied = 0
4872              rli->mts_last_online_stat= my_now;

这个日志中我们发现有两个[Note] Multi-threaded slave statistics for channel '':的日志,而3073 - 2049也等于1024,也可以看到有一次的econds elapsed为1843,这是因为我中间去干其他活去了,主库很久都没动,这典型的属于闲死。
可以看到我们闲死的结论得到证明。当然是闲死还是忙死,还是根据从库woker线程的压力进行判断,忙死的情况下这种日志报告还是有一定参考意义的。但是闲死的情况下就没有什么意义了忽略就是了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容