即将发布:NJet共享内存指标展示及动态扩展
NGINX 向云原生演进,All in OpenNJet
简介
共享内存是NJet实现高性能和高并发处理的关键机制之一。它允许多个工作进程共享数据,减少重复计算和资源消耗,同时支持复杂的业务逻辑(如限流、负载均衡、会话管理等)。通过合理使用共享内存,可以显著提升NJet的性能和可靠性。从NJet3.0开始,NJet实现了对动态共享内存的支持,解决了关键的资源分配无法应对业务弹性变化的关键痛点。目前,NJet的动态共享内存功能有了新的增强,新增的主要功能有两个:
支持对共享内存的使用情况进行统计、展示,目前支持json格式,html格式及prometheus格式。同时还展示了NJet中的ctrl进程及各个worker进程的内存及CPU使用情况。
支持通过API为每个共享内存池配置自动扩展属性,在配置了动态共享内存后,设置了属性的共享内存池可以自动扩展。
目前,此功能在开发分支上实现,后续会合并到主分支上发布。如想试用,可自行从gitee平台上下载开发分支进行编译,试用。
共享内存指标展示
要展示共享内存的使用情况,需要对NJet的helper配置文件(如njet_ctrl.conf)修改,增加黄色标注的配置。配置动态共享内存的命令可参考gitee上的使用手册。
Bash \# conf/njet_ctrl.conf load_module /usr/local/njet/modules/njt_http_sendmsg_module.so; load_module /usr/local/njet/modules/njt_ctrl_config_api_module.so; load_module /usr/local/njet/modules/njt_helper_health_check_module.so; load_module /usr/local/njet/modules/njt_http_upstream_api_module.so; load_module /usr/local/njet/modules/njt_http_location_api_module.so; load_module /usr/local/njet/modules/njt_doc_module.so; load_module /usr/local/njet/modules/njt_http_vtsd_module.so; load_module /usr/local/njet/modules/njt_http_shm_status_module.so; load_module modules/njt_http_shm_api_module.so; <br/>error_log logs/error_ctrl.log error; <br/>events { worker_connections 1024; } <br/>http { \# dyn_kv_conf conf/ctrl_kv.conf; \# lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;;"; \# lua_package_cpath "$prefix/lualib/clib/?.so;;"; \# init_by_lua_block { \# local \_=require("lor.index") \# local \_=require("lsqlite3complete") \# } include mime.types; access_log off; server { listen 8089; <br/>... ... location /api { dyn_module_api; <br/>} <br/><br/>location /shm { shm_status_display; } } }
通过上面的配置,在运行后就可以通过浏览器查看共享内存的使用情况了。下面给出的地址都是参考上述配置。具体展示的指标有:
全局统计:包括动态zone和静态zone;
zone一级:包括size, 这里的size是一个pool的大小, pool数目等;
pool一级:包括总页数和已用页数;
slot一级:这一级指的是小于半个页面(4k/2 = 2k)大小的内存分配情况,njet使用单独的数据结构来管理这类内存的分配;
Worker的内存及CPU使用统计
JSON格式
访问地址:http://127.0.0.1:8089/shm/format/json
PROMETHEUS格式
访问地址:http://127.0.0.1:8089/shm/format/prometheus
这种格式主要供系统资源监控使用,所以没有给出上面说到的slot一级的指标和pool一级的指标。
HTML格式
访问地址:http://127.0.0.1:8089/shm/format/html
这种模式下,指标以表格形式输出,并且会自动更新。
共享内存动态扩展设置
这次更新中,还为每一个共享内存的zone增加了一个自动扩展(autoscale)的属性。这个属性可以通过NJet的控制API来实现。要使用此功能,需要在njet_ctrl.conf中增加下面的配置。
Bash load_module modules/njt_http_shm_api_module.so;
访问地址:http://127.0.0.1:8089/doc/swagger/
点击红线内的接口,跳转到下面的页面
通过对应的接口可以设置/取消/查询对应zoneName的共享内存的可扩展属性。其中typeName的取值有两个:
static对应静态共享内存,即html格式中static_zones中的列表;
dynamic对应动态共享内存,即html格式中static_zones中的列表。
这些请求都可以通过curl向相应的接口发送请求来实现。如设置共享内存非自动扩展属性,发送
Bash curl -X 'PUT' \\ '<http://127.0.0.1:8089/api/v1/shm/unset/dynamic/dyn_backend1>' \\ \-H 'accept: \*/\*'
返回
Bash { "code": 0, "msg": "successfully update zone status" }
查询共享内存自动扩展属性值,发送
Bash curl -X 'GET' \\ '<http://127.0.0.1:8089/api/v1/shm/get/dynamic/dyn_backend1>' \\ \-H 'accept: application/json'
返回
Bash { "code": 0, "msg": "zone autoscale is unset" }
动态共享内存自动扩展示例
下面给出一个设置动态内存可扩展属性的例子,具体配置如下图,这是一个配置lua字典的例子,具体配置如下,其中
第28行定义了总的动态共享内存的大小为100M;
第31行定义了一个静态共享内存,大小为10M;
第49行定义的location中的lua块将接收到的数据保存到字典中(第67行)。
Bash worker_processes auto; <br/>cluster_name njet; node_name node1; <br/>error_log logs/error.log error; <br/>helper ctrl /usr/local/njet/modules/[njt_helper_ctrl_module.so](http://njt_helper_ctrl_module.so) /usr/local/njet/conf/njet_ctrl.conf; helper broker /usr/local/njet/modules/[njt_helper_broker_module.so](http://njt_helper_broker_module.so); helper access_data /usr/local/njet/modules/[njt_helper_access_data_module.so](http://njt_helper_access_data_module.so) /usr/local/njet/conf/go access.conf; <br/>load_module /usr/local/njet/modules/[njt_http_split_clients_2_module.so](http://njt_http_split_clients_2_module.so); load_module /usr/local/njet/modules/[njt_agent_dynlog_module.so](http://njt_agent_dynlog_module.so); load_module /usr/local/njet/modules/[njt_http_dyn_bwlist_module.so](http://njt_http_dyn_bwlist_module.so); load_module /usr/local/njet/modules/[njt_dyn_ssl_module.so](http://njt_dyn_ssl_module.so); load_module /usr/local/njet/modules/[njt_http_vtsc_module.so](http://njt_http_vtsc_module.so); load_module /usr/local/njet/modules/[njt_http_location_module.so](http://njt_http_location_module.so); load_module /usr/local/njet/modules/[njt_http_access_log_zone_module.so](http://njt_http_access_log_zone_module.so); load_module /usr/local/njet/modules/[njt_http_lua_module.so](http://njt_http_lua_module.so); load_module modules/[njt_http_dyn_upstream_module.so](http://njt_http_dyn_upstream_module.so); <br/><br/>events { worker_connections 1024; } <br/>shared_slab_pool_size 100M; <br/>http { lua_shared_dict configuration_data 10M; dyn_kv_conf conf/iot-work.conf; include mime.types; access_log off; access_log_write_zone on; vhost_traffic_status_zone; access_log_zone log_zone 100m; \# access_log_zone_ignore_ip [127.0.0.1](http://127.0.0.1); access_log_zone_valid 3; <br/>#lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;$prefix/apps/?.lua;;" ; \# lua_package_cpath "$prefix/lualib/clib/?.so;;"; server { listen 8080; location / { root html; } location /set_key { \# Set content type to text/plain for simplicity default_type text/plain; <br/>\# Use Lua code to set a key into the shared dictionary content_by_lua_block { \-- Get the 'key' parameter from the URL local key = ngx.var.arg_key \-- Get the 'value' parameter from the URL local value = ngx.var.arg_value <br/>if not key or not value then ngx.say("Missing key or value parameter") return end <br/>\-- Store the key-value pair in the shared dictionary local dict = ngx.shared.configuration_data local success, err, forcible = dict:set(key, value) <br/>if success then ngx.say("Key '" .. key .. "' set to '" .. value .. "' successfully") else ngx.say("Failed to set key: ", err) end } } <br/>location /get_key { default_type text/plain; content_by_lua_block { local key = ngx.var.arg_key if not key then ngx.say("Key parameter is missing") return end <br/>local dict = ngx.shared.configuration_data local value, flags, stale = dict:get(key) <br/>if value then ngx.say("Value for key '" .. key .. "' is: " .. value) else ngx.say("Key '" .. key .. "' not found") end } } } }
可通过下面的脚本持续向字典中增加数据
Bash for i in {1..20000}; do curl -s "localhost:8080/set_key?key=a_$i&value=b_$i" > /dev/null;done;
在没给configuration_data设置可扩展属性前,测试中可以看到内存池已经满。
在设置configuration_data设置可扩展属性后,请求在内存池满了后会自动扩展。 从图中看到,configuration_data中的内存池已经扩展为3个。这项功能的一种使用场景是
为整个系统配置一个合适的总的动态内存空间大小;
使用prometheus接口定期采集系统中共享内存的使用情况;
当发现有共享内存空间的使用率超过预设的阈值时,发出告警;
根据zone的具体使用方式,确定是否需要设置动态扩展。
其它说明
当前功能将在25年Q1末的NJet3.3发布时支持,敬请期待
NJet 应用引擎通过内核重构实现了独特的运行时动态配置加载能力,是新一代高性能 Web 应用引擎。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。 邮件组 官网

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
图引擎在智能体开发场景的应用实践
导读 随着AGI理论的不断突破,智能体已经成为LLM在企业落地的最重要的形式之一。一个完备的智能体必须能实现:感知、推理、计划、执行等一套完整的功能,从工程的角度来看workflow特别适合这种复杂任务的分析、拆解、重组、执行, 再结合CoT技术, 实现LLM和业务功能完美契合的智能体应用。本文尝试用成熟的图引擎技术驱动workflow探索更多样性的拓展agent能力的方法,以更好应对各类业务场景。 01 简介 1.1 什么是智能体 以大模型(LLM)为核心, 具备以下特性的智能化系统: 交互性: 通过文字,语音,图像等多种交互方式来理解用户的持续性需求 (感知); 适应性: 感知环境的变化持续进化,以更好地完成任务和适应复杂环境 (记忆); 自主性: 能够自主学习,主动思考和决策 (推理); 1.2业务形态、流程 一个智能体生态平台,用户可以在上面体验功能各异的智能体app,同时也能让用户将自己的优秀想法以极低的成本(通过快速组装已有的插件、workflow、知识库、记忆) 快速实现成新的agent。 系统特色: 流程编排能力:支持可视...
- 下一篇
Paper Reading | Google Spanner 经典架构回顾
前言 大数据时代 ,随着移动互联网和物联网技术的发展 , 全球数据量呈现爆发式增长,已经远远超出集中式单机数据库的处理能力。CCF 数据库专委 2021 年发布的《“十四五”数据库发展趋势与挑战》显示, 各行各业海量数据的管理需求给数据库产业的发展带来了诸多挑战 : • 海量数据存储 传统集中式数据库容量大多在百 GB 至 TB 级别,伴随着各行各业数据爆发式增长,数据库所需存储的数据容量也在急剧增长且数量呈现指数级增长,从 TB 级别增加到 PB 级别,未来很快就会增加至 EB 级别; • 海量并发访问 数据库的业务访问量也发生了量到质的变化,传统的业务模式业务访问仅局限于企业内部 , 通常数百至数千并发即可满足。而在互联网及物联网模式下,数据库的访问服务于海量的联网终端用户,需要万级至百万级的并发支持能力; • 基础设施的分布式 为了提升数据库的高可用,各行业在加速信息化基础设施的建设,从传统的两地三中心向分布式多地多中心变化,要求数据库从传统的可用区(AZ)内部署向跨 AZ、跨地域(region)的分布式部署架构演进。 基于上述背景,传统集中式数据库架构已无法有效满足新型互联...
相关文章
文章评论
共有0条评论来说两句吧...