返回顶部
首页 > 资讯 > 数据库 >解密TaurusDB存储端高并发之线程池
  • 917
分享到

解密TaurusDB存储端高并发之线程池

解密TaurusDB存储端高并发之线程池 2020-11-07 15:11:28 917人浏览 绘本
摘要

图1 TaurusDB整体架构 图2 slice功能组件 从图2可知,TaurusDB的存储层,不单单只做存储相关的工作,也需要大量的算力,比如consolidation生成特定数据页、compation回收旧版本数据、Buff

解密TaurusDB存储端高并发之线程池

图1 TaurusDB整体架构

图2 slice功能组件

从图2可知,TaurusDB的存储层,不单单只做存储相关的工作,也需要大量的算力,比如consolidation生成特定数据页、compation回收旧版本数据、BufferPool缓存热点数据页等任务。为了能加快这些任务的高效执行,我们首先能想到的就是能够并行执行这些任务,也就是采用多线程技术处理的方式,增加处理器单元的吞吐能力,从而提高存储端的执行效率。

2.线程池化设计思想

2.1线程为什么需要池化

首先,线程是稀缺的资源,如果频繁创建和销毁线程的开销是可观的,所占用的时间可能多于实际任务的执行;且当需要执行任务时,都去创建一个对应的线程去处理,那么服务器的资源(比如地址空间和内核参数)很快就会被耗尽,导致而导致OOM问题。

其次,通过事先创建好一定数量的线程并置于公共池之中,这样当有任务需要执行时,只需从公共池取一个线程执行当前的任务即可,待任务结束后,此线程又可以执行其他任务或处于休眠状态,等待下一次被调度,达到线程资源重复使用的目的。

2.2线程池如何管理

为了能有效的管理多线程,TaurusDB存储端采用了如图3的线程池模型。

图3 线程池模型

ThreadPool: 主要负责控制线程池的大小、状态变更、线程的创建、销毁、调度策略的选取;

Scheduler:负责具体任务的接收、被调度的顺序,并触发任务的执行;

Worker:负责具体任务的执行;

Monitor:负责监控线程执行任务时是否出现异常,以及异常告警,比如线程执行一次任务长时间执行未能结束。

2.3 线程池的调度策略

当前TaurusDB存储端线程池支持三种策略:先进先出调度(FifoScheduler)、定时调度(TimeScheduler)、基于容量调度(CapacityScheduler)。

对于FifoScheduler和TimeScheduler,比较容易理解。当有任务需要执行时,只需将此任务存放在一个队列即可,有scheduler按照顺序逐一调度即可。

对于CapacityScheduler,是一种基于事先为某一类型的任务预留可执行线程的思想,其预留的线程个数由下发任务的用户指定。具体调度过程见图4。

图4 CapacityScheduler调度

比如:

初始化线程大小为10,TaskType1预留线程数4,TaskType2:预留线程数5,TaskTypeN:预留线程数4

当线程池处于如图4状态时,任务类型是1和3的尚未达到预留值,任务类型N已达到阈值。此时如果Threadpool中处于idle的线程数为1,则该线程将会被调度到任务类型为2的队列中。

2.4 任务异常监控告警

我们知道,一旦任务被调度的线程执行过程中,可能会出现异常情况,比如线程死,导致该任务不能按照预期推进,轻者引发系统出现CPU、IO等系统资源使用率飚高的情况,严重者会导致系统down情形。比如TaurusDB的存储端,执行log的checkpoint的线程出现长时间卡顿,会导致存储端旧的log不能正常回收,导致磁盘空间逐步膨胀,进而影响存储端其他各个模块平滑的推进。如果能够识别出处于异常状态的线程,并能够进行告警,基于事先自定义规则进行修复,将能够持续保证存储端业务的连续性。

线程池Monitor组件就是用于识别处于异常状态的线程,其基本思想就是,定期巡检线程池中的各线程处于状态,如果发现线程状态长时间未更新,则判定该线程处于异常状态,上报告警,并基于相应的处理规则处理。

3. 下一步演进方向

从2.3中可以看出,CapacityScheduler策略是基于实际在执行的线程数,作为idle线程线程被调度的依据,尚未衡量实时任务的重要程度。考虑这样一种场景,如果有两种类型的任务A、B,在某一时间,用于执行A、B任务的线程数恰好线程或差值极小,但B类型任务的优先级大于A任务,这时可能出现idle线程被调度执行A类型任务,B类型任务不能分配到充足的线程数(预留值是静态分配),用于加快推进任务的处理。

考虑的方案:

1.限制类型任务类型队列的长度,这样可以均衡各类型任务的调度,不至于某一类或几类任务数过多;

2.在系统资源有限的前提下,支持动态伸缩线程池大小的功能,这样可以在工作负载过重时,扩充线程池大小,用于调度到急需执行的任务;

3.099进一步细化CapacityScheduler策略,采用任务的重要程度和实际执行的线程数的规则,作为idle线程被调度的依据。

 

点击关注,第一时间了解华为云新鲜技术~

您可能感兴趣的文档:

--结束END--

本文标题: 解密TaurusDB存储端高并发之线程池

本文链接: https://lsjlt.com/news/6940.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 解密TaurusDB存储端高并发之线程池
    图1 TaurusDB整体架构 图2 slice功能组件 从图2可知,TaurusDB的存储层,不单单只做存储相关的工作,也需要大量的算力,比如consolidation生成特定数据页、compation回收旧版本数据、Buff...
    99+
    2020-11-07
    解密TaurusDB存储端高并发之线程池
  • Python并发编程之线程池/进程池
    原文来自开源中国前言python标准库提供线程和多处理模块来编写相应的多线程/多进程代码,但当项目达到一定规模时,频繁地创建/销毁进程或线程是非常消耗资源的,此时我们必须编写自己的线程池/进程池来交换时间空间。但是从Python3.2开始,...
    99+
    2023-06-02
  • Java并发编程面试之线程池
    目录什么是线程池线程池好处线程池的执行流程怎么用线程池corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuethreadFacto...
    99+
    2024-04-02
  • java高并发之线程组详解
    目录线程组创建线程关联线程组为线程组指定父线程组根线程组批量停止线程总结线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树...
    99+
    2024-04-02
  • java高并发ThreadPoolExecutor类解析线程池执行流程
    目录摘要核心逻辑概述execute(Runnable)方法addWorker(Runnable, boolean)方法addWorkerFailed(Worker)方法拒绝策略摘要 ...
    99+
    2024-04-02
  • Java并发之怎么使用线程池
    这篇文章主要介绍“Java并发之怎么使用线程池”,在日常操作中,相信很多人在Java并发之怎么使用线程池问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发之怎么使用线程池”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • java高并发之理解进程和线程
    目录进程线程进程与线程的一个简单解释总结进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指...
    99+
    2024-04-02
  • Java并发编程之线程池的示例分析
    这篇文章将为大家详细讲解有关Java并发编程之线程池的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资...
    99+
    2023-06-20
  • 详解Java并发包中线程池ThreadPoolExecutor
    目录一、线程池简介二、ThreadPoolExecutor类2.1、ThreadPoolExecutor成员变量以含义2.2、ThreadPoolExecutor的参数以及实现原理2...
    99+
    2024-04-02
  • 【Linux网络编程】高并发服务器框架 线程池介绍+线程池封装
    目录 前言 一、线程池介绍 💻线程池基本概念 💻线程池组成部分 💻线程池工作原理  二、线程池代码封装 🌈main.cpp 🌈ThreadPool.h ...
    99+
    2023-10-20
    linux 网络 tcp/ip c++ ubuntu
  • Java并发编程:解锁存储大数据的秘密
    随着数据量的不断增大,如何高效地存储和处理大数据成为了当前各行业中的一个重要问题。而Java并发编程技术正是解决这一问题的有效方式之一。本文将介绍Java并发编程技术在存储大数据中的应用,并演示相关的代码。 一、Java并发编程技术的应用...
    99+
    2023-09-26
    并发 存储 大数据
  • Java并发线程池实例分析讲解
    目录一.为什么要用线程池二.线程池的好处三.原理解析四.4种线程池五.线程池处理流程六.源码分析一.为什么要用线程池 先来看个简单的例子 1.直接new Thread的情况: ...
    99+
    2023-02-02
    Java并发线程池 Java线程池
  • java高并发之线程的基本操作详解
    目录新建线程终止线程线程中断等待(wait)和通知(notify)挂起(suspend)和继续执行(resume)线程等待线程结束(join)和谦让(yeild)总结新建线程 新建线...
    99+
    2024-04-02
  • 浅析Tomcat使用线程池配置高并发连接
    目录Tomcat使用线程池配置高并发连接1:配置executor属性2:配置Connector一.Tomcat内存优化1.JAVA_OPTS参数说明二.Tomcat并发优化1.Tom...
    99+
    2022-11-13
    tomcat配置高并发连接 tomcat线程池 tomcat高并发配置
  • Golang WorkerPool线程池并发模式示例详解
    目录 正文处理CVS文件记录 获取测试数据线程池耗时差异 正文 Worker Pools 线程池是一种并发模式。该模式中维护了固定数量的多个工作器,这些工作器等待...
    99+
    2024-04-02
  • C++并发编程:如何利用线程局部存储?
    c++++ 中的线程局部存储 (tls) 提供了一种在多线程环境中维护每个线程私有数据的机制,确保即使多个线程同时访问该变量,它们也不会彼此干扰。通过使用 thread_local 关键...
    99+
    2024-05-06
    c++ 并发编程
  • java的多线程高并发详解
    目录1.JMM数据原子操作2.来看volatile关键字3.并发编程三大特性4.双锁判断机制创建单例模式5.synchronized关键字6.AtomicIntger原子操作7.锁优...
    99+
    2024-04-02
  • Java httpClient连接池支持多线程高并发的实现
    当采用HttpClient httpClient = HttpClients.createDefault() 实例化的时候。会导致Address already in use的异常。...
    99+
    2024-04-02
  • 理解Java多线程之并发编程
    目录1 多线程的使用场景2 多线程的缺点2.1 上下文切换的开销(1)上下文切换的开销(2)如何减少上下文切换2.2 多线程中的数据一致性问题(1)线程中访问外部数据的过程(2)线程...
    99+
    2023-02-02
    Java并发编程 java并发编程实战 java并发编程的艺术
  • 如何在Java中使用并发容器和线程池来提高程序的并发性?
    Java作为一种高级编程语言,提供了许多并发编程的工具和机制,其中包括并发容器和线程池。使用这些工具可以提高程序的并发性,从而使得程序更加高效。 一、并发容器 Java提供了许多并发容器,这些容器具有线程安全的特性,可以让多个线程同时访问容...
    99+
    2023-09-19
    并发 数组 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作