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

107次阅读
没有评论

共计 2487 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章主要为大家展示了“Nginx 启动配置加载性能的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“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; }  hellip; server{ listen 192.168.0.1:8081; server_name PerformanceTest8081;  hellip;. } }

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

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

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

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

二、测试数据

对于 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 ndash;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 启动配置加载性能的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2487字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)