2022-10-23 429
本文测试了在配置文件规模较大时, Nginx作为http服务器的启动速度,并分析耗时原因。
结论:
1. Nginx初始化中影响性能点在于listen IP:PORT, 其中port的汇聚会造成初始化速度变得很慢
2. 对于Server_name的初始化相当快, 对初始化性能无影响
一、测试内容
脚本创建3类配置文件, 规则如下:
1. 共创建2万条Server{}配置
2. server_name基本定长, PerformanceTestxxx
3. 第1类是listen的IP完全一致,port全不同, 配置文件实例:
http{ server{ listen192.168.0.1:8080; server_namePerformanceTest8080; } … server{ listen192.168.0.1:8081; server_namePerformanceTest8081; …. } }
3. 第2类是listen的Port完全一致,IP全不同, 配置文件实例:
http{ server{ listen192.168.0.1:80; server_namePerformanceTest1; } … server{ listen192.168.0.2:80; server_namePerformanceTest2; …. } }
4. 第3类是listen的IP:PORT完全一致, server_name全不同, 配置文件实例:
http{ server{ listen192.168.0.1:80; server_namePerformanceTest001; } … server{ listen192.168.0.1:80; server_namePerformanceTest002; …. } }
二、 测试数据
对于3类配置, 再加入3组变量:
1. 不配置server_name
2. server_name全配置一样
3. server_name全配置不一样
看server_name对于初始化速度的影响
9种组合的性能如下:
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{}初始化流程简单介绍:
解析配置文件是递归地调用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数据
2. cmcf->ports数组保存了所有port汇聚的ip的数据. listen同一个ip:port, server_name不同的srv_conf会挂在ngx_http_conf_addr_t的servers数组下。
一个配置好的样子可能是这样:
3.2 耗时位置定位
代码中加变量记录函数耗时总时间, 得到启动时耗时在2个步骤:
1) 解析配置文件, 对应ngx_conf_parse函数
2) 初始化socket, 对应ngx_open_listening_sockets函数
3.3 ngx_conf_parse耗时分析
主要是ngx_http_block函数的耗时, 分为以下2个部分:
很明显, 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; } /*theaddressisalreadyintheaddresslist*/ //找到对应的ip,添加cscf到IP if(ngx_http_add_server(cf,cscf,&addr[i])!=NGX_OK){ returnNGX_ERROR; }
3.4 ngx_open_listening_sockets耗时分析
函数中初始化所有listening的socket
/*foreachlisteningsocket*/ ls=cycle->listening.elts; for(i=0;i<cycle->listening.nelts;i++){ if(bind(s,ls[i].sockaddr,ls[i].socklen)==-1){ … … if(listen(s,ls[i].backlog)==-1){ }
对于同1个IP,新建不同port的socket相比新建多个不同IP的socket更省时间。
原文链接:https://77isp.com/post/8940.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态