性能优化必读 | AntDB-M高性能设计之线程池协程模型

news2024/12/27 17:36:06

实际应用场景中,一个AntDB-M节点一般会处理几千个连接,平均每个CPU需处理几百个线程连接,上下文切换频繁;一个进程的线程数太多,会消耗较多的资源,使用Pstack工具检查问题也非常困难,Pstack耗时太久可能导致AntDB-M节点主备切换;对于一些WEB应用或者短连接的使用场景,连接数量能达到几十万级别。

为了提高并发处理性能,AntDB-M除了支持One-Thread-Per-Connection模型,还实现了线程池模型

图1:AntDB-M线程池模型

AntDB-M 线程池模式最佳实践

AntDB-M线程池主要有以下四个特点:

1.平滑创建线程

线程池维护一个与CPU个数相等的Thread Group数组,每个Thread Group单独处理自己的连接, 新连接上来轮询地分配给所有Thread Group,Thread Group客户端发送的请求消息放到一个消息队列。Thread Group创建的工作线程都从这个消息队列中获取任务。

初始化时,Thread Group只有一个线程,可以负责收消息和处理任务,当任务处理不过来时,就会创建一个新的线程。Thread Pool有一个定时器负责周期性检查所有Thread Group是否繁忙,决定是否创建线程,或者唤醒休眠等待任务的线程,一次只会创建/唤醒一个线程。

2.平滑销毁线程

如果有大批业务连接退出,线程池也不会立即将线程销毁,而是等待一段时间。每个线程在等待一段时间之后,如果没有任务可处理,就会退出。在这个过程中,如果有新的消息,线程就会被唤醒。当然,Thread Group会保留最少一个线程来接收新的消息。

3.尽力提高业务处理效率

如果有线程需要去等待某些事件,比如IO、锁,可以认为这个线程不会占用CPU资源,应该开启一个新的线程利用CPU处理任务。Thread Group中的消息队列默认区分高低优先级,对于那些处于事务中的连接发来的消息,放置到高优先级队列。

工作线程处理任务时,优先从高优先级队列中获取消息,然后才处理低优先级队列中的消息。为了防止低优先级队列的消息饿死*[1],线程池的定时器还会定期检查如果有长时间未处理的低优先级消息,把它们移动到高优先级队列中。

*[1]备注:是指采取措施,以确保低优先级的消息在消息队列中也能得到处理,而不会被高优先级消息永远地排挤在后面,导致它们无法被及时处理。

4.系统资源开销限制

每个Thread Group都会有活跃线程上限,整个Thread Pool会有一个总的线程上限,以防止占用资源超出限制。过多的线程并没有优势,因为CPU资源总是有限的。

线程池的缺点:

1.处理任务不够及时

线程池会周期性地检查Thread Group是否过于繁忙,导致有些任务在一段时间内没有处理,然后决定创建新的线程。这段时间的任务,都会延迟一个检查周期时间。

2.没有均衡处理

如果有些Thread Group比较繁忙,有些比较空闲,Thread Group并不会做出调整。

3.不能充分利用CPU资源

虽然线程在等待IO或者临界资源时,会创建新的线程来弥补线程等待时CPU的浪费,但是很多等待事件线程池是无法感知到的,线程池的等待感知完全依赖于代码回调。

为了应对以上问题,AntDB-M同时引入了协程模式。协程模式相对于线程池模式来说,在上下文切换时,不需要内核参与,并且可以由应用层代码自己控制切换的时机。

协程运行时,依托于线程环境,一个线程在一个时刻运行一个协程,可以管理多个协程。从运行和调度的角度考虑,协程对于线程,相当于线程与内核的关系。

  • 在协程运行时,线程将运行环境切换为协程,协程拥有CPU。

  • 当协程运行完成或者主动让出CPU,可以切换到其它协程或者原来的线程环境。

但是线程不能强制切换协程,即没有抢占式调度。这样就不会有多余的上下文切换。

1+1>2 AntDB-M 协程模式

为了同时具备线程池和协程的优点,AntDB-M在线程池基础上实现了协程模型。连接与消息收发,以及线程的创建与销毁,都保持线程池的原有逻辑。对于业务处理,改由协程环境运行。

当一个消息处理完成,或者需要等待时(例如等待行锁或者表锁时),协程会主动让出CPU。当本线程的工作队列为空时,可以去其它线程的工作队列取任务(steal_task)。

图2:AntDB-M协程模型

协程上下文创建与释放

协程上下文使用boost::coroutine接口,make_fcontext创建一个上下文,jump_fcontext执行上下文接口。下面简称boost::coroutine为fcontext。包装fcontext的对象(context_t)需要包含一些基本信息,比如栈地址,为了减少内存分配次数,直接把context_t内存与栈内存放在一起。

协程上下文的切换主要有这几种场景

1.新创建的协程上下文,处理请求,切入;

2.从其它工作线程的队列中获取任务进行处理,切入;

3.请求处理完成,切出到调用线程;

4.处理消息逻辑过程中,需要等待,比如行锁、表锁、临界资源等,需要切出;条件满足(比如其它线程释放行锁)或者等待超时,切入继续处理。

协程模型优势

AntDB-M采用M:N 的协程模型,内置steal_task调度模型来避免长尾效应。协程(用户态线程)切换相比Linux原生内核线程切换,性能提升一个数量级左右;同时steal_task可以实现CPU处理任务时每个核的负载均衡,有利于充分利用CPU资源。

因此,协程模型使得AntDB-M在模型设计上,天然具备高性能、低延迟的特性,以满足复杂的业务应用场景。

关于AntDB数据库

AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行近15年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试---等价类划分(功能测试)

能对穷举场景设计测试点-----等价类划分 等价类划分 说明:在所有测试数据中,具有某种共同特征的数据集合进行划分分类: 1)有效等价类 2)无效等价类步骤:1)明确需求 2)确定有效和无…

使用antv x6注册vue组件报错,TypeError: Object(...) is not a function (teleport.js:3:23)

typeError: Object(…) is not a function at …/…/…/node_modules/.pnpm/antvx6-vue-shape2.1.1_antvx62.15.2vue2.7.10/node_modules/antv/x6-vue-shape/es/teleport.js (teleport.js:3:23) 点击定位到报错的位置为 reactive应该是vue 2.7.*版本才有的 由于项目在index.ht…

【多线程面试题 七】、 说一说Java多线程之间的通信方式

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说Java多线程之间的…

【iOS】——知乎日报第二周总结

文章目录 一、自定义cell内容乱序问题二、WKWebView加载网页三、通过cell的协议函数进入指定网页四、滚动视图左滑加载新的网页五、隐藏导航栏 一、自定义cell内容乱序问题 当我下拉刷新的时候一开始我自定义的cell的内容顺序没有问题,当我一直下拉刷新或者上滑看以…

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档:《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分,PS即ARM,PL即FPGA,PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构,多核处理器常用的运行模式为AMP(非对称多处理)和…

leetcode-链表

链表是一个用指针串联起来的线性结构,每个结点由数据域和指针域构成,指针域存放的是指向下一个节点的指针,最后一个节点指向NULL,第一个结点称为头节点head。 常见的链表有单链表、双向链表、循环链表。双向链表就是多了一个pre指…

Flume 快速入门【概述、安装、拦截器】

文章目录 什么是 Flume?Flume 组成Flume 安装Flume 配置任务文件应用示例启动 Flume 采集任务 Flume 拦截器编写 Flume 拦截器拦截器应用 什么是 Flume? Flume 是一个开源的数据采集工具,最初由 Apache 软件基金会开发和维护。它的主要目的是…

基于STM32景区人流检测控制系统设计

**单片机设计介绍,1651【毕设课设】基于STM32景区人流检测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序文档 六、 文章目录 一 概要 基于STM32的景区人流检测控制系统设计是一种利用STM32微控制器开发的系统,用…

“赋能信创,物联未来” AntDB数据库携高可用解决方案亮相2023世界数字经济大会

10月14日,在2023世界数字经济大会暨京甬信创物联网产融对接会上,AntDB数据库技术总监北陌应邀发表《AntDB国产分布式数据库创新演进与高可用解决方案》主题演讲,就AntDB数据库助力客户数智化升级的高可用信创解决方案进行了详实、真挚地分享&…

前端实现埋点监控

前端实现埋点&监控 实现埋点功能的意义主要体现在以下几个方面: 数据采集:埋点是数据采集领域(尤其是用户行为数据采集领域)的术语,它针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。通过埋…

nginx 内存管理(二)

共享内存 共享内存结构与接口定义nginx共享内存在操作系统上的兼容性设计互斥锁锁的结构体锁的一系列操作(core/ngx_shmtx.c)创建锁 原子操作nginx的上锁操作尝试加锁获取锁释放锁强迫解锁唤醒等待进程 slab共享内存块管理nginx的slab大小规格内存池结构…

ctfshow-web入门命令执行29

29 源代码给了禁用flag 使用tac、nl ?cecho nl f*; ?cecho tac f*; 30 多禁用了system和php 和上题区别不大,使用上一题命令就能解 ?cecho nl f*; ?cecho tac f*; 31 禁用了空格使用%09代替 ?cecho%09tac%09f*; 32 禁用了echo 使用php伪协议 ?cinclud…

不做学习的奴隶,更要注重生活

下面是国外社交软件 i n s ins ins上近 40 40 40万点赞的帖子。 “睡8小时,而不是6小时。 锻炼1小时,而不是4小时。 学习3小时,而不是10小时。 读书2小时,而不是5小时。 深度工作3小时,而不是12小时。 你是人&#xff…

uniapp 模仿 Android的Menu菜单栏

下面这张图就是我们要模拟的菜单功能 一、模拟的逻辑 1. 我们使用uni-popup组件&#xff08;记得要用hbuilder X导入该组件&#xff09;uni-app官网 2. 将组件内的菜单自定义样式 二、uniapp代码 写法vue3 <template><view><uni-popup ref"showMenu"…

设计师在团队协作中的关键角色与策略

作为设计师&#xff0c;团队协作也是日常工作的一部分。在设计团队中&#xff0c;设计师如何参与团队协作&#xff1f;怎样才能更好的发挥自己的价值&#xff0c;顺利推进项目呢&#xff1f; 设计师遇到的协作难题&#xff1f; 首先我们看一下设计师在日常团队协作工作中可能…

C语言实现输入一个字符串,递归将其逆序输出

完整代码&#xff1a; // 输入一个字符串&#xff0c;递归将其逆序输出。如输入 LIGHT&#xff0c;则输出 THGIL #include<stdio.h> #include<stdlib.h> //字符串的最大长度 #define N 20//逆序输出字符串 void func(char *str){if (*str\0){//结尾时直接退出递归…

常见网络攻击及防御方法总结(XSS、SQL注入、CSRF攻击)

网络攻击无时无刻不存在&#xff0c;其中XSS攻击和SQL注入攻击是网站应用攻击的最主要的两种手段&#xff0c;全球大约70%的网站应用攻击都来自XSS攻击和SQL注入攻击。此外&#xff0c;常用的网站应用攻击还包括CSRF、Session劫持等。 1、 XSS攻击 XSS攻击即跨站点脚本攻击&am…

VBA宏查找替换目录下所有Word文档中指定字符串

原来搞质量管理&#xff0c;要替换质量文件里面所有特定名称或者某一错误时&#xff0c;需要逐一打开所有文件&#xff0c;非常麻烦&#xff0c;所以写了个VBA程序。过了这么多年&#xff0c;突然又要做同样的事情&#xff0c;发现新版本Word不支持其中的Application.FileSearc…

python自动化测试(五):按键模拟输入:全选、复制、清空、粘贴、完成

前置条件&#xff1a; 本地部署&#xff1a;ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) &#xff08;32 位&#xff09; Google驱动的selenium版本是3.11.0 目录 一、配置代码 二、键盘组合输入 2.1 全选&#xff1a;ctrl a 2.2 复制…

2023上半年系统集成项目管理工程师下午真题

文章目录 一&#xff1a;第5章 项目立项管理。第7章 项目范围管理&#xff0c;需求文件二&#xff1a;第9章 项目成本管理。第8章 项目进度管理&#xff0c;压缩工期三&#xff1a;第15章 信息&#xff08;文档&#xff09;和配置管理四&#xff1a;第18章 项目风险管理&#x…