1. 程式人生 > >Nginx詳解二十六:Nginx架構篇之性能優化

Nginx詳解二十六:Nginx架構篇之性能優化

completed con fail ESS 業務 live zip pan tomcat

一、性能優化考慮點

  1、當前系統結構瓶頸

    通過壓力測試觀察指標、日誌檢測、性能分析

  2、了解業務模式

    接口業務類型、系統層次化結構

  3、性能與安全

二、ab接口壓力測試工具

1、安裝:yum -y install httpd-tools

技術分享圖片

2、使用:

ad -n 2000 -c 2 http://127.0.0.1
-n:總的請求數
-c:並發數
-k:是否開始長連接

準備環境

技術分享圖片

技術分享圖片

檢查語法,並重載
nginx -tc /etc/nginx/nginx.conf
nginx -s reload -c /etc/nginx/nginx.conf

技術分享圖片

執行壓測:ab -n 2000 -c 2 http://127.0.0.1/jesonc.html

技術分享圖片

CompletedCompleted表示進度,即當前完成多少個請求:

技術分享圖片

ab工具探測到的服務軟件:

技術分享圖片

文件路徑和body裏面返回的文件大小:

技術分享圖片

性能指標:

技術分享圖片

Concurrency Level: 設定的並發數
Time taken for tests: 壓測總共花費的時間
Complete requests: 總請求數
Failed requests: 失敗的個數
Requests per second:每秒請求數(TPS)
Time per request: 從客戶端來看,一個請求需要用到的時間
Time per request: 從服務端來看,處理一個請求要花費的時間

Transfer rate: 傳輸的速率

看一下動態接口,在tomcat9090下準備一個接口,實現訪問時等待5秒

技術分享圖片

啟動tomcat

技術分享圖片

確認接口可以訪問:curl -I 127.0.0.1/sleepjava.jsp

技術分享圖片

兩個並發跑20次看一下:ab -n 20 -c 2 http://127.0.0.1/sleepjava.jsp

技術分享圖片

技術分享圖片

以下演示可以證明Nginx做動靜分離的好處:

再壓一下jesonc.html這個靜態資源,10個並發跑2000次:ab -n 2000 -c 2 http://127.0.0.1/jesonc.html 技術分享圖片

TPS:8899.45

技術分享圖片

把/opt/app/code/cache/下的jesonc.html移走,觸發try_files訪問tomcat下的jesonc.html

技術分享圖片

還是10個並發跑2000次:ab -n 2000 -c 10 http://127.0.0.1/jesonc.html

技術分享圖片

TPS:128.72

技術分享圖片

可見,當把靜態資源放在Nginx上,性能比把靜態資源放tomcat上好得多

三、系統與Nginx性能優化

文件句柄:
linux/Unix上,一切皆文件,每一次用戶發起請求就會生成一個文件句柄,文件句柄可以理解為就是一個索引,所以文件句柄就會隨著請求量的增多,而進程調用的頻率增加,文件句柄的產生就越多,系統對文件句柄默認的限制是1024個,對Nginx來說非常小了,需要改大一點
設置方式:
系統全局性修改、用戶局部性修改、進程局部性修改

vim /etc/security/limits.conf

技術分享圖片

在End of file前面添加4個參數

技術分享圖片

root soft nofile 65535
root hard nofile 65535
* soft nofile 25535
* hard nofile 25535


soft:軟控制,到達設定值後,操作系統不會采取措施,只是發提醒
hard:硬控制,到達設定值後,操作系統會采取機制對當前進程進行限制,這個時候請求就會受到影響
root:這裏代表root用戶(系統全局性修改)
*:代表全局,即所有用戶都受此限制(用戶局部性修改)
nofile:指限制的是文件數的配置項
後面的數字即設定的值,一般設置10000左右

尤其在企業新裝的系統,這個地方應該根據實際情況進行設置,可以設置全局的,也可以設置用戶級別的

修改進程級別的限制

vim /etc/nginx/nginx.conf

技術分享圖片

在配置文件中添加一行:worker_rlimit_nofile 35535;

技術分享圖片

CPU的親和

把Nginx不同work工作的進程綁定到不同的CPU上,就能減少在work間不斷的切換CPU,減少性能損耗

第一種配置:指定worker綁定指定CPU

技術分享圖片

由於我的虛擬機是單核,所以就這樣配就行了

技術分享圖片

技術分享圖片

檢查語法,並重載
nginx -tc /etc/nginx/nginx.conf
nginx -s reload -c /etc/nginx/nginx.conf

技術分享圖片

查看nginxworker占用cpu核數的情況:ps -eo pid,args,psr | grep [n]ginx

由於我這裏是單核,所以只會有cpu0

技術分享圖片

也可以指定worker綁定到指定cpu上面

如以下配置,這樣會造成worker1和worker2都綁定到CPU1即第二個CPU上

技術分享圖片

第二種配置:指定worker能使用指定範圍的cpu

worker1可以使用cpu1、3、5、7、9、11、13、15
worker2可以使用cpu0、2、4、6、8、10、12、14

技術分享圖片

第三種配置:nginx自動綁定(Nginx1.9以後支持)

只要配置好worker數,並且配置為auto,Nginx就會自動進行配置1的方式的配置

技術分享圖片

Nginx通用配置優化

events:

worker_connections:Nginx限制每一個worker進程能處理多少個連接,默認1024個,可以適當調高

技術分享圖片

http:

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

#Charset
charset utf-8;

log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for" "$request_uri"‘;
access_log /var/log/nginx/access.log main;

#Core modlue
sendfile on;
#tcp_nopush on;
#tcp_nodeny on;
keepalive_timeout 65;

#Gzip module
gzip on;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;

#Virtal Server
include /etc/nginx/conf.d/*.conf;
}

技術分享圖片

charset utf-8:服務端返回給客戶端報文的時候,Nginx強行將報文轉碼為utf-8

gzip_disable "MSIE [1-6]\.":由於IE6對gzip壓縮支持的不是很好,所以這裏配置agent是IE6以下的版本,則不進行gzip壓縮

Nginx詳解二十六:Nginx架構篇之性能優化