溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Nginx啟動(dòng)配置加載性能的示例分析

發(fā)布時(shí)間:2021-11-20 11:31:11 來(lái)源:億速云 閱讀:226 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章主要為大家展示了“Nginx啟動(dòng)配置加載性能的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Nginx啟動(dòng)配置加載性能的示例分析”這篇文章吧。

一、測(cè)試內(nèi)容

腳本創(chuàng)建3類配置文件, 規(guī)則如下:

1. 共創(chuàng)建2萬(wàn)條Server{}配置

2. server_name基本定長(zhǎng), PerformanceTestxxx

3. 第1類是listen的IP完全一致,port全不同, 配置文件實(shí)例:

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全不同, 配置文件實(shí)例:

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全不同, 配置文件實(shí)例:

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

二、 測(cè)試數(shù)據(jù)

對(duì)于3類配置, 再加入3組變量:

1. 不配置server_name

2. server_name全配置一樣

3. server_name全配置不一樣

看server_name對(duì)于初始化速度的影響

9種組合的性能如下:

Nginx啟動(dòng)配置加載性能的示例分析

nginx 啟動(dòng)時(shí)間:time ./nginx -c /root/nginx.conf.sameport.noloc

nginx reload時(shí)間:time ./nginx -c /root/nginx.conf.sameport.noloc –s reload

從測(cè)試數(shù)據(jù)可以看出, 對(duì)nginx啟動(dòng)速度影響的因素為server{}中l(wèi)isten的port, server_name指令基本無(wú)影響。

三、 原因分析

3.1 http{}初始化流程簡(jiǎn)單介紹:

Nginx啟動(dòng)配置加載性能的示例分析

解析配置文件是遞歸地調(diào)用ngx_conf_parse函數(shù)完成的, http{}配置塊的解析流程:

1. 解析到http指令, 執(zhí)行ngx_http_block函數(shù), 創(chuàng)建http module的配置上下文后, 繼續(xù)ngx_conf_parse解析http{}內(nèi)部的內(nèi)容;

2. 解析到server指令, 執(zhí)行ngx_http_core_server函數(shù), 創(chuàng)建該server{}的配置上下文后, 繼續(xù)ngx_conf_parse解析server{}內(nèi)部的內(nèi)容;

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

1. cmcf->servers數(shù)組保存了所有監(jiān)聽(tīng)的server數(shù)據(jù)

Nginx啟動(dòng)配置加載性能的示例分析

2. cmcf->ports數(shù)組保存了所有port匯聚的ip的數(shù)據(jù). listen同一個(gè)ip:port, server_name不同的srv_conf會(huì)掛在ngx_http_conf_addr_t的servers數(shù)組下。

Nginx啟動(dòng)配置加載性能的示例分析

一個(gè)配置好的樣子可能是這樣:

Nginx啟動(dòng)配置加載性能的示例分析

3.2 耗時(shí)位置定位

代碼中加變量記錄函數(shù)耗時(shí)總時(shí)間, 得到啟動(dòng)時(shí)耗時(shí)在2個(gè)步驟:

1) 解析配置文件, 對(duì)應(yīng)ngx_conf_parse函數(shù)

2) 初始化socket, 對(duì)應(yīng)ngx_open_listening_sockets函數(shù)

Nginx啟動(dòng)配置加載性能的示例分析

3.3 ngx_conf_parse耗時(shí)分析

主要是ngx_http_block函數(shù)的耗時(shí), 分為以下2個(gè)部分:

Nginx啟動(dòng)配置加載性能的示例分析

很明顯, ngx_http_add_addresses函數(shù)的性能消耗在對(duì)相同port已存在ip的查找上面, 這里用的是線性的遍歷查找,

且需要進(jìn)行字符串比較ngx_memcmp被執(zhí)行了2w*2w共4億次:

for (i = 0; i < port->addrs.nelts; i++) { // 遍歷查找, 如果配置文件中,相同port的IP過(guò)多,字符串比較帶來(lái)較大性能問(wèn)題, 2w個(gè)listen,這一塊耗時(shí)需要8s左右 if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) { continue; } /* the address is already in the address list */ // 找到對(duì)應(yīng)的ip, 添加cscf到IP if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) { return NGX_ERROR; }

3.4 ngx_open_listening_sockets耗時(shí)分析

函數(shù)中初始化所有l(wèi)istening的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啟動(dòng)配置加載性能的示例分析

對(duì)于同1個(gè)IP,新建不同port的socket相比新建多個(gè)不同IP的socket更省時(shí)間。

以上是“Nginx啟動(dòng)配置加載性能的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI