Nginx共享内存

30
Nginx 共共共共 共共 2015-05- 25

Transcript of Nginx共享内存

Page 1: Nginx共享内存

Nginx 共享内存李航

2015-05-25

Page 2: Nginx共享内存

目录 CONTENTS1.介绍2.结构3.流程4.配置方式5.接口及功能6.性能测试7. Q&A

Page 3: Nginx共享内存

Confidential & Proprietary

3

介绍介绍:

nginx 共享内存是利用 mmap 将内容存储在内存中以及自旋锁。当 master启动的时候,根据相应的指令去初始化共享内存。利用共享内存实现一个轻量级的 k/v 系统。https://github.com/lidaohang/ngx_shm_dict

Page 4: Nginx共享内存

Confidential & Proprietary

4

结构全局变量 ngx_cycle 结构:

Page 5: Nginx共享内存

Confidential & Proprietary

5

结构ngx_cycle 结构:

Page 6: Nginx共享内存

Confidential & Proprietary

6

结构ngx_zone_s 结构:

Page 7: Nginx共享内存

Confidential & Proprietary

7

结构ngx_shmtx_t 结构:

Page 8: Nginx共享内存

Confidential & Proprietary

8

结构ngx_slab_pool_t 结构:

Page 9: Nginx共享内存

Confidential & Proprietary

9

结构ngx_slab_pool_t 结构:

Page 10: Nginx共享内存

Confidential & Proprietary

10

流程启动 Nginx 初始化共享内存:

Page 11: Nginx共享内存

Confidential & Proprietary

11

流程添加 k/v :

Page 12: Nginx共享内存

Confidential & Proprietary

12

流程获取 k/v :

Page 13: Nginx共享内存

Confidential & Proprietary

13

流程过期回收 k/v :

Page 14: Nginx共享内存

Confidential & Proprietary

14

流程流程图:

Page 15: Nginx共享内存

Confidential & Proprietary

15

流程流程图:

Page 16: Nginx共享内存

Confidential & Proprietary

16

流程内部哪些使用共享内存:

Page 17: Nginx共享内存

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;

};

Page 18: Nginx共享内存

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="");

Page 19: Nginx共享内存

Confidential & Proprietary

19

接口及功能接口内部结构:

Page 20: Nginx共享内存

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. 如果需要使用多块共享内存配置多个即可

Page 21: Nginx共享内存

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;

}}

Page 22: Nginx共享内存

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 读写性能

Page 23: Nginx共享内存

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)

Page 24: Nginx共享内存

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)

Page 25: Nginx共享内存

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)

Page 26: Nginx共享内存

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)

Page 27: Nginx共享内存

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)

Page 28: Nginx共享内存

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)

Page 29: Nginx共享内存

Confidential & Proprietary

29

Q&A

Q&A

Page 30: Nginx共享内存

北京市海淀区丹棱街 3 号中国电子大厦 B 座 10 层 100080

10th Floor Tower B,CEC Plaza,No.3 Dan Ling Street, Hai Dian District, Beijing 100080,China

Thanks