Nginx启动配置加载性能的示例分析

发布时间:2021-11-20 11:31:11 作者:小新
来源:亿速云 阅读:210

这篇文章主要为大家展示了“Nginx启动配置加载性能的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Nginx启动配置加载性能的示例分析”这篇文章吧。

一、测试内容

脚本创建3类配置文件, 规则如下:

1. 共创建2万条Server{}配置

2. server_name基本定长, PerformanceTestxxx

3. 第1类是listen的IP完全一致,port全不同, 配置文件实例:

http{ server{ listen 192.168.0.1:8080; server_name PerformanceTest8080; } … server{ listen 192.168.0.1:8081; server_name PerformanceTest8081; …. } }

3. 第2类是listen的Port完全一致,IP全不同, 配置文件实例:

http{ server{ listen 192.168.0.1:80; server_name PerformanceTest1; } … server{ listen 192.168.0.2:80; server_name PerformanceTest2; …. } }

4. 第3类是listen的IP:PORT完全一致, server_name全不同, 配置文件实例:

http{ server{ listen 192.168.0.1:80; server_name PerformanceTest001; } … server{ listen 192.168.0.1:80; server_name PerformanceTest002; …. } }

二、 测试数据

对于3类配置, 再加入3组变量:

1. 不配置server_name

2. server_name全配置一样

3. server_name全配置不一样

看server_name对于初始化速度的影响

9种组合的性能如下:

Nginx启动配置加载性能的示例分析

nginx 启动时间:time ./nginx -c /root/nginx.conf.sameport.noloc

nginx reload时间:time ./nginx -c /root/nginx.conf.sameport.noloc –s reload

从测试数据可以看出, 对nginx启动速度影响的因素为server{}中listen的port, server_name指令基本无影响。

三、 原因分析

3.1 http{}初始化流程简单介绍:

Nginx启动配置加载性能的示例分析

解析配置文件是递归地调用ngx_conf_parse函数完成的, http{}配置块的解析流程:

1. 解析到http指令, 执行ngx_http_block函数, 创建http module的配置上下文后, 继续ngx_conf_parse解析http{}内部的内容;

2. 解析到server指令, 执行ngx_http_core_server函数, 创建该server{}的配置上下文后, 继续ngx_conf_parse解析server{}内部的内容;

3. 解析到listen指令, 添加到cscf以及cmcf配置中, 如下图:

1. cmcf->servers数组保存了所有监听的server数据

Nginx启动配置加载性能的示例分析

2. cmcf->ports数组保存了所有port汇聚的ip的数据. listen同一个ip:port, server_name不同的srv_conf会挂在ngx_http_conf_addr_t的servers数组下。

Nginx启动配置加载性能的示例分析

一个配置好的样子可能是这样:

Nginx启动配置加载性能的示例分析

3.2 耗时位置定位

代码中加变量记录函数耗时总时间, 得到启动时耗时在2个步骤:

1) 解析配置文件, 对应ngx_conf_parse函数

2) 初始化socket, 对应ngx_open_listening_sockets函数

Nginx启动配置加载性能的示例分析

3.3 ngx_conf_parse耗时分析

主要是ngx_http_block函数的耗时, 分为以下2个部分:

Nginx启动配置加载性能的示例分析

很明显, ngx_http_add_addresses函数的性能消耗在对相同port已存在ip的查找上面, 这里用的是线性的遍历查找,

且需要进行字符串比较ngx_memcmp被执行了2w*2w共4亿次:

for (i = 0; i < port->addrs.nelts; i++) { // 遍历查找, 如果配置文件中,相同port的IP过多,字符串比较带来较大性能问题, 2w个listen,这一块耗时需要8s左右 if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) { continue; } /* the address is already in the address list */ // 找到对应的ip, 添加cscf到IP if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) { return NGX_ERROR; }

3.4 ngx_open_listening_sockets耗时分析

函数中初始化所有listening的socket

/* for each listening socket */ ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) { if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { &hellip; &hellip; if (listen(s, ls[i].backlog) == -1) { }

Nginx启动配置加载性能的示例分析

对于同1个IP,新建不同port的socket相比新建多个不同IP的socket更省时间。

以上是“Nginx启动配置加载性能的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. Nginx之Location配置的示例分析
  2. 如何在nginx中配置服务启动

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx

上一篇:Java中Double除保留后小数位的方法有哪些

下一篇:怎么解决Java在时间戳计算的过程中遇到的数据溢出问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》