天天看點

記一次壓力測試和對nginx/tomcat配置的調整

原文位址:還沒找到

是一個web系統,前端使用nginx做為反向代理,處理https,并将請求轉發給後端的tomcat服務。 

壓力測試工具選擇了jmeter。 首先簡單介紹一下jmeter。 它是apache的一個開源項目,基于java swing開發的GUI界面。 

jmeter提供了許多進階的功能,但我們僅僅使用了jmeter最簡單的功能。在簡單的jmeter使用中,我們涉及到這麼幾個概念:測試計劃,線程組,測試任務,和Listener。看下面的圖: 

在一個名為“測試”的測試計劃下, 我們建立了一個線程組。 這個線程組可以設定線程數,建立時間(在多長時間内建立出這麼多個線程),每個線程任務循環執行次數。 然後為這個線程組指派了一個http請求任務。 這個任務可以指定協定(http或https),伺服器, url,參數等。

接下來為這個http請求任務添加了一個aggregate graph類型的listener。 我們需要看最終的測試結果, 這個listener就是為我們記錄并展示結果的。

一切設定就緒之後,點選主界面上邊的“啟動”按鈕,就可以在aggregate graph中觀看測試結果了。 

嘗試着調整并發壓力測試的線程數,發現吞QPS留在600/sec,始終無法提升, 而此時cpu的消耗隻有40%左右,顯然cpu還未到瓶頸。 而https處理和這樣的web server,根據經驗瓶頸一般出現在cpu上,為什麼cpu還未到達瓶頸,qps就上不去了呢。

接下來我們在nginx的access log中增加了 $request_time這一項, 在tomcat服務中也打了日志觀測執行時間。 發現nginx的時間遠大于tomcat的處理時間。 原來瓶頸點在nginx這裡。 

嘗試優化一下nginx的參數,第一個看到的是,由于這是一台測試機,nginx采用的大部配置設定置都是預設設定,worker_processes參數被設定為1. 把這個數字調整為4的時候, QPS提升到了 1200, cpu使用率達到了99%. 看來這個就是這台測試機硬體配置的極限了。

在我們壓測的過程中, 通過netstat指令可以看到有很多nginx向tomcat發起的連接配接。 這些連接配接都是短連接配接,每次用完即關閉。于是想到nginx向後端源伺服器能否建立長連接配接的問題。檢視了一下文檔,nginx從1.1.4版本開始,支援proxy_pass的時候向後端源伺服器建立長連接配接。

根據官網的描述,若采用長連接配接,必須在proxy_pass的時候使用upstream的方式, 直接把後端源寫在proxy_pass後邊是不行的。 具體的配置方式如下: 

定義upstream: 

upstream lich { 

server 127.0.0.1:8081; 

keepalive 128; 

}

proxy_pass的地方: 

proxy_pass http://lich; 

proxy_http_version 1.1; 

proxy_set_header Connection "";

官方文檔在這裡:http://nginx.org/en/docs/http/ngx_http_upstream_module.html 

官方文檔中說:proxy_http_version和proxy_set_header這兩個配置是需要加上的。

不建議使用http 1.0通過Connection:Keep-Alive的方式。

配置完成之後重新測試,qps略微有一點提升。 但并不明顯。 為了驗證長連接配接是否生效, 同樣通過 netstat指令檢視連接配接。 發現連接配接到後端8081端口的nginx開啟的臨時端口不停的發生變化, 這證明了仍然是在采用短連結的方式。 那麼是誰先關閉連接配接的呢。 

通過tcpdump抓包發現, 首先發出 Fin 包的是tomcat。 也就是說, tomcat主動關閉的連接配接。

原來在tomcat的配置檔案中, 有關于keepalive的幾個參數。 包括每一個連接配接完成多少個http請求之後就關閉等。 詳細的參數可以參見tomcat的文檔。詳細的文檔應該看這裡:https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

對tomcat的connector進行了一些調整(包括maxKeepAliveRequests和keepAliveTimeout兩個參數,都設定成-1)之後, 再看連接配接,已經不會頻繁斷開并重建了。 QPS也提升到了900+.

盡管如此, nginx仍然是瓶頸,worker_processes設定為4個的時候,cpu可以利用到100%, QPS可以達到1200.

最後再做一個對比, 當jmeter繞過nginx,不走https而直接通路http的端口8081時,qps可以達到1500+。對比一下,對https的開銷大概有個概念。

繼續閱讀