zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

2023-01-13 mysql列存储引擎-聚合多线程并行扫表-多线程开启条件及工作线程数分析

mysql多线程引擎存储线程 分析 工作 开启
2023-09-27 14:25:42 时间

摘要:

使用多线程聚合, 存在额外的代价。

在数据量偏少的情况下, 额外的代价将会超过分割数据并行处理减少的代价, 导致总代价出现增高的情况。

本文分析多线程聚合的代价, 并确定开启多线程聚合的条件。

多线程聚合代价评估:

线程自身代价:

  1. 单个线程的独立栈空间:
    1. 默认为8192KB, 即8MB
    2. 当前对于线程使用并非是常规线程池, 而是随着业务创建和销毁
  2. 线程切换代价:
    1. 线程和进程在kernel层都是task, 区别在于内存可见性, 都要遵守task切换机制
    2. 导致线程切换时, PCB描述表, 栈空间, 寄存器这些除了堆空间外的整个上下文都需要切换
  3. 开辟的工作线程的数量
    1. 当前为物理cpu核数/4
      1. 开辟的线程数不能>=cpu核数, 否则将影响其他客户端的查询线程
      2. 为什么是四分之一?
        1. 原有的逻辑遗留下来的magic number
        2. TODO: 线程数是否合理?

锁导致多线程串行代价:

  1. 聚合group by的逻辑仅读取表, 此时无谓词运算, 可以理解为只读逻辑
  2. 除了全局的data_cache持有的cahe加锁外, 上层逻辑不应加锁

合并多个工作线程聚合结果的代价:

  1. 由于聚合结果现在都在内存的线性hash表, 所以合并可以理解为是一个内存拷贝的过程
  2. 导致其代价受两个因素影响:
    1. 工作线程的数量, 决