1、背景
使用JMeter對HTTP接口進行壓力測試時,響應很慢。javascript
2、定位問題思路
一、定位耗時的SQL
查看Druid Monitorcss
二、定位jvm參數
(1)查看linux服務器的配置信息
# Linux查看版本當前操做系統內核信息
uname -a
# Linux查看當前操做系統版本信息
cat /proc/version
# Linux查看版本當前操做系統發行版信息
cat /etc/issue 或 cat /etc/redhat-release
# Linux查看cpu相關信息,包括型號、主頻、內核信息等
cat /proc/cpuinfo
# Linux查看版本說明當前CPU運行在32bit模式下, 但不表明CPU不支持64bit
getconf LONG_BIT
# 查看硬盤使用情況
df -h
# 查看內存使用情況
free -m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(2)jvm的內存使用狀況
jps
jstat
jinfo
jmap
jhat
jstack
1
2
3
4
5
6
3、調優思路
(1)mysql
創建主鍵
創建索引html
(2)tomcat中間件
調整server.xml的參數,如配置-Xms4096M -Xmx4096Mjava
# Register custom URL handlers
# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Xms4096M -Xmx4096M"
1
2
3
(3)jvm
調整catalina.sh的Xmx和Xmsmysql
<!-- 修改鏈接數限制-->
<Executor
name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="300"
minSpareThreads="50"
maxIdleTime="60000"
prestartminSpareThreads = "true"
maxQueueSize = "100"
/>
<!--
maxThreads:最大併發數,默認設置 200,通常建議在 500 ~ 800,根據硬件設施和業務來判斷
minSpareThreads:Tomcat 初始化時建立的線程數,默認設置 25
maxIdleTime:若是當前線程大於初始化線程,那空閒線程存活的時間,單位毫秒,默認60000=60秒=1分鐘。
prestartminSpareThreads:在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,若是不等於 true,minSpareThreads 的值就沒啥效果了
maxQueueSize:最大的等待隊列數,超過則拒絕請求
-->linux
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<!-- 參數優化配置-->
<Connector
executor="tomcatThreadPool"
port="8081"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="60000"
maxConnections="10000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
maxHttpHeaderSize="8192"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
acceptorThreadCount="2"
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
URIEncoding="utf-8"
processorCache="20000"
tcpNoDelay="true"
connectionLinger="5"/>web
<!--
executor:線程池模式
port:應用端口
protocol:Tomcat 8 設置 nio2 更好
connectionTimeout:Connector接受一個鏈接後等待的時間(milliseconds),默認值是60000。
maxConnections:這個值表示最多能夠有多少個socket鏈接到tomcat上
redirectPort:重定向https端口
enableLookups:禁用DNS查詢
acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值爲100。
maxPostSize:設置由容器解析的URL參數的最大長度,-1(小於0)爲禁用這個屬性,默認爲2097152(2M)
maxHttpHeaderSize:http請求頭信息的最大程度,超過此長度的部分不予處理。通常8K。
compression:是否啓用GZIP壓縮 on爲啓用(文本數據壓縮) off爲不啓用, force 壓縮全部數據
disableUploadTimeout:這個標誌容許servlet容器使用一個不一樣的,一般長在數據上傳鏈接超時。 若是不指定,這個屬性被設置爲true,表示禁用該時間超時。
compressionMinSize:當超過最小數據大小才進行壓縮
acceptorThreadCount:用於接受鏈接的線程數量。增長這個值在多CPU的機器上,儘管你永遠不會真正須要超過2。 也有不少非維持鏈接,您可能但願增長這個值。默認值是1。
compressableMimeType:配置想壓縮的數據類型
URIEncoding:網站通常採用UTF-8做爲默認編碼。
processorCache:協議處理器緩存的處理器對象來提升性能。 該設置決定多少這些對象的緩存。-1意味着無限的,默認是200。 若是不使用Servlet 3.0異步處理,默認是使用同樣的maxThreads設置。 若是使用Servlet 3.0異步處理,默認是使用大maxThreads和預期的併發請求的最大數量(同步和異步)。
tcpNoDelay:若是設置爲true,TCP_NO_DELAY選項將被設置在服務器套接字,而在大多數狀況下提升性能。這是默認設置爲true。
connectionLinger:秒數在這個鏈接器將持續使用的套接字時關閉。默認值是 -1,禁用socket 延遲時間。
-->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
(4)代碼
for循環sql
大對象apache
sql語句
json