目標:java
對tomcat線程擴容mysql
對應的線程池作變動web
keepAlive作優化spring
1.修改主機的host,dns解析優先解析主機上hosts的地址:sql
sudo vim //etc/hosts
在hosts末尾加上一句:數據庫
120.79.75.103:miaoshaserver
2.在jmeter的高級中設置成java,而且將keepAlive的選項打勾,,這樣能夠將損耗降到最小apache
3.在阿里雲主機上:vim
pstree -p 16644 //16644是程序的端口號
pstree -p 16644 | wc -l. //能夠查看默認tomcat總共起了幾個端口
top -H //能夠查看端口信息
4.在tomcat
5.經驗來講4核8g的虛擬機最合適的最大線程數爲800,最小的100是爲了解決突發問題,當有請求突發訪問的時候能夠解決。繼續vim application.propertiesspringboot
server.port=8090 spring.tomcat.accept-count=1000 //隊列等待長度 spring.tomcat.max-threads=800 spring.tomcat.min-spare-threads=100
重啓:./deploy.sh &
6.以後使用jmeter工具測試後發現(2000個線程,10秒,100次循環),用pstree -p 16644 | wc -l 後發現最大的tomcat線程數達到了472個,在以前只有40個。
7.再次強調jmeter中keepAlive選項要打勾的緣由:服務端與客戶端連接的時候,客戶端訪問服務端創建一個keepAlive的連接,用處就是,當客戶端請求服務端響應以後,服務端不要立馬斷開連接,而是等待着嘗試着複用連接,解決了http響應的無狀態的每次都要斷開連接形成的耗時問題,最先的http1.0的時候是沒有keepAlive的請求的,由於資源稀缺,你想,若是每次都客戶端請求完都keepAlive不斷開,那麼服務端的連接數很快就會被用完了。長連接有個好處就是不用每次都斷開又新建,減小時耗,尤爲是如今不少手機移動端和複雜網絡,用戶須要不斷訪問服務端,這樣就只要傳輸數據就能夠了,可是這樣也有兩個問題:
1.好比有的用戶以後就沒後續操做了,就把網頁放在那裏了,那這個長連接就是個廢連接。
2.ddos的攻擊,一些惡意者發起的攻擊,也就是發送不少無腦的包,成爲攻擊者開的後門。
所以須要定製化tomcat的內嵌化開發,這些定製都是在服務端上的
最後。
建立config包,並建立WebServerConfiguration類:當spring容器加載完容器的最後還有一次能夠修改,即利用http11NioProtocol定製化需求
package com.imooc.miaoshaproject.config; import org.apache.catalina.connector.Connector; import org.apache.coyote.http11.Http11NioProtocol; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; //當spring容器內沒有TomcatEmbededServletContainerFactory這個bean時,會把此bean加載進來 @Component //讓springboot能夠把它加載爲一個bean public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> { @Override public void customize(ConfigurableWebServerFactory factory) { // 使用對應工廠類提供給咱們的接口定製化咱們的tomcat connector ( (TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler(); //定製化keepAliveTimeOut protocol.setSelectorTimeout(30000);//30s,30s沒有請求服務,自動斷開 //當請求超過10000條就自動斷開keepAlive連接 protocol.setMaxKeepAliveRequests(10000); } }); } }
最後在來講一關於單機4核8g的線程數的拐點,通過壓力測試能夠得出經驗是在800,雖說服務器的tps吞吐量會隨着線程數的增多而增多,,可是若是線程數超過了配置的對應拐點後,反而不會增多,由於cup處理不過來這麼多線程,忙於線程調度,吞吐量天然上不去。
當線程超過800後會進入緩衝池,可是也不能太長,由於太消耗內存了,隊列出隊也消耗cpu,因此設置在1000-2000左右就能夠了,超過的就拒絕連接
此次壓測主要是數據庫mysqld的速度過慢,
通常狀況下主鍵查詢和惟一索引查詢是能接受的查詢,一旦到非惟一索引查詢,尤爲對大企業而言,好比訂單狀態查詢訂單,這種幾近於全表掃描對數據庫的壓力是很大的,企業不會接受這種狀況。因此後期通常都會分庫分表,擴容數據來解決。