一、性能優化考慮點
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壓縮