Nginx開啟一個(gè)參數(shù)就能讓你的WEB性能提升3倍的方法
一、遇到的一些問題
記得 2008 年做性能測試的時(shí)候,新進(jìn)7臺(tái) lenovo 4核4G 服務(wù)器用于性能測試。
當(dāng)時(shí)資源緊張,這7臺(tái)服務(wù)器都裝了雙系統(tǒng)(Win2003/CentOS5)空閑時(shí)用于做測試機(jī)(壓測的Agent)。
當(dāng)時(shí)給Nginx做了一系列測試,印象很深的是:在這批機(jī)器上,Nginx狀態(tài)頁面的壓測。
短連接的話最佳QPS約4萬,長連接的話最高QPS約13萬。
大概3年后,那批 lenovo 服務(wù)器已經(jīng)沒人瞧得上了,只能做肉雞。
然而,一次不經(jīng)意的測試,發(fā)現(xiàn)再牛的服務(wù)器,短連接最佳QPS也高不了多少。而且,測試機(jī)的資源沒用完,被測試服務(wù)器的資源也用不完,網(wǎng)絡(luò)也沒瓶頸。
服務(wù)器資源使用率很低,然而響應(yīng)就是不夠快。
最后,我們發(fā)現(xiàn)了瓶頸在監(jiān)聽的入口!是否可以提高監(jiān)聽入口的性能?是否可以端口復(fù)用?最后我們找到了SO_REUSEPORT。
SO_REUSEPORT支持多個(gè)進(jìn)程或者線程綁定到同一端口,提高服務(wù)器程序的性能。
二、解決方案
測試環(huán)境
Dell PowerEdge M620 Intel(R)Xeon(R)CPU E5–2620v2@2.10GHz
Linux3.16.0–4–amd64#1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04) x86_64 GNU/Linux
Ethernet controller:Broadcom Corporation NetXtreme II BCM5781010Gigabit Ethernet(rev10)
查看編譯參數(shù)

Nginx 配置如下:
注意有一個(gè)reuse_port參數(shù)
user www–data;
worker_processes auto;
pid/run/nginx.pid;
events{
useepoll;
multi_accept on;
reuse_port on;
worker_connections 1048576;
}
dso{# 動(dòng)態(tài)加載功能模塊 /usr/share/nginx/modules
load ngx_http_memcached_module.so;
load ngx_http_limit_conn_module.so;
load ngx_http_empty_gif_module.so;
load ngx_http_scgi_module.so;
load ngx_http_upstream_session_sticky_module.so;
load ngx_http_user_agent_module.so;
load ngx_http_referer_module.so;
load ngx_http_upstream_least_conn_module.so;
load ngx_http_uwsgi_module.so;
load ngx_http_reqstat_module.so;
load ngx_http_browser_module.so;
load ngx_http_limit_req_module.so;
load ngx_http_split_clients_module.so;
load ngx_http_upstream_ip_hash_module.so;
}
http{
include /etc/nginx/mime.types;
default_type text/plain;
access_log off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
keepalive_timeout 120;
server_names_hash_bucket_size512;
server_name_in_redirect off;
fastcgi_connect_timeout3s;
fastcgi_send_timeout3s;
fastcgi_read_timeout3s;
fastcgi_buffer_size128k;
fastcgi_buffers8128k;
fastcgi_busy_buffers_size256k;
fastcgi_temp_file_write_size256k;
variables_hash_max_size 1024;
set_real_ip_from10.0.0.0/8;
set_real_ip_from172.28.0.0/16;
set_real_ip_from192.168.0.0/16;
real_ip_headerX–Forwarded–For;
gzip off;
gzip_disable“msie6”;
gzip_min_length1k;
gzip_buffers1664k;
gzip_http_version1.1;
gzip_comp_level6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
ssl_protocols TLSv1 TLSv1.1TLSv1.2;# Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;
server{
listen 80backlog=65535;
charset utf–8;
location/{# 打印Tengine狀態(tài)頁
stub_status on;# 開啟狀態(tài)頁,依賴 http_stub_status_module 模塊
access_log off;#訪問過程不記日志
}
location~^(.*)\/\.(svn|git|hg|bzr|cvs)\/{# 屏蔽這些目錄
deny all;
access_log off;
log_not_found off;
}
location~/\.{# 屏蔽.開頭的目錄或文件,比如 .htaccess .bash_history
deny all;
access_log off;
log_not_found off;
}
location/do_not_delete.html{
access_log off;
empty_gif;
}
}
}
壓測 reuse_port
Tengine 早已支持 reuse_port 。開啟 reuse_port 后,你會(huì)發(fā)現(xiàn)有很多進(jìn)程同時(shí)監(jiān)聽80端口:

加壓后你會(huì)發(fā)現(xiàn),服務(wù)器性能可被你榨干:

對(duì)比一下測試 reuse_port 的效果,小伙伴們驚呆了(短連接QPS過了24萬)!

真相大白后,你還等什么?
探個(gè)究竟
測試過程中由于壓大 TCP: Possible SYN flooding on port 80. ,出大量錯(cuò)誤 。
于是將并發(fā)量降到了6萬 net.core.somaxconn = 65535 。
再關(guān)閉 reuse_port 后,我們看下 perf top的情況:

然后再打開 reuse_port ,對(duì)比 perf top 的情況:

此時(shí)再放大 Nginx 監(jiān)聽的 back_log ,看下資源使用情況:

我們來看看些時(shí)的隊(duì)列情況(有入隊(duì)過萬了):

然后我們?cè)賮硖魬?zhàn)30萬并發(fā)(MTT是平均響應(yīng)時(shí)間(ms)):

經(jīng)過一系列調(diào)優(yōu),相同環(huán)境相同并發(fā)量,沒有再出現(xiàn) TCP: Possible SYN flooding on port 80.。但出現(xiàn)了少量連接超時(shí)的情況:

至此測試完畢,開啟reuse_port確實(shí)可以讓性能提升3倍,何不試試。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Centos7安裝、卸載nginx及配置,配置成系統(tǒng)服務(wù)方式(一步到位)
這篇文章主要介紹了Centos7安裝、卸載nginx及配置,配置成系統(tǒng)服務(wù)方式(一步到位),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
詳解nginx實(shí)現(xiàn)ssl反向代理實(shí)戰(zhàn)
本篇文章主要介紹了nginx實(shí)現(xiàn)ssl反向代理實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Nginx配置的rewrite編寫時(shí)last與break的區(qū)別分析
這篇文章主要介紹了Nginx配置的rewrite編寫時(shí)last與break的區(qū)別分析,簡單來說使用last會(huì)對(duì)server標(biāo)簽重新發(fā)起請(qǐng)求,而break就直接使用當(dāng)前的location中的數(shù)據(jù)源來訪問,需要的朋友可以參考下2016-01-01
將樹莓派轉(zhuǎn)身為強(qiáng)大的Web服務(wù)器如何使用Nginx和cpolar實(shí)現(xiàn)遠(yuǎn)程訪問
這篇文章主要介紹了Nginx可視化管理工具結(jié)合cpolar實(shí)現(xiàn)遠(yuǎn)程訪問內(nèi)網(wǎng)服務(wù),相比其他 Web 服務(wù)器,Nginx 的內(nèi)存占用率非常低,可以在樹莓派等資源受限的設(shè)備上運(yùn)行,同時(shí)結(jié)合cpolar 內(nèi)網(wǎng)穿透工具即可實(shí)現(xiàn)遠(yuǎn)程訪問,需要的朋友可以參考下2023-09-09
Nginx多ip部署多站點(diǎn)的實(shí)現(xiàn)步驟
使用Nginx在具有多個(gè)IP地址的服務(wù)器上部署多個(gè)站點(diǎn),從而實(shí)現(xiàn)高效、安全的網(wǎng)站托管,本文主要介紹了Nginx多ip部署多站點(diǎn)的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-01-01
重啟或殺掉Nginx進(jìn)程后丟失nginx.pid的解決辦法

