效能優化(一 測試環境準備)
一。 使用vmware 建立CentOS 環境
安裝 redis 使用tomcat 連線宿主機器上的mysql 使用jmater 進行壓力測試
centos 配置 由於是vm 記憶體3G 處理2 cpu 宿主機 i5-9400F jmeter 測試 1.建立執行緒 2. 使用階段 使用一個api 進行請求 3. 起始使用 1500 進行檢視 500 個請求 ![](https://img2020.cnblogs.com/blog/883541/202009/883541-20200922135330864-1310374452.png) 存在一些異常資訊 取樣結果 Thread Name:192.168.31.195測試 1-204 Sample Start:2020-09-22 13:50:03 CST Load time:119 Connect Time:119 Latency:0 Size in bytes:2374 Sent bytes:0 Headers size in bytes:0 Body size in bytes:2374 Sample Count:1 Error Count:1 Data type ("text"|"bin"|""):text Response code:Non HTTP response code: java.net.SocketException Response message:Non HTTP response message: Broken pipe (Write failed) HTTPSampleResult fields: ContentType: DataEncoding: null 響應資料 java.net.SocketException: Broken pipe (Write failed) at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) at java.net.SocketOutputStream.write(SocketOutputStream.java:155) at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124) at org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:136) at org.apache.http.impl.io.SessionOutputBufferImpl.flush(SessionOutputBufferImpl.java:144) at org.apache.http.impl.BHttpConnectionBase.doFlush(BHttpConnectionBase.java:174) at org.apache.http.impl.DefaultBHttpClientConnection.flush(DefaultBHttpClientConnection.java:183) at org.apache.http.impl.conn.CPoolProxy.flush(CPoolProxy.java:167) at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:241) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$2.doSendRequest(HTTPHC4Impl.java:454) at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:930) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:641) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1281) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1270) at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:630) at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) at java.lang.Thread.run(Thread.java:748)
1000個 請求報錯
org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Operation timed out (Connection timed out)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$JMeterDefaultHttpClientConnectionOperator.connect(HTTPHC4Impl.java:401)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:401)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:930)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:641)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1281)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1270)
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:630)
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558)
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Operation timed out (Connection timed out)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
at java.net.Socket.connect(Socket.java:606)
at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
... 19 more
以上使用的配置為 預設配置 ====================================開始優化=============================== 1. 設定tomcat catalina.sh 新增 JAVA_OPTS=$JAVA_OPTS -server -Xms1024m -Xmx1024m 對 1000 請求異常 未見效果 2.配置nginx events { use epoll; worker_connections 655350; # worker_rlimit_nofile 65535; multi_accept on; } 配置後請求 仍舊無效 3. 檢視 centos 系統可以開啟的最大檔案數 ulimit -n 執行命令 [root@www ~]# vi /etc/security/limits.conf
End of file
-
soft core unlimit
-
hard core unlimit
-
soft fsize unlimited
-
hard fsize unlimited
-
soft data unlimited
-
hard data unlimited
-
soft nproc 65535
-
hard nproc 63535
-
soft stack unlimited
-
hard stack unlimited
-
soft nofile 409600
-
hard nofile 409600 以上的調整後 還是 對 1000個請求 沒有影響 4. 設定tomcat 的配置資訊 1> 開啟後臺管理 在/conf/tomcat-users.xml檔案中的<tomcat-users>標籤裡面新增如下內容 <!-- 修改配置檔案,配置tomcat的管理使用者 --> <role rolename="manager"/> <role rolename="manager-gui"/> <role rolename="admin"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/> 如果是tomcat7,配置了tomcat使用者就可以登入系統了,但是tomcat8中不行,還需要修改另一個配置檔案,否則訪問不了,提示403,開啟webapps/manager/META-INF/context.xml檔案 <!-- 將Valve標籤的內容註釋掉,儲存退出即可 -->
將以上的方式 儲存退出後 重啟 tomcat 訪問8080 埠 點選 Server Status 輸入上邊配置的使用者名稱 和 密碼 就能檢視當前 tomcat 的狀態資訊了
![](https://img2020.cnblogs.com/blog/883541/202009/883541-20200922145314920-1666233060.png)
對於tomcat 進行優化
======== 建立執行緒池 增大執行緒池數量
<!--將註釋開啟-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>
<!--
引數說明:
maxThreads:最大併發數,預設設定 200,一般建議在 500 ~ 1000,根據硬體設施和業務來判斷
minSpareThreads:Tomcat 初始化時建立的執行緒數,預設設定 25
prestartminSpareThreads: 在 Tomcat 初始化的時候就初始化 minSpareThreads 的引數值,如果不等於 true,minSpareThreads 的值就沒啥效果了
maxQueueSize,最大的等待佇列數,超過則拒絕請求
-->
<!--在Connector中設定executor屬性指向上面的執行器-->
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改連線池後重啟tomcat 在觀察 測試1000併發時的資料 結果是 對 1000 壓力測試還是有一半 結果 還是原來的異常
修改tomcat 的 執行方式
bio
效能非常低下,沒有經過任何優化處理和支援
nio
nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的併發執行效能。Tomcat8預設使用nio執行模式。
apr
安裝起來最困難,但是從作業系統級別來解決非同步的IO問題,大幅度的提高效能
對於每種協議,Tomcat都提供了對應的I/O方式的實現,而且Tomcat官方還提供了在每種協議下每種I/O實現方案的差異, HTTP協議下的處理方式如下表
![](https://img2020.cnblogs.com/blog/883541/202009/883541-20200922150454008-582716505.png)
tomcat 中建議使用 nio tomcat8 預設使用的nio2 所以這個修改作用不大
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
調整nginx 的keepalive
upstream butterfly {
server 127.0.0.1:8080;
keepalive 20;
}
http {
# 設定 請求緩衝
client_header_buffer_size 128k;
}
設定請求緩衝中有 效果 異常資訊 狀態 由 49% --> 37%
nginx重新 優化
http{
sendfile on;
tcp_nopush on;
keepalive_timeout 120;
tcp_nodelay on;
}
nginx 設定錯誤日誌 在全域性配置對應的錯誤日誌資訊 error_log logs/error.log error;
centos 核心優化
核心配置檔案 cat /etc/sysctl.conf