Nginx開啟一個參數(shù)就能讓你的WEB性能提升3倍的方法
一、遇到的一些問題
記得 2008 年做性能測試的時候,新進(jìn)7臺 lenovo 4核4G 服務(wù)器用于性能測試。
當(dāng)時資源緊張,這7臺服務(wù)器都裝了雙系統(tǒng)(Win2003/CentOS5)空閑時用于做測試機(jī)(壓測的Agent)。
當(dāng)時給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支持多個進(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 配置如下:
注意有一個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{# 動態(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 后,你會發(fā)現(xiàn)有很多進(jìn)程同時監(jiān)聽80端口:
加壓后你會發(fā)現(xiàn),服務(wù)器性能可被你榨干:
對比一下測試 reuse_port 的效果,小伙伴們驚呆了(短連接QPS過了24萬)!
真相大白后,你還等什么?
探個究竟
測試過程中由于壓大 TCP: Possible SYN flooding on port 80. ,出大量錯誤 。
于是將并發(fā)量降到了6萬 net.core.somaxconn = 65535 。
再關(guān)閉 reuse_port 后,我們看下 perf top的情況:
然后再打開 reuse_port ,對比 perf top 的情況:
此時再放大 Nginx 監(jiān)聽的 back_log ,看下資源使用情況:
我們來看看些時的隊列情況(有入隊過萬了):
然后我們再來挑戰(zhàn)30萬并發(fā)(MTT是平均響應(yīng)時間(ms)):
經(jīng)過一系列調(diào)優(yōu),相同環(huán)境相同并發(fā)量,沒有再出現(xiàn) TCP: Possible SYN flooding on port 80.。但出現(xiàn)了少量連接超時的情況:
至此測試完畢,開啟reuse_port確實(shí)可以讓性能提升3倍,何不試試。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx配置統(tǒng)計流量帶寬請求及記錄實(shí)時請求狀態(tài)的方法
這篇文章主要介紹了Nginx中配置統(tǒng)計流量帶寬請求及記錄實(shí)時請求狀態(tài)的方法,分別用到了ngx_req_status和ngx_realtime_request模塊,需要的朋友可以參考下2016-01-01Nginx+Windows搭建域名訪問環(huán)境的操作方法
這篇文章主要介紹了Nginx搭建域名訪問環(huán)境,包括nginx配置文件的相關(guān)介紹及對nginx配置文件的分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03Nginx HTTPS實(shí)現(xiàn)原理及配置實(shí)踐
本文主要介紹了Nginx HTTPS實(shí)現(xiàn)原理及配置實(shí)踐,詳細(xì)的介紹了HTTPS原理,實(shí)現(xiàn)及其HTTPS單臺配置實(shí)踐,集群配置、優(yōu)化等,具有一定的參考價值,感興趣的可以了解一下2023-09-09Nginx 請求壓縮的實(shí)現(xiàn)(動態(tài)壓縮,靜態(tài)壓縮)
本文主要介紹了Nginx 請求壓縮的實(shí)現(xiàn)(動態(tài)壓縮,靜態(tài)壓縮),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Nginx配置http和https的實(shí)現(xiàn)步驟
Nginx是使用最多的代理服務(wù)器之一,本文主要介紹了Nginx配置http和https的實(shí)現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下2024-03-03Nginx 502 Bad Gateway錯誤常見的4種原因和解決方法
這篇文章主要介紹了Nginx 502 Bad Gateway錯誤常見的4種原因和解決方法,本文適用FastCGI環(huán)境,其中多數(shù)原因通過配置相關(guān)參數(shù)即可解決,需要的朋友可以參考下2015-05-05nginx?某些url只能由特定ip訪問的實(shí)現(xiàn)
在Nginx中針對某些URL只允許特定IP地址訪問,本文就來介紹一下如何實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09