通過壓力測試提升服務器併發性能實例

前言

前一段時間應領導要求,對公司服務端代碼進行簡單的壓力測試。測試發現,併發數只能維持在很小的值以內,比如模擬併發數超過100,失敗率就會大大提高。

在諮詢完後端搭建過程後發現,基本上所有的配置參數全部採用了默認處理,包括:數據庫、服務器、應用程序。然後就是各種查資料,發現上述提到的各個模塊都有很大的提升空間,需要開發人員自己配置。這一塊網上衆說紛紜:有的說改tomcat配置的(配置堆內存大小,jvm參數,IO流處理方式等);改連接池參數的(最大連接數、最小連接數、增值單位大小等)、改數據庫參數的(mysql工作模式、連接數等);提升服務器硬件配置(這個純屬扯淡,每個模塊沒有發揮出最大性能,僅僅提升硬件配置也是沒有的)。

以下是測試實例,通過一步一步修改各個模塊的參數,找到了影響併發量的關鍵問題,其中學到了很多知識。總結在最後。

測試環境

  • 服務器:tomcat7
  • 數據庫:mysql5.5
  • 連接池:c3p0
  • jdk:jdk7

壓力測試工具jmeter的使用

  • 詳細使用請自行查資料,這裏只介紹用到的模塊,可以滿足需求。
  • 使用步驟以及使用模塊如下

    1 添加測試組

    這裏寫圖片描述

    2 模擬用戶參數設置

    這裏寫圖片描述

    3 添加模擬請求接口

    這裏寫圖片描述

    4 配置接口參數

    這裏寫圖片描述

    5 添加實時測試概述(可以查看錯率率)

    這裏寫圖片描述

    6 添加查看結果樹(可以查看錯誤原因)

    這裏寫圖片描述

    7 啓動與停止

    這裏寫圖片描述

測試併發閥值

測試發現只要併發數大於100,失敗率一下子就會提上去;如果要小於100,失敗率基本上接近於0。由於當初沒有找到jmeter的【查看觀察樹】模塊,也不知道錯誤的原因,只能憑感覺去猜測錯誤原因。第一步想到的就是tomcat的參數原因。

嘗試優化一:修改tomcat配置

一、Tomcat 本身優化

之前文件介紹過的 Tomcat 連接器的三種方式: bio、nio 和 apr,三種方式性能差別很大,apr 的性能最優, bio 的性能最差。而 Tomcat 7 使用的 Connector 默認就啓用的 Apr 協議,但需要系統安裝 Apr 庫,否則就會使用 bio 方式。

  • 改爲nio,Tomcat安裝目錄/conf/server.xml,修改以下參數

修改之前:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

修改之後:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
二、JVM 優化

對於tomcat中jvm內存默認大小衆說紛紜,有的說Tomcat默認可以使用的內存爲128MB;有的說Tomcat啓動的初始內存其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。沒有找到確定說法。以下是修改jvm參數的方法:

使用startup.sh 啓動tomcat的解決方法
修改 TOMCAT_HOME/bin/catalina.sh
在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行:
JAVA_OPTS=”-server -XX:PermSize=512M -XX:MaxPermSize=1024m”
重啓tomcat

測試結果

測試結果表明,對於IO模式的修改對併發量有一定的提高,但是很少(當時測試,從併發100提升到了150,如果再提升併發數,失敗率就會上升)。對於jvm內存大小的提升,對併發量的提升沒有作用。

嘗試優化二:修改連接池參數

  • 參數解釋

    houseKeepingSleepTime:自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閒的連接就馬上回收,超時的銷燬 。
    houseKeepingTestSql:如果發現了空閒的數據庫連接.house keeper 將會用這個語句來測試.這個語句最好非常快的被執行.如果沒有定義,測試過程將會被忽略。
    maximumConnectionCount: 最大的數據庫連接數。
    minimumConnectionCount:最小的數據庫連接數。
    simultaneousBuildThrottle:可一次建立的最大連接數,增量單位,默認是10。
    prototypeCount:連接池中可用的連接數量.如果當前的連接池中的連接少於這個數值.新的連接將被建立(假設沒有超過最大可用數).例如.我們有3個活動連接2個可用連接,而我們的prototype-count是4,那麼數據庫連接池將試圖建立另外2個連接.這和 minimum-connection-count不同. minimum-connection-count把活動的連接也計算在內.prototype-count 是spare connections 的數量.

  • 默認參數:

    houseKeepingSleepTime=90000
    houseKeepingTestSql=select CURRENT_DATE
    maximumConnectionCount=100
    minimumConnectionCount=10
    simultaneousBuildThrottle=10
    prototypeCount=5

  • 修改後參數

    houseKeepingSleepTime=90000
    houseKeepingTestSql=select CURRENT_DATE
    maximumConnectionCount=1000
    minimumConnectionCount=100
    simultaneousBuildThrottle=100
    prototypeCount=50

測試結果

測試結果表明,修改上述連接池參數仍然不能提升併發量,仍然維持在100,併發量再大,失敗率就會提高。

嘗試優化三:修改mysql最大連接數

  • 查看mysql最大連接數

    通常,mysql的最大連接數默認是100, 最大可以達到16384。查看最大連接數:show variables like '%max_connections%';

  • 修改mysql最大連接數

    進入MySQL安裝目錄 打開MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改爲 max_connections=1000 服務裏重起MySQL即可。

  • 查看是否修改成功

    show variables like '%max_connections%';

測試結果

測試結果表明,最大併發量有了很大的提升,基本可以達到1000(提升了10倍!),並且失敗率不會提升(前提是項目連接池也修改了)。

總結

提升併發量主要需要修改兩塊地方:項目連接池最大連接數量;mysql最大連接量。

通過以上測試發現,影響併發量的關鍵因素在mysql默認的連接數與項目連接池的最大連接數(注意,連接池的最大連接數不要超過mysql的最大連接數)。其它地方參數的調整隻能說是“優化”服務器,並不能從根本上提高系統的併發量。

在調優的過程中,壓力測試工具Jmeter起到了很大的作用。在該工具的幫助下,可以模擬多用戶高併發訪問服務器,模擬環境;並且可以記錄出出錯的原因,根據錯誤原因,進行分析,找出問題所在。

這裏並不是說其它參數不重要,而是總結出影響併發量的關鍵因素。其它如jvm內存的調整、IO模式的調整在程序處理海量數據時、項目過大時都是需要考慮的關鍵因素。

Jmeter3.1下載

http://download.csdn.net/detail/wgyscsf/9745450

公衆號

每個正常工作日,我都會更新一篇有價值的技術文章。每天進步一點點,積少成多。歡迎關注。
https://img-blog.csdn.net/20160505082102433

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章