动态共享内存
1. 功能说明
动态共享内存是在原有的共享内存基础上,系统预留了一块(多块)内存供系统中所有的zone共享,当有zone预先指定的内存已经用光的时候,可以再向系统申请一个slab_pool, 加到原来zone的slab_pool的队列尾部。
增加的指令 shared_slab_pool_size
, 可以指定预留的共享内存的大小。
NJET中的所有zone,包含静态配置的zone和动态配置的zone,都会有一个auto_scale属性,默认为0,不扩展,可以通过API的方式设置为1,自动扩展,当zone空间用光时,会从预留的空间中申请当前zone相同大小的空间使用。
2. 依赖模块
动态共享内存功能依赖模块:
load_module modules/njt_http_shm_status_module.so;
load_module modules/njt_http_shm_api_module.so;
3 指令说明
3.1 shared_slab_pool_size
Syntax: | shared_slab_pool_size; |
---|---|
Default: | 0 |
Context: | core |
启动时
- 如果
shared_slab_pool_size
未配置或为0,不分配相应的内存 - 如果
shared_slab_pool_size
< 10M,改为10M,分配相应的内存 - 如果
shared_slab_pool_size
> 10M,按照实际分配相应的内存
3.2 max_dyn_zone_count
Syntax: | max_dyn_zone_count; |
---|---|
Default: | 4096 |
Context: | core |
限制可添加的动态zone的总数,默认总数为4096。
4. 配置说明
njet.conf
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/ctrl.conf;
helper access_data modules/njt_helper_access_data_module.so conf/goaccess.conf;
load_module modules/njt_agent_dynlog_module.so;
load_module modules/njt_http_location_module.so;
load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_dyn_server_module.so;
load_module modules/njt_http_access_log_zone_module.so;
load_module modules/njt_http_dyn_upstream_module.so;
load_module modules/njt_http_dyn_map_module.so;
user root root;
worker_processes 2;
cluster_name helper;
node_name node1;
shared_slab_pool_size 100m;
shm_status on;
max_dyn_zone_count 2;
error_log logs/error.log info;
pid logs/njet.pid;
events {
worker_connections 1024;
}
http {
upstream backend1 {
zone backend1 256k;
server 192.168.40.150:5678;
}
dyn_kv_conf conf/iot-work.conf;
include mime.types;
access_log logs/access.log;
variables_hash_max_size 2048;
sendfile on;
keepalive_timeout 65;
access_log_write_zone on;
access_log_zone abc 10m;
access_log_zone_valid 3;
server {
listen 5555;
server_name localhost;
location / {
proxy_pass http://backend1;
}
}
}
ctrl.conf
load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so;
load_module modules/njt_helper_health_check_module.so;
load_module modules/njt_http_upstream_api_module.so;
load_module modules/njt_http_location_api_module.so;
load_module modules/njt_doc_module.so;
load_module modules/njt_http_vtsd_module.so;
load_module modules/njt_http_ssl_api_module.so;
load_module modules/njt_http_dyn_server_api_module.so;
load_module modules/njt_http_dyn_upstream_module.so;
load_module modules/njt_http_dyn_upstream_api_module.so;
load_module modules/njt_http_shm_status_module.so;
load_module modules/njt_http_shm_api_module.so;
events {
worker_connections 1024;
}
error_log logs/error_ctrl.log info;
http {
dyn_sendmsg_conf conf/iot-ctrl.conf;
dyn_kv_conf conf/ctrl_kv.conf;
access_log logs/access_ctrl.log combined;
include mime.types;
server {
listen 8081;
location /doc {
doc_api;
}
location /metrics {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
location /api {
dyn_module_api;
}
location /report/ {
root html;
}
location /ws {
proxy_pass http://127.0.0.1:7892;
}
location /shm {
shm_status_display;
}
}
}
cluster_name helper;
node_name node1;
5 调用样例
5.1 API说明
查询zone的auto_scale属性,值为0时不拓展,只为1是zone空间满后自动拓展:
GET http://IP+port/api/v1/shm/get/{typeName}/{zoneName}
说明:
变量 | 含义 | 取值 |
---|---|---|
typeName: | zone的类型 | static / dynamic |
zoneName: | zone的名称 | zone名称 |
特殊说明: zone类型分为动态和静态,动态zone为通过NJet动态API添加的zone,静态zone为通过静态配置文件设置的zone。
设置auto_scale值为1接口:
PUT http://IP+port/api/v1/shm/set/{typeName}/{zoneName}
说明:
变量 | 含义 | 取值 |
---|---|---|
typeName: | zone的类型 | static / dynamic |
zoneName: | zone的名称 | zone名称 |
设置auto_scale值为0接口:
PUT http://IP+port/api/v1/shm/unset/{typeName}/{zoneName}
说明:
变量 | 含义 | 取值 |
---|---|---|
typeName: | zone的类型 | static / dynamic |
zoneName: | zone的名称 | zone名称 |
5.2 配置动态共享内存指令
worker_processes auto;
#daemon off;
shared_slab_pool_size 10M;
通过动态upstream api添加server至上限后,查看日志
2024/06/20 11:03:42 [notice] 29735#0: dyn_slab add new slab pool: 00007F9BD8028000, size 32768
2024/06/20 11:03:42 [notice] 29735#0: new slab pool alloc: 00007F9BD8028000, size 32768
5.3 配置动态zone限制指令
worker_processes auto;
#daemon off;
shared_slab_pool_size 10M;
max_dyn_zone_count 2;
限制动态zone数量为2后,最多添加2组动态upstream。
添加第一组:
curl -X 'POST' \
'http://127.0.0.1:8081/api/v1/dyn_ups' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"type": "add",
"upstream_name": "dyn_backend1",
"upstream_body": "zone dyn_backend1 256k;state upstream1.conf"
}'
返回
{
"code": 0,
"msg": "success."
}
添加第二组:
curl -X 'POST' \
'http://127.0.0.1:8081/api/v1/dyn_ups' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"type": "add",
"upstream_name": "dyn_backend2",
"upstream_body": "zone dyn_backend2 256k;state upstream2.conf"
}'
返回
{
"code": 0,
"msg": "success."
}
再添加第三组
curl -X 'POST' \
'http://127.0.0.1:8081/api/v1/dyn_ups' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"type": "add",
"upstream_name": "dyn_backend3",
"upstream_body": "zone dyn_backend3 256k;state upstream3.conf"
}'
返回
{
"code": 4,
"msg": "njt_share_slab_get_pool error!"
}
5.4 设置共享内存自动扩展属性
发送
curl -X 'PUT' \
'http://127.0.0.1:8081/api/v1/shm/set/dynamic/dyn_backend1' \
-H 'accept: */*'
返回
{
"code": 0,
"msg": "successfully update zone status"
}
5.5 设置共享内存非自动扩展属性
发送
curl -X 'PUT' \
'http://127.0.0.1:8081/api/v1/shm/unset/dynamic/dyn_backend1' \
-H 'accept: */*'
返回
{
"code": 0,
"msg": "successfully update zone status"
}
5.6 查询共享内存自动扩展属性值
发送
curl -X 'GET' \
'http://127.0.0.1:8081/api/v1/shm/get/dynamic/dyn_backend1' \
-H 'accept: application/json'
返回
{
"code": 0,
"msg": "zone autoscale is unset"
}