动态共享内存

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"
}