Java電商秒殺系統性能優化(二)——雲端部署,性能壓測【從本地調試到雲端上線的必經之路】


在雲端的部署秒殺項目的方案及雲端部署的意義,引入了jmeter壓測工具完成了性能的摸底測試,發現容器等基礎配置的性能瓶頸並進行性能優化;

雲端部署流程


1、 雲端部署硬件功能

  • 去阿里雲或者騰訊雲註冊一個賬號;
  • 購買ecs服務器,學生有價格優惠,可以選擇包月或者按需選擇;

2、雲端部署java環境

  • 從oracle官網下載1.8rpm安裝包並上傳到服務器;
  • 適用rpm -ivh ***.rpm安裝jdk

3、雲端部署MySQL數據庫環境

 1. yum install mysql* yum install mariadb-server  //安裝mysql;
 2. systemctl start mariadb.service //啓動mysql
 3. mysqldadmin -u root password   //修改root的密碼
 4. mysql -uroot -ppassword  //連接mysql
 5. mysqldump -uroot -proot -databases miaosha> miaosha.sql 備份數據庫
 6. 上傳數據文件到服務器上
 7. mysql -uroot  -proot < miaosha.sql 恢復數據文件

4、雲端部署應用服務研發環境

  1. 本地在項目根目錄下適用mvn clean package打包生成miaosh.jar文件;
  2. 將jar包服務上傳到服務端並編寫額外的application.propertities配置文件;
  3. 編寫deploy.sh腳本啓動對應的項目;
nohup java -Xms2048m -Xmx2048m -XX:NewSize=1024m -XX:MaxNewSize=1024m -jar miaosha.jar -sping.config.addtitionlocation=/var/www/miaosha/application.properties
  1. 使用deploy.sh&啓動應用程序;
  2. 打開阿里雲的網絡安全組配置,將80端口開放給外網可以使用;

參數說明:
java: java命令啓動,設置JVM的初始大小和最大內存爲2048m,2個G,設置JVM中初始新生代和最大新生代大小爲1024m,設置成一樣的目的是爲了減少擴展jvm內存池過程中向操作系統索要分配的消耗;

性能壓測,發現併發容量問題


jmeter性能壓測

採用jmeter進性能壓測, KeepAlive採用長連接,向服務端發送請求之後,希望服務端不要立刻斷開連接,而是等待複用連接;

  • 線程組(組裝線程池)
    啓動多個線程,併發測試服務端的壓力;
    線程組參數: 線程數:100/ Ramp-Up時間:10/循環次數:10
  • Http請求 右鍵線程組添加HTTP請求,協議http
  • 查看結果樹,右鍵監聽器,查看結果樹;
  • 聚合報告

發現容量問題

在安裝完jmeter之後,對項目進行性能壓測,發現server端的併發線程數上不去;
採用 pstree -p 進程號|wc -l 查看線程數;採用top -H查看機器性能;

Tomcat性能優化


Tomcat的作用

Tomcat是一個輕量級應用服務器,是支持運行Servlet/JSP應用程序的容器,運行在jvm上,綁定IP地址並監聽TCP端口;運行時佔用的系統資源小,擴展性好,支持負載平衡與郵件服務等開發應用系統常用的功能;

在做web項目時多數需要http協議,基於請求和響應,servlet就是在服務器端運行的java程序,通過配置文件攔截你的請求,並進行相應處理,然後展示給你相應界面;Tomcat就可以創建servlet,去運行web項目,相當於一個應用服務器,作爲serlet的容器;

Tomcat的調用過程

  • tomcat要能夠同時接收多個客戶端發來的請求,那麼就需要多線程;
  • tomcat想要調用servlet就是得到這個servlet對象和類所在地址的映射關係;
  • tomcat本身並不知道客戶端會訪問哪一個servlet,所以tomcat必須要能夠動態的去調用servlet對象,那麼就需要用到java的反射機制;
  • 定位到具體的servlet並調用get或post方法並響應客戶端;

Tomcat默認內嵌配置


打開Springboot項目中,雙擊shift,搜索spring-configuration-metadata.json文件,可以查看各個節點的配置;

tomcat默認參數是爲開發環境制定,而非適合生產環境,尤其是內存和線程的配置,默認都很低,容易成爲性能瓶頸;

  • server.tomcat.accept-count:等待隊列長度。默認100;
  • server.tomcat.max-connections:最大可被連接數,默認10000
  • server.tomcat.max-threads:最大工作線程數,默認200
  • server.tomcat.min-spare-threads:最小線程數,默認10
  • 默認配置下,連接超過10000後出現拒絕連接情況;
  • 默認配置下,觸發的請求超過200+100後拒絕處理;

定製化內嵌Tomcat開發

  • keepAliveTimeOut:多少毫秒後不響應的斷開keepalive(設置在服務端上)
  • maxKeepAliveRequests:多少次請求後keepalive斷開失效
  • 使用WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>定製化內嵌tomcat配置

Tomcat調優

  1. 優化連接配置.這裏以tomcat7的參數配置爲例,需要修改conf/server.xml文件,修改連接數,關閉客戶端dns查詢
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />
  1. 利用緩存和壓縮
    對於靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這裏我們採用了 Nginx 作爲緩存服務器,將圖片、css、js 文件都進行了緩存,有效的減少了後端 tomcat 的訪問。

可以用 gzip 壓縮,其實很多圖片也可以用圖像處理工具預先進行壓縮,找到一個平衡點可以讓畫質損失很小而文件可以減小很多;

  • 採用集羣,實現橫向擴展,那麼組建 tomcat 集羣是有效提升性能;

內存調優:設置JVM的一些參數
-Xmx3550m -最大可用內存;
-Xms3550m -JVM促使內存爲3550m;
-Xmn2g 年輕代大小爲2G;
-Xss128k -設置每個線程的堆棧大小;
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)設置爲4,則年輕代與年老代所佔比值爲1:4;
-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4;
-XX:MaxPermSize=16m:設置持久代大小爲16m;
-XX:MaxTenuringThreshold=0:設置垃圾最大年齡;

發現容量問題

響應時間長,TPS也上不去;

  • 單個Web容器有上限
    線程數量:4核cpu 8G內存單進程調度線程數800-1000以上後即花費巨大的時間在cpu調度上;
    等待隊列長度:隊列做緩衝池用,但也不能無限長,消耗內存,出隊入隊也耗cpu;

  • Mysql數據庫QPS容量問題
    主鍵查詢:千萬級別數據 1-10毫秒
    唯一索引查詢:千萬級別數據=10-100毫秒
    非唯一索引查詢:千萬級別數據=100-1000毫秒
    無索引:百萬條數據=1000毫秒+

  • Mysql數據庫TPS容量問題

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