閱讀96 返回首頁    go 阿裏雲 go 技術社區[雲棲]


為什麼壓測性能低__負載均衡性能常見問題_常見問題_負載均衡-阿裏雲

我有一個HTTP負載均衡監聽,後麵掛了多個ECS,為什麼壓測性能跑不上去?

7層性能會比4層性能低

負載均衡集群采用LVS和Tengine實現,其中4層監聽經過LVS後直接到達後端服務器,而7層監聽經過LVS後,還需要再經過Tengine,最後達到後端服務器。就是說7層比4層多了一個處理環節,因此,7層性能沒有4層性能好。

除了7層本身的性能較4層低外,有的用戶發現7層性能很差,根本跑不上去,掛了兩台ECS的7層負載均衡監聽性能還不如一台ECS的性能,有可能是如下原因:

CASE1 客戶端端口不足

尤其容易發生在壓測的時候,客戶端端口不足會導致建立連接失敗,負載均衡默認會抹除tcp連接的timestamp屬性,linux協議棧的tw_reuse(time_wait狀態連接複用)無法生效,time_wait狀態連接堆積導致客戶端端口不足

解決方法:

客戶端端使用長連接代替短連接。

使用RST報文斷開連接(socket設置SO_LINGER屬性) ,而不是發FIN包這種方式斷開。

CASE2 後端服務器accept隊列滿

後端服務器accept隊列滿,導致後端服務器不回複syn_ack報文,客戶端超時。

解決方法:默認的net.core.somaxconn參數為128,執行sysctl -w net.core.somaxconn=1024 或者其它更大的值,並重啟後端服務器上的應用。

CASE3 後端服務器連接過多

由於架構設計的原因,使用7層負載均衡時,用戶長連接經過Tengine後變成短連接,可能造成後端服務器連接過多,從而表現為壓測性能上不去。

CASE4 後端服務器依賴的應用成為瓶頸

請求經過負載均衡達到後端服務器後,後端服務器本身負載都正常,但由於所有的後端服務器上的應用又依賴其它應用,比如數據庫,數據庫成為瓶頸,也會引起

CASE5 後端Server的健康檢查狀態異常

尤其在壓測的時候容易忽略後端Server的健康檢查狀態,如果有後端Server健康檢查失敗或者健康檢查狀態經常跳躍(好到壞,又從壞到好,反複變化)也會導致性能跑不上去。

壓測時的建議

基於以上分析,壓測時建議關注如下點

注意事項

壓測負載均衡轉發能力建議使用短鏈接

一般來說壓測除了驗證會話保持,均衡性等功能外,主要想驗證的是負載均衡的轉發能力,因此使用短鏈接比較合適,用於測試負載均衡和後端服務器處理能力。但使用短連接測試時注意上述的case1 的客戶端端口不足問題。

壓測負載均衡吞吐量建議使用長連接,用於測試帶寬上限或特殊業務

壓測工具的超時時間建議調小(5秒)。超時時間太大的話,測試結果會體現在平均RT加長,不利於判斷壓測水位是否已到達。超時時間調小,測試結果會體現在成功率上,便於快速判斷壓測水位

後端服務器提供一個靜態網頁用於壓測,以避免應用邏輯帶來的損耗(I/O, DB等)

壓測工具建議

不建議使用apache ab

ab在大並發場景下存在問題,會存在3s,6s,9s階梯式停頓的現象。ab會通過判斷content length來確定請求成敗,在負載均衡掛載多台後端服務器的時候,返回的content length不一致,會幹擾到測試結果

建議使用阿裏雲PTS (https://pts.aliyun.com)

可以選擇多個Client作為壓測源,測試結果清晰,並且可以通過配置監控,獲取壓測時後端服務器的性能數據

壓測建議的配置要求

以下設置僅用於壓測負載均衡能力,並不表示用戶生產環境也需要如此設置

監聽不開啟會話保持功能,否則壓力會集中在個別的後端服務器

監聽關閉健康檢查功能,減少健康檢查請求對後端服務器的訪問請求

用多個client(>5)進行壓測,源IP分散,能夠更好的模擬線上實際情況

使用PTS簡單壓測示例

購買兩台ECS用作後端服務器,購買一個負載均衡實例用於提供負載均衡服務,並且綁定之前購買的ECS作為後端服務器,分別創建TCP、HTTP監聽各一個,後端端口80。ECS服務器信息可以為:(CPU 1核,內存 512M, CentOS 6.3 64位)

安裝apache web server,用於提供web服務

yum install -y httpd

初始化默認首頁index.html

echo "testvm" > /var/www/html/index.html

啟動http服務

service httpd start

訪問本機80端口,確認web服務可用 curl localhost

在PTS中創建測試腳本,開始壓測

注意關閉長連接和設置超時時間

超時時間5秒 PTS.HttpUtilities.setTimeout(5000)

關閉長連接 PTS.HttpUtilities.setKeepAlive(False)

最後更新:2016-11-23 17:16:04

  上一篇:go 負載均衡支持多可用區__負載均衡如何容災_常見問題_負載均衡-阿裏雲
  下一篇:go 負載均衡性能指標__負載均衡性能常見問題_常見問題_負載均衡-阿裏雲