性能調優實戰案例1:mysql+tomcat+jvm+代碼

性能調優實戰案例1:mysql+tomcat+jvm+代碼

一、背景

使用JMeter對HTTP接口進行壓力測試時,響應很慢。

二、定位問題思路

1、定位耗時的SQL

查看Druid Monitor

2、定位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

(2)jvm的內存使用情況

jps
jstat
jinfo
jmap
jhat
jstack

三、調優思路

(1)mysql

建立主鍵
建立索引

(2)tomcat中間件

調整server.xml的參數,如配置-Xms4096M -Xmx4096M

# 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"

(3)jvm

調整catalina.sh的Xmx和Xms

<!-- 修改連接數限制-->
	<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:最大的等待隊列數,超過則拒絕請求
	-->

    <!-- 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"/>

     <!--
	    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 延遲時間。
	 -->

(4)代碼

for循環

大對象

sql語句

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