From 3b138291e8a599c8a18b86a1196aaa7d8e2658f7 Mon Sep 17 00:00:00 2001 From: Wenshuang Lu Date: Fri, 27 Oct 2023 18:02:09 +0800 Subject: [PATCH] docs: update mysql-threadpool-main-solutions-details --- ...png => alisql-threadpool-point-select.png} | Bin ...e.png => alisql-threadpool-read-write.png} | Bin ...=> alisql-threadpool-update-non-index.png} | Bin ...y.png => alisql-threadpool-write-only.png} | Bin .../huawei-kenpeng-worker-flow-chart.png | Bin 100686 -> 0 bytes .../huawei-kunpeng-threadpool-benchmark.png | Bin 23330 -> 0 bytes .../index.html | 319 ++++-------------- ...-ro.png => mariadb-threadpool-oltp-ro.png} | Bin ...-rw.png => mariadb-threadpool-oltp-rw.png} | Bin ...ng => mariadb-threadpool-point-select.png} | Bin ...ng => mariadb-threadpool-update-nokey.png} | Bin .../numa-architecture.png | Bin 24962 -> 0 bytes .../threadpool-architecture-details.png | Bin 521447 -> 0 bytes .../threadpool-architecture.png | Bin 157048 -> 273177 bytes .../threadpool-components.png | Bin 0 -> 170818 bytes .../threadpool-group-architecture.png | Bin 0 -> 258230 bytes .../threadpool-group.png | Bin 239391 -> 0 bytes ...chart.png => threadpool-listener-flow.png} | Bin ...adpool-worker-switch-to-listener-flow.png} | Bin .../06/05/mysql-mtr-03-source-code/index.html | 6 +- docs/archives/2023/05/index.html | 4 +- docs/archives/2023/index.html | 4 +- docs/archives/index.html | 4 +- docs/atom.xml | 14 +- docs/categories/MySQL/index.html | 4 +- docs/content.json | 2 +- docs/index.html | 15 +- docs/search.xml | 4 +- docs/sitemap.xml | 172 +++++----- docs/tags/MTR/index.html | 4 +- docs/tags/MySQL/index.html | 4 +- .../index.html" | 4 +- .../source/_posts/mysql-mtr-03-source-code.md | 2 +- ...mysql-threadpool-main-solutions-details.md | 257 ++++---------- ...png => alisql-threadpool-point-select.png} | Bin ...e.png => alisql-threadpool-read-write.png} | Bin ...=> alisql-threadpool-update-non-index.png} | Bin ...y.png => alisql-threadpool-write-only.png} | Bin .../huawei-kenpeng-worker-flow-chart.png | Bin 100686 -> 0 bytes .../huawei-kunpeng-threadpool-benchmark.png | Bin 23330 -> 0 bytes ...-ro.png => mariadb-threadpool-oltp-ro.png} | Bin ...-rw.png => mariadb-threadpool-oltp-rw.png} | Bin ...ng => mariadb-threadpool-point-select.png} | Bin ...ng => mariadb-threadpool-update-nokey.png} | Bin .../numa-architecture.png | Bin 24962 -> 0 bytes .../threadpool-architecture-details.png | Bin 521447 -> 0 bytes .../threadpool-architecture.png | Bin 157048 -> 273177 bytes .../threadpool-components.png | Bin 0 -> 170818 bytes .../threadpool-group-architecture.png | Bin 0 -> 258230 bytes .../threadpool-group.png | Bin 239391 -> 0 bytes ...chart.png => threadpool-listener-flow.png} | Bin ...adpool-worker-switch-to-listener-flow.png} | Bin 52 files changed, 250 insertions(+), 569 deletions(-) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{alisql-sysbench-point-select.png => alisql-threadpool-point-select.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{alisql-sysbench-read-write.png => alisql-threadpool-read-write.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{alisql-sysbench-update-non-index.png => alisql-threadpool-update-non-index.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{alisql-sysbench-write-only.png => alisql-threadpool-write-only.png} (100%) delete mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png delete mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-oltp-ro.png => mariadb-threadpool-oltp-ro.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-oltp-rw.png => mariadb-threadpool-oltp-rw.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-point-select.png => mariadb-threadpool-point-select.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-update-nokey.png => mariadb-threadpool-update-nokey.png} (100%) delete mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/numa-architecture.png delete mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/threadpool-architecture-details.png create mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/threadpool-components.png create mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/threadpool-group-architecture.png delete mode 100644 docs/2023/05/04/mysql-threadpool-main-solutions-details/threadpool-group.png rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{listener-flow-chart.png => threadpool-listener-flow.png} (100%) rename docs/2023/05/04/mysql-threadpool-main-solutions-details/{worker-flow-chart.png => threadpool-worker-switch-to-listener-flow.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{alisql-sysbench-point-select.png => alisql-threadpool-point-select.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{alisql-sysbench-read-write.png => alisql-threadpool-read-write.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{alisql-sysbench-update-non-index.png => alisql-threadpool-update-non-index.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{alisql-sysbench-write-only.png => alisql-threadpool-write-only.png} (100%) delete mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png delete mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-oltp-ro.png => mariadb-threadpool-oltp-ro.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-oltp-rw.png => mariadb-threadpool-oltp-rw.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-point-select.png => mariadb-threadpool-point-select.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{mariadb-threadpool-sysbench-update-nokey.png => mariadb-threadpool-update-nokey.png} (100%) delete mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/numa-architecture.png delete mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/threadpool-architecture-details.png create mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/threadpool-components.png create mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/threadpool-group-architecture.png delete mode 100644 hexo/source/_posts/mysql-threadpool-main-solutions-details/threadpool-group.png rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{listener-flow-chart.png => threadpool-listener-flow.png} (100%) rename hexo/source/_posts/mysql-threadpool-main-solutions-details/{worker-flow-chart.png => threadpool-worker-switch-to-listener-flow.png} (100%) diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-point-select.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-point-select.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-point-select.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-point-select.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-read-write.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-read-write.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-read-write.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-read-write.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-update-non-index.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-update-non-index.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-update-non-index.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-update-non-index.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-write-only.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-write-only.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-write-only.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-write-only.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png deleted file mode 100644 index cb9267884f5f77155fc3319e8acaeed272d0f3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100686 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�<`_QXjx4&6=pdQ6&A-zvr*I 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

yJWzyw2V1+SxW^ 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 H>2>2j{};cz diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png deleted file mode 100644 index a43f500e1ebf4f3ab7c8936bedcc36bfa54a04c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23330 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

- 字数统计: 13.5k(字) + 字数统计: 11.4k(字) - 阅读时长: 48(分) + 阅读时长: 41(分) @@ -381,13 +377,10 @@

本文首发于 2023-05-04 22:07:40

-

本文主要从功能层面对比 percona-server、mariadb、华为鲲鹏 BoostKit 数据库使能套件、阿里云 AliSQL、腾讯 TXSQL、MySQL 企业版线程池方案,都基于 MySQL 8.0。

-

至于源码层面,腾讯、阿里云、MySQL 企业版不开源,percona 借鉴了 mariadb 早期版本的实现,而华为鲲鹏同时借鉴了 mariadb 和 percona 的实现,但考虑到线程池代码只有 2000 行左右,相对简单,本文就不做过多阐述了。

- - -
+

本文主要从功能层面对比 percona-server、mariadb、阿里云 AliSQL、腾讯 TXSQL、MySQL 企业版线程池方案,都基于 MySQL 8.0。

+

至于源码层面,腾讯、阿里云、MySQL 企业版不开源,percona 借鉴了 mariadb 早期版本的实现,但考虑到线程池代码只有 2000 行左右,相对简单,本文就不做深入阐述。

-

版本:
MariaDB 10.9,
Percona-Server-8.0.32-24,
华为鲲鹏 8.0.25

+

版本:
MariaDB 10.9,
Percona-Server-8.0.32-24

背景

社区版的 MySQL 的连接处理方法默认是为每个连接创建一个工作线程的one-thread-per-connectionPer_thread)模式。这种模式存在如下弊端:

    @@ -408,7 +401,7 @@

    背景当连接多、并发低时,通过连接复用,避免创建大量空闲线程,减少系统资源开销。
  • 当连接多、并发高时,通过限制同时运行的线程数,将其控制在合理的范围内,可避免线程调度工作过多和大量缓存失效,减少线程池间上下文切换和热锁争用,从而对 OLTP 场景产生积极影响。
-

当连接数上升时,在线程池的帮助下数据库整体吞吐维持在一个较高水准,如图所示。

+

当连接数上升时,在线程池的帮助下,将数据库整体吞吐维持在一个较高水准,如图所示。

线程池模式下数据库整体吞吐

适用场景

线程池采用一定数量的工作线程来处理连接请求,线程池在查询相对较短且工作负载受 CPU 限制的情况下效率最高,通常比较适应于 OLTP 工作负载的场景。如果工作负载不受 CPU 限制,那么您仍然可以通过限制线程数量来为数据库内存缓冲区节省内存。

线程池的不足在于当请求偏向于慢查询时,工作线程阻塞在高时延操作上,难以快速响应新的请求,导致系统吞吐量反而相较于传统 one-thread-per-connection 模式更低。

@@ -422,10 +415,13 @@

行业方案:Percona 线程池实现

由于市面上的线程池方案大多都借鉴了 percona、mariadb 的方案,因此,首先介绍下 percona 线程池的工作机制,再说明其他方案相较于 percona 做了什么改进。

0. 基本原理

线程池的基本原理为:预先创建一定数量的工作线程(worker 线程)。在线程池监听线程(listener 线程)从现有连接中监听到新请求时,从工作线程中分配一个线程来提供服务。工作线程在服务结束之后不销毁线程(处于 idle 状态一段时间后会退出),而是保留在线程池中继续等待下一个请求来临。

下面我们将从线程池架构、新连接的创建与分配、listener 线程、worker 线程、timer 线程等几个方面来介绍 percona 线程池的实现。

@@ -433,9 +429,9 @@

线程组的数量是线程池并发的上限,通常而言线程组的数量需要配置成数据库实例的 CPU 核心数量(可通过参数thread_pool_size设置),从而充分利用 CPU。线程组之间通过线程ID % 线程组数的方式分配连接,线程组内通过竞争方式处理连接。

线程池中还有一个服务于所有线程组的timer 线程,负责周期性(检查时间间隔为threadpool_stall_limit毫秒)检查线程组是否处于阻塞状态。当检测到阻塞的线程组时,timer 线程会通过唤醒或创建新的工作线程(wake_or_create_thread 函数)来让线程组恢复工作。

创建新的工作线程不是每次都能创建成功,要根据当前的线程组中的线程数是否大于线程组中的连接数,活跃线程数是否为 0,以及上一次创建线程的时间间隔是否超过阈值(这个阈值与线程组中的线程数有关,线程组中的线程数越多,时间间隔越大)。

-

Percona 线程池架构图

+

线程池组成部分

线程组内部由多个 worker 线程、0 或 1 个动态 listener 线程、高低优先级事件队列(由网络事件 event 构成)、mutex、epollfd、统计信息等组成。如下图所示:

-

Percona 线程组构成

+

线程池组架构

worker 线程:主要作用是从队列中读取并处理事件。

  • 如果该线程所在组中没有 listener 线程,则该 worker 线程将成为 listener 线程,通过 epoll 的方式监听数据,并将监听到的 event 放到线程组中的队列。
  • @@ -445,9 +441,9 @@

    listener 线程:当高低队列为空,listen 线程会自己处理,无论这次获取到多少事务。否则 listen 线程会把请求加入到队列中,如果此时active_thread_count=0,唤醒一个工作线程

    高低优先级队列:为了提高性能,将队列分为优先队列和普通队列。这里采用引入两个新变量thread_pool_high_prio_ticketsthread_pool_high_prio_mode。由它们控制高优先级队列策略。对每个新连接分配可以进入高优先级队列的 ticket。

    2. 新连接的创建与分配

    新连接接入时,线程池按照新连接的线程 id 取模线程组个数来确定新连接归属的线程组(thd->thread_id() % group_count)。这样的分配逻辑非常简洁,但由于没有充分考虑连接的负载情况,繁忙的连接可能会恰巧被分配到相同的线程组,从而导致负载不均衡的现象,这是 percona 线程池值得被优化的点

    -

    线程池新连接的创建与分配

    +

    线程池整体架构图

    选定新连接归属的线程组后,新连接申请被作为事件放入低优先级队列中,等待线程组中 worker 线程将高优先级事件队列处理完后,就会处理低优先级队列中的请求。

    -

    3. listener 线程 【====要不要重新画图或添加 percona 源码笔记图】

    listener 线程是负责监听连接请求的线程,每个线程组都有一个listener 线程

    +

    3. listener 线程

    listener 线程是负责监听连接请求的线程,每个线程组都有一个listener 线程

    percona 线程池的 listener 采用epoll实现。当 epoll 监听到请求事件时,listener 会根据请求事件的类型来决定将其放入哪个优先级事件队列。将事件放入高优先级队列的条件如下(见函数connection_is_high_prio),只需要满足其一即可

    • 当前线程池的工作模式为高优先级模式,在此模式下只启用高优先级队列。(mode == TP_HIGH_PRIO_MODE_STATEMENTS
    • @@ -468,11 +464,11 @@

      +

      listener 线程流程图

      上图来源于腾讯数据库技术公众号

      -

      4. worker 线程 【====要不要重新画图或添加 percona 源码笔记图】

      worker 线程是线程池中真正干活的线程,正常情况下,每个线程组都会有一个活跃的 worker 线程。

      +

      4. worker 线程

      worker 线程是线程池中真正干活的线程,正常情况下,每个线程组都会有一个活跃的 worker 线程。

      worker 在理想状态下,可以高效运转并且快速处理完高低优先级队列中的事件。但是在实际场景中,worker 经常会遭遇 IO、锁等等待情况而难以高效完成任务,此时任凭 worker 线程等待将使得在队列中的事件迟迟得不到处理,甚至可能出现长时间没有 listener 线程监听新请求的情况。为此,每当 worker 遭遇 IO、锁等等待情况,如果此时线程组中没有 listener 线程或者高低优先级事件队列非空,并且没有过多活跃 worker,则会尝试唤醒或者创建一个 worker。

      为了避免短时间内创建大量 worker,带来系统吞吐波动,线程池创建 worker 线程时有一个控制单位时间创建 worker 线程上限的逻辑,线程组内连接数越多则创建下一个线程需要等待的时间越长。

      线程组活跃 worker 线程数量大于等于too_many_active_threads+1时,认为线程组的活跃 worker 数量过多。此时需要对 worker 数量进行适当收敛,首先判断当前线程组是否有 listener 线程:

      @@ -481,19 +477,18 @@

      -

      【尝试获取一个未进入队列的事件】描述错误,此处需要改为【尝试从队列获取事件】。

      +

      worker线程与listener线程的切换

      上图来自于腾讯数据库技术公众号

      -

      5. timer 线程 【====要不要重新画图或添加 percona 源码笔记图】

      timer 线程每隔threadpool_stall_limit时间进行一次所有线程组的扫描(check_stall)。

      +

      5. timer 线程

      timer 线程每隔threadpool_stall_limit时间进行一次所有线程组的扫描(check_stall)。

      当线程组高低优先级队列中存在事件,并且自上次检查至今没有新的事件被 worker 消费,则认为线程组处于停滞状态。

      • 停滞的主要原因可能是长时间执行的非阻塞请求, 也可能发生于线程正在等待但 wait_begin/wait_end (尝试唤醒或创建新的 worker 线程)被上层函数忘记调用的场景。
      • timer 线程会通过唤醒或创建新的 worker 线程来让停滞的线程组恢复工作。

      timer 线程为了尽量减少对正常工作的线程组的影响,在check_stall时采用的是try_lock的方式,如果加不上锁则认为线程组运转良好,不再去打扰。

      -

      timer 线程除上述工作外,还负责终止空闲时间超过wait_timeout秒的客户端

      +

      timer 线程除上述工作外,还负责终止空闲时间超过wait_timeout秒的客户端。

      下面是 Percona 的实现:

      check_stall 函数:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      check_stall
      |-- if (!thread_group->listener && !thread_group->io_event_count) {
      |-- wake_or_create_thread(thread_group); // 重点函数
      |-- }
      |-- thread_group->io_event_count = 0; // 表示自上次 check 之后,当前线程组新获取的 event 数
      |-- if (!thread_group->queue_event_count && !queues_are_empty(*thread_group)) { // 重点函数
      |-- thread_group->stalled = true;
      |-- wake_or_create_thread(thread_group); // 重点函数
      |-- }
      |-- thread_group->queue_event_count = 0;

      static bool queues_are_empty(const thread_group_t &tg) noexcept {
      return (tg.high_prio_queue.is_empty() && // 重点函数
      (tg.queue.is_empty() || too_many_busy_threads(tg))); // 重点函数
      }
      @@ -538,91 +533,9 @@

    • MariaDB (比如 10.9 版本)在 information_schema 中新增了四张表(THREAD_POOL_GROUPSTHREAD_POOL_QUEUESTHREAD_POOL_STATSTHREAD_POOL_WAITS),便于监控线程池状态。
    -

    华为鲲鹏 vs Percona

    概述

    核心功能与 percona 线程池方案相同,优先级调度算法 及 避免低优先级队列语句饿死的策略 也相同,但额外做了一些改进:

    -
      -
    • 借鉴了 MariaDB 的实现,添加了参数 thread_pool_dedicated_listener ,即支持固定 listener 功能。
    • -
    • 添加参数 thread_pool_toobusy :表示线程组是否过于忙碌的线程数阈值。当线程组中活跃的工作线程数+锁或 IO 等待中的工作线程数>该阈值加 1 时,认为线程组过于忙碌,不再处理低优先级的任务,等待当前执行的任务和高优先级队列中的任务被处理,直到线程组回到非忙碌的状态。
    • -
    • 借鉴了 MariaDB 的实现,在 information_schema 中新增了四张表(THREAD_POOL_GROUPSTHREAD_POOL_QUEUESTHREAD_POOL_STATSTHREAD_POOL_WAITS),便于监控线程池状态。
    • -
    • 还有一些优化点:
        -
      • 支持 NUMA 亲和:同一线程组的工作线程分配到同一 NUMA Node。
      • -
      • 高优先级 session 独占 worker 线程:在连接数很大,高负载时,对于一些事务取得了锁等资源时,可优先处理(详见下文)。
      • -
      • listener 线程调用 io_poll_wait 监听 event 时,percona 最少获取 1 个 event 就处理,华为鲲鹏改为了最少获取 2 个 event 才处理。
      • -
      • listener 线程调用 io_poll_wait 后,只要线程组不繁忙,则按需批量唤醒或创建一批 worker 线程(根据本次获得的 event 数量、活跃线程数来决定 worker 数量)。
      • -
      -
    • -
    -

    简单来说,华为鲲鹏的线程池方案 = Percona + MariaDB + NUMA 亲和 + 插件化

    -
    -

    详细说明见官方手册(参考链接 [5.a])。

    -
    -

    接下来重点介绍下华为鲲鹏独有的优化(Percona 和 MariaDB 没有实现)。

    -

    NUMA

    依赖:

    -
    1
    2
    3
    4
    # Ubuntu
    sudo apt install libnuma-dev
    # CentOS
    sudo apt install numactl-devel
    - -

    参数说明:thread_pool_sched_affinity

    -

    是否支持命令行:是

    -

    是否支持配置文件:是

    -

    是否支持动态修改:是

    -

    参数范围:Global

    -

    参数类型:Bool

    -

    默认值:OFF

    -

    允许值:OFF、ON

    -

    线程池插件默认关闭线程组与 numa 亲和。

    -

    本配置功能使用的限制条件为 mysqld 进程可使用整机所有 numa,未使用 numactl 等方式限制 mysqld 进程的可使用 cpu 范围。

    -

    本配置功能开启时,thread_pool_size 配置的数量的线程组将与服务器上的 numa 轮询亲和,即例如整机 numa 数为a,numa 编号为0 ~ a-1,则第 n 个线程组将会与第n%a(n 对 a 的余数)个 numa 进行绑定。与 numa 亲和的线程组上创建的线程都会与该 numa 亲和。通过线程与 numa 亲和,使数据与 session 关联性大的类型的业务的跨 numa 内存访问概率降低,从而提升性能

    -

    NUMA 架构图

    -

    优先 session 独占 worker 线程

    在连接数很大,高负载时,对于一些事务取得了锁等资源时,可优先处理

    -

    原先的处理逻辑(percona/mariadb 也是)是此类连接发生可读事件后,会被线程组加到优先队列中,等待空闲 worker 线程优先处理。

    -

    进一步优化逻辑,需要优先处理的 session 不将当前 worker 还给线程池,继续独占当前 worker 线程,类似每线程每连接的模式,独占 worker 线程专用于处理该优先连接之后的所有语句,直到该连接释放了优先资源转为普通连接,例如该连接事务执行结束释放锁资源。

    -

    优先 session 连接的判断逻辑如下图。

    -

    华为鲲鹏线程池 worker 线程流程图

    -

    以下描述序号对应上图的数字标记点。

    -
      -
    1. 新连接建立时,worker 线程处理器登录校验的逻辑,连接生命周期开始。
    2. -
    3. 新连接登录校验完成后进入是否高优先级 session 的判断。
    4. -
    5. 如果是 Admin 端口上的管理连接,则会一直独占 worker 线程,避免进入等待队列得不到 worker 线程的处理。
    6. -
    7. 如果 session 经过判断后为高优先级的 session,将继续占用当前 worker 线程,进入 [6] 等待下一条 SQL 语句并执行。
    8. -
    9. 如果 session 经过判断后为普通 session,则会将当前 session 的连接标识加入到当前线程组的 epoll_wait 中,当前 worker 线程将状态置为空闲并归还本线程组。
    10. -
    11. epoll_wait 中触发网络可读事件(有 SQL 语句到达)或 worker 独占的 session,将在 worker 线程等待 SQL 语句的到达。
    12. -
    13. worker 线程中等待接收 SQL 语句并执行完成后,若执行结果正常且非结束连接,将进入 [3] 进行 session 优先级判断。
    14. -
    15. 登录校验失败,连接生命周期结束。
    16. -
    17. 等待接收 SQL 语句或执行 SQL 语句出现异常,或 session 结束退出时,连接生命周期结束。
    18. -
    -

    小线程组数模式配置

    相对于默认模式的线程池参数配置,使用小线程组数模式的线程池参数配置时,每个线程组上可以创建更多的 active 线程数,使长查询的连接绑定到某个线程组时,该长查询的连接对该线程组的时延影响可以更小或无明显时延差异

    -

    同时使用小线程组数模式时,对于部分场景(例如 OLTP writeonly)在连接数非常大(例如 8192 个连接)时,仍然可以保持 90%左右的曲线峰值。

    -

    小线程组数模式相对于默认模式(使用默认参数),就是参数配置的优化使用,在高并发连接数时,可以更好保持峰值性能的配置模式,相关配置说明如下表:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    参数名称默认模式配置小线程组数模式
    thread_pool_size默认为 CPU 逻辑核数,或手动配置为 1-3 倍 CPU 逻辑核数配置为 4 倍 NUMA 数(TPCH 场景测试经验值)
    thread_pool_dedicated_listener默认为 OFF,listener 线程可转为 worker 线程配置为 ON,listener 线程只负责网络事件等待,不转为 worker 线程
    thread_pool_oversubscribe默认为 3配置该值=基线版本最优性能时的连接数/thread_pool_size 的配置值
    thread_pool_toobusy默认为 13配置该值=thread_pool_oversubscribe

    AliSQL vs Percona

    AliSQL 线程池也一定程度借鉴了 Percona 的机制,但也有自己的特色:

      -
    • AliSQL 线程池给予管理类的 SQL 语句更高的优先级,保证这些语句优先执行。这样在系统负载很高时,新建连接、管理、监控等操作也能够稳定执行。
    • +
    • AliSQL 线程池给予管理类的 SQL 语句更高的优先级,保证这些语句优先执行。这样在系统负载很高时,新建连接、管理、监控等操作也能够稳定执行
    • AliSQL 线程池给予复杂查询 SQL 语句相对较低的优先级,并且有最大并发数的限制。这样可以避免过多的复杂 SQL 语句将系统资源耗尽,导致整个数据库服务不可用
    • AliSQL 支持动态开关线程池
    • 从官网手册及内核月报公开资料,无法获知 AliSQL 是否支持线程组专职 listener 。
    • @@ -689,9 +602,12 @@

      在支持thread_handlingPer_thread 和 Thread_pool 模式中来回切换后,我们需要考虑的问题主要有以下几个:

      1.1. 活跃用户连接的 thread_handling 切换

      Per_thread 模式下,每个用户连接对应一个handle_connection线程,handle_connection线程既负责用户网络请求的监听,又负责请求的处理。

      Thread_pool 模式下,每个 thread_group 都用epoll来管理其中所有用户连接的网络事件,监听到的事件放入事件队列中,交予 worker 处理。

      -

      不论是哪种模式,在处理请求的过程中(do_command)切换都不是一个好选择,而在完成一次 command 之后,尚未接到下一次请求之前是一个较合适的切换点。

      +

      不论是哪种模式,在处理请求的过程中(do_command)切换都不是一个好选择,而在完成一次 command 之后,尚未接到下一次请求之前是一个较合适的切换点。

        -
      • 为实现用户连接从 Per_thread 到 Thread_pool 的切换,需要在请求处理完(do_command)之后判断thread_handling是否发生了变化。
        如需切换则立刻按照 2.2 中介绍的逻辑,通过thread_id % group_size选定目标 thread_group,将当前用户连接迁移至 Thread_pool 的目标 thread_group 中,后续该用户连接的所有网络事件统一交予 thread_group 的 epoll 监听。在完成连接迁移之后,handle_connection 线程即可完成退出或者缓存至下一次 Per_thread 模式处理新连接时复用(此为原生 mysql 支持的逻辑,目的是避免 Per_thread 模式下频繁地创建和销毁 handle_connection 线程)。
      • +
      • 为实现用户连接从 Per_thread 到 Thread_pool 的切换,需要在请求处理完(do_command)之后判断thread_handling是否发生了变化。
        如需切换则立刻按照 2.2 中介绍的逻辑,通过thread_id % group_size选定目标 thread_group,将当前用户连接迁移至 Thread_pool 的目标 thread_group 中,后续该用户连接的所有网络事件统一交予 thread_group 的 epoll 监听。在完成连接迁移之后,handle_connection 线程即可完成退出或者缓存至下一次 Per_thread 模式处理新连接时复用(此为原生 mysql 支持的逻辑,目的是避免 Per_thread 模式下频繁地创建和销毁 handle_connection 线程)。
          +
        • handle_connection 函数被 Per_thread_connection_handler::add_connection 函数调用。
        • +
        +
      • 为实现用户连接从 Thread_pool 到 Per_thread 的切换,需要在请求处理完(threadpool_process_request)后,将用户线程网络句柄重新挂载到 epollstart_io)之前判断 thread_handling 是否发生了变化。如需切换则先将网络句柄从 epoll 中移除以及将连接的信息从对应 thread_group 中清除。由于 Per_thread 模式下每个连接对应一个 handle_connection 线程,还需为当前用户连接创建一个 handle_connection 线程,后续当前用户连接的网络监听和请求处理都交予该 handle_connection 线程处理。

      1.2. 新连接的处理

      由于 thread_handling 可能随时动态变化,为了使得新连接能被新 thread_handling 处理,需要在新连接处理接口Connection_handler_manager::process_new_connection中,读取最新的 thread_handling,利用其相应的连接管理方法添加新连接

      @@ -707,7 +623,7 @@

      group_efficiency表示一定的时间周期内,线程组处理完的 event 总数占(工作队列存量 event 数+新增 event 数)的比例。此信息策略的优势在于能够直观反映出线程组一定时间周期内的工作效率,不足在于对于运转良好的线程组也可能存在误判:当时间周期选择不合适时,运转良好的线程组可能存在时而 group_efficiency 小于 1,时而大于 1 的情况。
      上述三种信息策略只是举例说明,还有更多信息策略可以被采用,就不再一一罗列。

      2 .2. 负载均衡的实现介绍

      在明确了度量线程组负载的方法之后,我们接下来讨论如何均衡负载。我们需要考虑的问题主要如下:

      1) 负载均衡算法的触发条件

      -

      负载均衡操作会将用户连接从一个线程组迁移至另一个线程组,在非必要情况下触发用户连接的迁移反而会导致用户连接的性能抖动。为尽可能避免负载均衡算法错误触发,我们需要为触发负载均衡算法设定一个负载阈值 M,以及负载比例 N。只有线程组的负载阈值大于 M,并且其与参与均衡负载的线程组的负载比例大于 N 时,才需要启动负载均衡算法平衡负载

      +

      负载均衡操作会将用户连接从一个线程组迁移至另一个线程组,在非必要情况下触发用户连接的迁移反而会导致用户连接的性能抖动。为尽可能避免负载均衡算法错误触发,我们需要为触发负载均衡算法设定一个负载阈值 M,以及负载比例 N。只有线程组的负载阈值大于 M,并且其与参与均衡负载的线程组的负载比例大于 N 时,才需要启动负载均衡算法平衡负载

      2) 负载均衡的参数对象

      Q:当线程组触发了负载均衡算法后,该由哪些线程组参与平衡高负载线程组的负载呢?

      很容易想到的一个方案是我们维护全局的线程组负载动态序列,让负载最轻的线程组负责分担负载。但是遗憾的是为了维护全局线程组负载动态序列,线程组每处理完一次任务都可能需要更新自身的状态,并在全局锁的保护下更新其在全局负载序列中的位置,如此一来对性能的影响势必较大,因此全局线程组负载动态序列的方案并不理想

      @@ -731,7 +647,7 @@

      3. 线程池断连优化

      3.1. percona 线程池问题

      如前文所述,线程池采用 epoll 来处理网络事件。当 epoll 监听到网络事件时,listener 会将网络事件放入事件队列或自己处理,此时相应用户连接不会被 epoll 监听。percona 线程池需要等到请求处理结束之后才会使用 epoll 重新监听用户连接的新网络事件。percona 线程池这样的设计通常不会带来问题,因为用户连接在请求未被处理时,也不会有发送新请求的需求。但特殊情况下,如果用户连接在重新被 epoll 监听前自行退出了,此时用户连接发出的断连信号无法被 epoll 捕捉,因此在 mysql 服务器端无法及时退出该用户连接。这样带来的影响主要有两点:

      +

      3. 线程池断连优化

      3.1. percona 线程池问题

      如前文所述,线程池采用 epoll 来处理网络事件。当 epoll 监听到网络事件时,listener 会将网络事件放入事件队列或自己处理,此时相应用户连接不会被 epoll 监听。percona 线程池需要等到请求处理结束之后才会使用 epoll 重新监听用户连接的新网络事件。percona 线程池这样的设计通常不会带来问题,因为用户连接在请求未被处理时,也不会有发送新请求的需求。但特殊情况下,如果用户连接在重新被 epoll 监听前自行退出了,此时用户连接发出的断连信号无法被 epoll 捕捉,因此在 mysql 服务器端无法及时退出该用户连接。这样带来的影响主要有两点:

      1. 用户连接客户端虽已退出,但 mysql 服务器端却仍在运行该连接,继续消耗 CPU、内存资源,甚至可能继续持有锁,只有等到连接超时才能退出;
      2. 由于用户连接在 mysql 服务器端未及时退出,连接数也并未清理,如果用户业务连接数较多,可能导致用户新连接数触达最大连接数上限,用户无法连接数据库,严重影响业务。
      3. @@ -741,8 +657,8 @@

        4. 新增用于监控的状态变量

        • 新增指令 show threadpool status ,可展示 25 个线程池状态变量。
        • @@ -753,12 +669,11 @@

          性能结果

          由于腾讯 TXSQL、Percona 官方手册都没有性能数据,因此仅列出其他几种方案的性能结果。

          -

          华为鲲鹏

          华为鲲鹏线程池性能测试

          MariaDB 5.5 - 无优先级队列

          本小节内容来源于官网手册

          MariaDB 官网是基于 5.5 版本线程池测试的,也就是不支持高低优先级队列的版本。

          -

          采用 Sysbench 0.4,以 pitbull (Linux, 24 cores) 的情况来说明在不同场景下的 QPS 情况。

          +

          采用 Sysbench 0.4,以pitbull (Linux, 24 cores) 的情况来说明在不同场景下的 QPS 情况。

          OLTP_RO

          @@ -799,7 +714,7 @@

          OLTP_

          4456
          -

          MariaDB Sysbench oltp_ro 性能

          +

          MariaDB OLTP_RO

          OLTP_RW

          @@ -840,7 +755,7 @@

          OLTP_

          484
          -

          MariaDB Sysbench oltp_rw 性能

          +

          MariaDB OLTP_RW

          POINT_SELECT

          @@ -881,7 +796,7 @@

          +

          MariaDB POINT_SELECT

          UPDATE_NOKEY

          @@ -922,12 +837,12 @@

          +

          MariaDB UPDATE_NOKEY

          AliSQL

          如下是开启线程池和不开启线程池的性能对比。从测试结果可以看出线程池在高并发的情况下有着明显的性能优势。

          -

          update_non_index

          AliSQL update_non_index 性能

          -

          write_only

          AliSQL write_only 性能

          -

          read_write

          AliSQL read_write 性能

          -

          point_select

          AliSQL point_select 性能

          +

          update_non_index

          AliSQL update_non_index

          +

          write_only

          AliSQL write_only

          +

          read_write

          AliSQL read_write

          +

          point_select

          AliSQL point_select

          总结

          功能区别

          @@ -935,7 +850,6 @@

          总结MySQL 企业版

          - @@ -945,9 +859,8 @@

          总结插件

          - - + @@ -955,7 +868,6 @@

          总结5.5 版本引入,10.2 版本完善

          - @@ -963,7 +875,6 @@

          总结

          - @@ -972,7 +883,6 @@

          总结插件式,不支持

          - @@ -982,7 +892,6 @@

          总结设定高低优先级,且低优先级事件等待一段时间可升为高优先级队列

          - @@ -990,7 +899,6 @@

          总结不支持

          - @@ -999,7 +907,6 @@

          总结-

          - @@ -1008,7 +915,6 @@

          总结-

          - @@ -1017,7 +923,6 @@

          总结-

          - @@ -1026,7 +931,6 @@

          总结Windows/Unix

          - @@ -1035,7 +939,6 @@

          总结

          MySQL 8.0.14 以前的版本使用 extra_port 功能(percona & mariadb),8.0.14 及之后版本官方支持了 admin_port 功能。

          -

          由上表可见,华为鲲鹏社区的线程池方案相对较全,腾讯 TXSQL 的优化点也有较大参考价值

          参数区别

          由于业内线程池方案基本都会参考 MariaDB 或 Percona,因此,以 Percona 和 MariaDB 的参数为准,基于 MySQL 8.0,总结其他方案是否有相同或类似参数。

          注意:MySQL 企业版核心方案与 MariaDB 类似,且关于差异点,官方描述较少,因此,不做对比。

          @@ -1046,126 +949,96 @@

          监控区别

          Percona、MariaDB:

          只有两个状态变量:

          @@ -1182,15 +1054,6 @@

          华为鲲鹏

            -
          • information_schema 中增加四张状态信息表
              -
            • THREAD_POOL_GROUPS查询线程组相关信息。
            • -
            • THREAD_POOL_QUEUES查询线程组队列中连接的信息。
            • -
            • THREAD_POOL_STATS查询线程组状态信息的统计值,比如线程组由于 check_stall 创建的线程数、由 listener 线程 poll 到的任务数等。
            • -
            • THREAD_POOL_WAITS提供线程组的 worker 线程在执行 SQL 语句时,各类等待原因的统计数据。 等待原因有:UNKNOWN、SLEEP、DISKIO、ROW_LOCK、GLOBAL_LOCK、META_DATA_LOCK、TABLE_LOCK、USER_LOCK、BINLOG、GROUP_COMMIT、SYNC、NET。
            • -
            -
          • -

          阿里云 AliSQL

          新增了一些状态变量:

          MariaDB Percona华为鲲鹏 腾讯 TXSQL 阿里云 AliSQL
          非插件 非插件插件 非插件-据传是插件方式
          版本5.5-5.7/8.0 5.7/8.05.7/8.0 5.6/5.7/8.0
          不支持 不支持插件式,不支持 支持 支持
          设定高低优先级,且限制每个连接在高优先级队列中的票数 设定高低优先级,且限制每个连接在高优先级队列中的票数设定高低优先级,且限制每个连接在高优先级队列中的票数 控制事务、非事务语句的比例
          不支持 不支持不支持 支持 -
          不支持 不支持不支持 支持 -
          2 个状态变量 2 个状态变量4 张状态信息表 27 个状态变量 8 个状态变量
          - MariaDBPercona + MariaDB 10.2 及之后版本 Percona MariaDB 5.5
          Windows/Unix/MacOS Windows/UnixUnix - -
          @@ -1367,51 +1230,11 @@

          MySQL · 最佳实践 · MySQL 多队列线程池优化 (taobao.org) -
        • 华为鲲鹏:
            -
          1. MySQL 8.0.25-MySQL 线程池特性-鲲鹏 BoostKit 数据库使能套件-文档首页-鲲鹏社区 (hikunpeng.com)
          2. -
          -
        • MySQL 企业版:
          1. MySQL :: MySQL 8.0 Reference Manual :: 5.6.3 MySQL Enterprise Thread Pool
        • -
          -

          欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

          -欢迎关注公众号数据库内核 - -

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          标题网址
          GitHubhttps://dbkernel.github.io
          知乎https://www.zhihu.com/people/dbkernel/posts
          思否(SegmentFault)https://segmentfault.com/u/dbkernel
          掘金https://juejin.im/user/5e9d3ed251882538083fed1f/posts
          CSDNhttps://blog.csdn.net/dbkernel
          博客园(cnblogs)https://www.cnblogs.com/dbkernel
          @@ -1423,7 +1246,7 @@

          业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版

          文章作者:DBKernel

          发布时间:2023-05-04, 22:07:40

          -

          最后更新:2023-05-08, 16:55:04

          +

          最后更新:2023-10-27, 18:00:55

          原始链接:http://dbkernel.github.io/2023/05/04/mysql-threadpool-main-solutions-details/ @@ -1459,7 +1282,7 @@

          文章目录 -
          1. 1. 背景
          2. 2. 适用场景
          3. 3. 行业方案:Percona 线程池实现
            1. 3.1. 0. 基本原理
            2. 3.2. 1. 线程池的架构
            3. 3.3. 2. 新连接的创建与分配
            4. 3.4. 3. listener 线程 【====要不要重新画图或添加 percona 源码笔记图】
            5. 3.5. 4. worker 线程 【====要不要重新画图或添加 percona 源码笔记图】
            6. 3.6. 5. timer 线程 【====要不要重新画图或添加 percona 源码笔记图】
          4. 4. 行业主流方案对比
            1. 4.1. MySQL 企业版 vs MariaDB
            2. 4.2. MariaDB vs Percona
            3. 4.3. 华为鲲鹏 vs Percona
              1. 4.3.1. 概述
              2. 4.3.2. NUMA
              3. 4.3.3. 优先 session 独占 worker 线程
              4. 4.3.4. 小线程组数模式配置
            4. 4.4. AliSQL vs Percona
            5. 4.5. TXSQL vs Percona
              1. 4.5.1. 1. 支持线程池动态切换
                1. 4.5.1.1. 1.1. 活跃用户连接的 thread_handling 切换
                2. 4.5.1.2. 1.2. 新连接的处理
                3. 4.5.1.3. 1.3. thread_handling 切换的快速生效
              2. 4.5.2. 2. 线程池负载均衡优化
                1. 4.5.2.1. 2.1. 负载的度量
                2. 4.5.2.2. 2 .2. 负载均衡的实现介绍
              3. 4.5.3. 3. 线程池断连优化
                1. 4.5.3.1. 3.1. percona 线程池问题
                2. 4.5.3.2. 3.2. 断连优化的实现介绍
              4. 4.5.4. 4. 新增用于监控的状态变量
          5. 5. 性能结果
            1. 5.1. 华为鲲鹏
            2. 5.2. MariaDB 5.5 - 无优先级队列
              1. 5.2.1. OLTP_RO
              2. 5.2.2. OLTP_RW
              3. 5.2.3. POINT_SELECT
              4. 5.2.4. UPDATE_NOKEY
            3. 5.3. AliSQL
              1. 5.3.1. update_non_index
              2. 5.3.2. write_only
              3. 5.3.3. read_write
              4. 5.3.4. point_select
          6. 6. 总结
            1. 6.1. 功能区别
            2. 6.2. 参数区别
            3. 6.3. 监控区别
              1. 6.3.1. Percona、MariaDB:
              2. 6.3.2. 华为鲲鹏:
              3. 6.3.3. 阿里云 AliSQL:
              4. 6.3.4. 腾讯云 TXSQL:
          7. 7. 参考链接
          +
          1. 1. 背景
          2. 2. 适用场景
          3. 3. 行业方案:Percona 线程池实现
            1. 3.1. 0. 基本原理
            2. 3.2. 1. 线程池的架构
            3. 3.3. 2. 新连接的创建与分配
            4. 3.4. 3. listener 线程
            5. 3.5. 4. worker 线程
            6. 3.6. 5. timer 线程
          4. 4. 行业主流方案对比
            1. 4.1. MySQL 企业版 vs MariaDB
            2. 4.2. MariaDB vs Percona
            3. 4.3. AliSQL vs Percona
            4. 4.4. TXSQL vs Percona
              1. 4.4.1. 1. 支持线程池动态切换
                1. 4.4.1.1. 1.1. 活跃用户连接的 thread_handling 切换
                2. 4.4.1.2. 1.2. 新连接的处理
                3. 4.4.1.3. 1.3. thread_handling 切换的快速生效
              2. 4.4.2. 2. 线程池负载均衡优化
                1. 4.4.2.1. 2.1. 负载的度量
                2. 4.4.2.2. 2 .2. 负载均衡的实现介绍
              3. 4.4.3. 3. 线程池断连优化
                1. 4.4.3.1. 3.1. percona 线程池问题
                2. 4.4.3.2. 3.2. 断连优化的实现介绍
              4. 4.4.4. 4. 新增用于监控的状态变量
          5. 5. 性能结果
            1. 5.1. MariaDB 5.5 - 无优先级队列
              1. 5.1.1. OLTP_RO
              2. 5.1.2. OLTP_RW
              3. 5.1.3. POINT_SELECT
              4. 5.1.4. UPDATE_NOKEY
            2. 5.2. AliSQL
              1. 5.2.1. update_non_index
              2. 5.2.2. write_only
              3. 5.2.3. read_write
              4. 5.2.4. point_select
          6. 6. 总结
            1. 6.1. 功能区别
            2. 6.2. 参数区别
            3. 6.3. 监控区别
              1. 6.3.1. Percona、MariaDB:
              2. 6.3.2. 阿里云 AliSQL:
              3. 6.3.3. 腾讯云 TXSQL:
          7. 7. 参考链接

cVw3WrceX2IV-wvn;{U5djQ4ev) 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 diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html b/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html index c7989b27..97ca94a9 100644 --- a/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html +++ b/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html @@ -15,35 +15,31 @@ - + - + + + - - - - - - - - - - - - - - - - + + + + + + + + + + - + @@ -361,12 +357,12 @@