NJet 动态共享内存功能
NGINX 向云原生演进,All in OpenNJet
1. NJet共享内存简介
NJet
中共享内存通常用于存储状态数据,以便在进程之间进行共享,这些空间通常是被频繁被申请和释放的。在NJet中,通过shm_zone
结构来管理这些共享内存,每个zone
维护一个slab_pool
结构,使用slab
算法来管理zone的共享内存。
在程序启动时,要预先在配置文件中定义好每个用途的共享内存(zone)的大小,然后使用slab
算法来处理分配和释放小内存的请求。如果系统重启,master
进程会检查配置文件中是否有增加新的zone,如果有就会重新申请一个共享内存给新zone。有多条指令可以配置zone,下面是一个gossip
指令的示例。具体使用请参考使用手册。
stream { server { listen 238.255.253.254:5555 udp; gossip zone=test:1m heartbeat_timeout=20s nodeclean_timeout=30s; } }
根据上面的配置文件,master进程会为gossip分配一个大小为1M,名称为test的zone来作为共享内存使用。在实际使用时,每个slab_pool有一个shmtx
变量,用于对共享内存进行加锁和解锁操作。如果一个slab_pool中的内存已经用光,在没有释放足够的内存空间之前,后续请求内存的操作都只能失败,进而影响系统的性能。
2. 动态共享内存实现思路
要实现动态共享内存,可在系统中预先申请一个较大容量的共享内存,初始化成一个大的全局slab_pool, 后续可以从这个大slab_pool分配出多个较小的slab_pool,这样当一个zone的slab_pool内存用完之后,可向全局slab_pool申请一个新的和原来大小相同的slab_pool,并挂在zone的slab_pool队列尾部,这样就可以继续响应新的请求,提供足够的内存。
具体实现中,代码中主要修改了njt_init_cycle
函数和njt_slab
对应的文件。主要改动有
- 增加一个新指令,标记新增共享内存的大小,在重启NJet时,可以调整这个值的大小(目前只支持增大)
- 修改slab_pool的数据结构,使得slab_pool可以组成链表,并增加一个指向队列头的指针
- 修改分配与释放slab_pool内存的代码,分配和释放都使用链表头的shmtx来实现加锁、解锁,并且会遍历链表查找合适的位置,来进行申请和释放内存的操作
2.1 新增指令
增加的指令shared_slab_pool_size
, 可以指定预留的共享内存的大小。如果在reload
时修改了这个值的大小,后面给出了判断的逻辑
Syntax | shared_slab_pool_size; |
---|---|
Default | 0 |
Context | core |
2.2 目前预留内存大小的判断
启动时
- 如果
shared_slab_pool_size
未配置或配置为0,刚不分配相应的内存 - 如果
shared_slab_pool_size < 10M
,修改改为10M,分配相应的内存 - 如果
shared_slab_pool_size > 10M
,按照实际指定的大小分配相应的内存
重启时(动态共享内存只增不减)
- 如果
new_shared_slab_pool_size <= old_shared_slab_pool_size
, 保持原来的共享内存不变,并不进行缩减内存的操作。 - 如果
new_shared_slab_pool_size > old_shared_slab_pool_size
,计算差值diff_size
,如果diff_size < 10M
,diff_size = 10M
, 分配一块新的大小为diff_size
的共享内存,挂在原来的预留内存队列的尾部。
当一个zone的内存出现no memory
情况时,会从预留的共享中分配新的slab_pool
(目前只支持大小与原zone的slab_pool.size相同),挂在zone的slab_pool的队列尾部,并尝试从新的slab_pool分配内存。如果预留内存空间不够,会同之前一样返回NULL
,并在日志中增加相应记录。
3. 具体配置
# 加载其他模块 worker_processes auto; daemon off; cluster_name helper; node_name test_node1; #shared_slab_pool_size 75M; shared_slab_pool_size 5M; error_log logs/error.log info; #user root; pid /etc/njet/njet.pid; events { worker_connections 1024; }
4. 现存的问题及后续改进
目前对slab_pool
列表申请和释放内存时,使用的是队列头所在的slab_pool的锁,这样当链表比较长时,会影响性能。另外现有实现中,没有考虑释放新分配的slab_pool的操作。最后,由于NJet
中有多条命令支持使用zone
,有一些zone可能不希望zone的大小能动态增加。当前实现中还没有考虑这些需求,后续开发过程中会根据实际情况,继续对动态共享内存功能进行增强。
NJet 应用引擎通过内核重构实现了独特的运行时 动态配置加载 能力,是 新一代高性能 Web 应用引擎 。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。 官网 邮件组

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
首轮嘉宾阵容公布,GOTC 2024 即将开启!
8 月 15 日至 16 日,GOTC 2024将在上海张江科学会堂盛大开启。 GOTC 2024 与上海浦东软件园联合举办,并结合 “GOTC(全球开源技术峰会)” 与 “GOGC(全球开源极客嘉年华)”,是一场面向全球开发者的全新的开源技术盛会。期间将举行开幕式暨主论坛、高峰论坛、平行论坛、行业沙龙、青年黑客松等活动。 本次大会聚焦数据基础与GenAI开发范式、开源数据库与AI协同创新、LLMOps最佳实践、硬核AI技术创新与实践、云原生与微服务架构以及开源人才与教育等主题。 届时,100+海内外深耕开源技术的行业领袖们将到场与开发者们分享他们的创新思考与未来实践。 首轮嘉宾阵容公布! GOTC 2024 报名通道现已开启,诚邀全球各技术领域开源爱好者共襄盛举! 参会报名,请访问:https://www.huodongxing.com/event/8762568606000?td=6895280870225 GOTC 2024 将于 8 月 15 日在上海张江科学会堂盛大开启,为期两天。GOTC 2024 与上海浦东软件园联合举办,并结合 “GOTC(全球开源技术峰会)” 与 “G...
- 下一篇
蚂蚁 CodeFuse 下一步,探索智能问答,图生代码等场景
7 月 27 日,第 105 期 OSC 源创会即将在杭州举办,本次沙龙以【AI编程革新研发效能】为主题,将深入探讨 AI 编程助手背后的技术架构、在开发者群体中的使用情况、以及它们在当前市场中的应用,并探讨未来它们对软件开发领域的影响和改变。 在活动正式开始前,我们邀请到本次活动的讲师之一,蚂蚁 CodeFuse IDE 插件技术负责人肖斌,提前为各位开发er 们路透下蚂蚁 CodeFuse 相关信息,对 CodeFuse 和 AI 编程感兴趣的小伙伴们可以点击链接,报名参与活动: https://www.oschina.net/event/2332361 演讲嘉宾:肖斌,蚂蚁 CodeFuse IDE 插件技术负责人 演讲议题:蚂蚁代码大模型落地实践 议题简介:本次演讲从提升研发效能的场景出发,介绍基于大模型的蚂蚁智能研发体系,阐述相关的技术方案和选型,以及在大模型落地上工程领域上的实践及对应结果。 OSCHINA:您是在什么时候加入团队的?为什么看好这个方向? 肖斌:2021年加入团队,一直从事软件工程智能化方向的研究和探索,当下专注于代码生成,AI 对话等方向,目前是 Code...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池