Nginx共享内存
Transcript of Nginx共享内存
Nginx 共享内存李航
2015-05-25
目录 CONTENTS1.介绍2.结构3.流程4.配置方式5.接口及功能6.性能测试7. Q&A
Confidential & Proprietary
3
介绍介绍:
nginx 共享内存是利用 mmap 将内容存储在内存中以及自旋锁。当 master启动的时候,根据相应的指令去初始化共享内存。利用共享内存实现一个轻量级的 k/v 系统。https://github.com/lidaohang/ngx_shm_dict
Confidential & Proprietary
4
结构全局变量 ngx_cycle 结构:
Confidential & Proprietary
5
结构ngx_cycle 结构:
Confidential & Proprietary
6
结构ngx_zone_s 结构:
Confidential & Proprietary
7
结构ngx_shmtx_t 结构:
Confidential & Proprietary
8
结构ngx_slab_pool_t 结构:
Confidential & Proprietary
9
结构ngx_slab_pool_t 结构:
Confidential & Proprietary
10
流程启动 Nginx 初始化共享内存:
Confidential & Proprietary
11
流程添加 k/v :
Confidential & Proprietary
12
流程获取 k/v :
Confidential & Proprietary
13
流程过期回收 k/v :
Confidential & Proprietary
14
流程流程图:
Confidential & Proprietary
15
流程流程图:
Confidential & Proprietary
16
流程内部哪些使用共享内存:
Confidential & Proprietary
17
接口及功能共享内存接口结构:
class CNgxDictInterface {public:
CNgxDictInterface():s_zone_name(""),zone_t(NULL){};virtual ~CNgxDictInterface(){};
//int Get(const std::string &key,const std::string &value,uint32_t *exptime=0,const std::string &zoneName="");
int Set(const std::string& key,const std::string& value,uint32_t exptime=0,const std::string& zoneName="");int Set(shm_str_t* key, shm_str_t* value,uint32_t exptime=0,const std::string& zoneName="");
int Del(const std::string& key,const std::string& zoneName="");int Del(shm_str_t* key,const std::string& zoneName="");
int Incr(const std::string& key,int count,int64_t *res,uint32_t exptime=0,const std::string& zoneName="");int Incr(shm_str_t* shm_key,int count,int64_t *res,uint32_t exptime=0,const std::string& zoneName="");
int FlushAll(const std::string& zoneName="");
std::string GetZoneName();int SetZoneName(const std::string& zoneName);
std::string GetError(int ret);
private:std::string s_zone_name;void* zone_t;
};
Confidential & Proprietary
18
接口及功能共享内存接口结构:
/** * key 字典的 key. * value 字典的 value * exptime 过期时间 ( 秒 ) * zoneName 共享内存名称**/
// 获得 k/vint Get(const std::string &key,std::string &value,uint32_t *exptime=0,const std::string &zoneName="");
// 设置 k/vint Set(const std::string& key,const std::string& value,uint32_t exptime=0,const std::string& zoneName="");int Set(shm_str_t* key, shm_str_t* value,uint32_t exptime=0,const std::string& zoneName="");
// 删除 k/vint Del(const std::string& key,const std::string& zoneName="");int Del(shm_str_t* key,const std::string& zoneName="");
//key 增加 nint Incr(const std::string& key,int count,int64_t *res,uint32_t exptime=0,const std::string& zoneName="");int Incr(shm_str_t* shm_key,int count,int64_t *res,uint32_t exptime=0,const std::string& zoneName="");
// 清空共享内存int FlushAll(const std::string& zoneName="");
Confidential & Proprietary
19
接口及功能接口内部结构:
Confidential & Proprietary
20
接口及功能功能介绍:
1. 初始化共享内存ah_shm_zone zone=test max_size=10m;ah_shm_zone zone=test1 max_size=10m;ah_shm_zone zone=test2 max_size=10m;
zone 共享内存名称max_size 共享内存大小
2. 模块使用共享内存shm_zone_name test|test1;
a. 使用的共享内存名称b. 必须跟初始化共享内存的名称对应c. 如果需要使用多块共享内存配置多个即可
Confidential & Proprietary
21
配置Nginx 配置文件:
ah_shm_zone zone=lands max_size=10m;ah_shm_zone zone=click max_size=10m;
server {listen 80;server_name localhost;
location / {shm_zone_name lands;ah_shm_dict_test;
}}
Confidential & Proprietary
22
测试共享内存性能测试:
ab -c 500 -n 100000 "http://127.0.0.1:8011/set?zone=lands&key=440932&value=440932&exptime=441032“单核 CPU 写入 QPS : 17000 左右
ab –c 500 -n 100000 "http://127.0.0.1:8011/get?zone=lands&key=440932“单核 CPU 读入 QPS : 19000 左右
测试场景:单核 CPU 小 value 读写性能
Confidential & Proprietary
23
测试共享内存性能测试:
ab -c 500 -n 100000"http://127.0.0.1:8011/set_20k?zone=lands&key=68146&exptime=1000"单核 CPU 写入 20k QPS : 9000 左右
ab -c 500 -n 100000 "http://10.168.100.187:8011/get?zone=lands&key=68146_shm_dict_set_string_20k"单核 CPU 读入 20K QPS : 10000 左右
测试场景:单核 大 value 读写性能 ( 数据大小: 20k)
Confidential & Proprietary
24
测试共享内存性能测试:
ab -c 500 -n 100000"http://127.0.0.1:8011/set_44k?zone=lands&key=68146&exptime=1000"单核 CPU 写入 44k QPS : 6100 左右
ab -c 500 -n 100000 "http://10.168.100.187:8011/get?zone=lands&key=68146_shm_dict_set_string_44k"单核 CPU 读入 44K QPS : 6400 左右
测试场景:单核 大 value 读写性能 ( 数据大小: 44k)
Confidential & Proprietary
25
测试共享内存性能测试:
ab -c 500 -n 100000"http://127.0.0.1:8011/set_100k?zone=lands&key=68146&exptime=1000"单核 CPU 写入 100k QPS : 3100 左右
ab -c 500 -n 100000 "http://10.168.100.187:8011/get?zone=lands&key=68146_shm_dict_set_string_100k"单核 CPU 读入 100K QPS : 3700 左右
测试场景:单核 大 value 读写性能 ( 数据大小: 100k)
Confidential & Proprietary
26
测试共享内存性能测试:
ab -c 500 -n 100000http://127.0.0.1:8011/set_20k?zone=lands&key=68146&exptime=1000
30 核 CPU 写入 20k QPS : 13000 左右
ab -c 500 -n 100000 "http://10.168.100.187:8011/get?zone=lands&key=68146_shm_dict_set_string_20k"30 核 CPU 读入 20K QPS : 14000 左右
测试场景:30 核 大 value 读写性能 ( 数据大小: 20k)
Confidential & Proprietary
27
测试共享内存性能测试:
ab -c 500 -n 100000"http://127.0.0.1:8011/set_44k?zone=lands&key=68146&exptime=1000"30 核 CPU 写入 44k QPS : 1000 左右
ab -c 500 -n 100000 "http://10.168.100.187:8011/get?zone=lands&key=68146_shm_dict_set_string_44k"30 核 CPU 读入 44K QPS : 9000 左右
测试场景:30 核 大 value 读写性能 ( 数据大小: 44k)
Confidential & Proprietary
28
测试共享内存性能测试:
ab -c 500 -n 100000"http://127.0.0.1:8011/set_100k?zone=lands&key=68146&exptime=1000"30 核 CPU 写入 100k QPS : 7100 左右
ab -c 500 -n 100000 "http://10.168.100.187:8011/get?zone=lands&key=68146_shm_dict_set_string_100k"30 核 CPU 读入 100K QPS : 7200 左右
测试场景:30 核 大 value 读写性能 ( 数据大小: 100k)
Confidential & Proprietary
29
Q&A
Q&A
北京市海淀区丹棱街 3 号中国电子大厦 B 座 10 层 100080
10th Floor Tower B,CEC Plaza,No.3 Dan Ling Street, Hai Dian District, Beijing 100080,China
Thanks