雲端部署,性能壓測
在雲端的部署秒殺項目的方案及雲端部署的意義,引入了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、雲端部署應用服務研發環境
- 本地在項目根目錄下適用mvn clean package打包生成miaosh.jar文件;
- 將jar包服務上傳到服務端並編寫額外的application.propertities配置文件;
- 編寫deploy.sh腳本啓動對應的項目;
nohup java -Xms2048m -Xmx2048m -XX:NewSize=1024m -XX:MaxNewSize=1024m -jar miaosha.jar -sping.config.addtitionlocation=/var/www/miaosha/application.properties
- 使用deploy.sh&啓動應用程序;
- 打開阿里雲的網絡安全組配置,將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調優
- 優化連接配置.這裏以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" />
- 利用緩存和壓縮
對於靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這裏我們採用了 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容量問題 ;