task 多线程 并发控制_epoll高并发线程池

task 多线程 并发控制_epoll高并发线程池摘要:为了能加快相关任务的高效执行,TaurusDB采用多线程技术处理的方式,增加处理器单元的吞吐能力,从而提高存储端的执行效率。 1. TaurusDB背景 随着云计算进入2.0时代,数据急剧膨胀…

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

task 多线程 并发控制_epoll高并发线程池

图1 TaurusDB整体架构

task 多线程 并发控制_epoll高并发线程池

图2 slice功能组件

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

2.线程池化设计思想

2.1线程为什么需要池化

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

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

2.2线程池如何管理

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

task 多线程 并发控制_epoll高并发线程池

图3 线程池模型

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

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

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

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

2.3 线程池的调度策略

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

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

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

task 多线程 并发控制_epoll高并发线程池

图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线程被调度的依据。

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7617.html

(0)
上一篇 2023-03-17
下一篇 2023-03-17

相关推荐

  • Python初学者如何开始学习Python语言

    Python初学者如何开始学习Python语言随着计算机技术的发展,越来越多的人开始学习编程语言。而Python,作为一门简单易学,功能强大的编程语言,吸引了越来越多的初学者。那么,作为Python初学者,如何开始学习这门语言呢?下面,我们将从多个方面为大家详细阐述。

    2023-12-22
    113
  • 【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件

    【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件Hello 大家好,我是TANZAME,我们又见面了。今天我们来聊聊怎么手撸一个 Redis Cluster 集群客户端,纯手工有干货,您细品。 随着业务增长,线上环境的QPS暴增,自然而然

    2023-03-13
    159
  • 数据库设计的步骤_教务管理系统数据库设计

    数据库设计的步骤_教务管理系统数据库设计数据库设计的设计内容包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施和数据库的运行和维护。

    2023-05-24
    158
  • 如何从文本文件读入 SQL 参数[通俗易懂]

    如何从文本文件读入 SQL 参数[通俗易懂]有时我们希望把参数列表分行存储在文本文件里,执行SQL时再拼到in函数里,从而查询出符合条件的记录。 但SQL不能解析文本文件,直接拼到in函数里有困难,所以很多人先把文件导入数据库临时表,再用jo…

    2023-03-03
    163
  • MYSQL 游标学习及使用实例「建议收藏」

    MYSQL 游标学习及使用实例「建议收藏」who?(游标是什么?)游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果。每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言

    2022-12-25
    164
  • Python 进制转换实用指南

    Python 进制转换实用指南计算机科学中,进制转换是一项非常基础和重要的技能,也是许多高级算法和编程语言中必不可少的部分。Python 作为一种高级编程语言,提供了很多内置函数和标准库,可以很方便地进行进制转换。在本文中,我们将以 Python 为例,介绍常见的进制转换技巧。

    2024-08-01
    30
  • 基于Python实现邮件发送功能

    基于Python实现邮件发送功能在信息时代,电子邮件已成为人们日常生活、工作中不可或缺的一部分,随着网络通讯日益方便和普及,几乎每个人都有自己的邮箱。因此,邮件发送功能是我们在开发项目中经常会用到的。Python作为一款广泛应用于开发领域的编程语言,自然而然也拥有了在Python环境下实现邮件发送功能的方式和方法。

    2023-12-27
    120
  • 会导致索引失效语句「建议收藏」

    会导致索引失效语句「建议收藏」1、使用like关键字模糊查询时,% 放在前面索引不起作用,只有“%”不在第一个位置,索引才会生效(like ‘%文’–索引不起作用)2、使用联合索引时,只有查询条件中使用了这些字段中的第一个字段,索

    2022-12-26
    149

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注