一般調(diào)優(yōu)的基本過程
1.明了需要調(diào)優(yōu)的系統(tǒng)架構(gòu)
2.設(shè)定性能調(diào)優(yōu)的目標
3.明了目標當前的性能情況
4.找出目前的性能瓶頸的所在
5.解決引起性能瓶頸的根本問題
6.重復(fù)以上過程直到達到設(shè)定目標性能為止
性能指標
崩潰點:同時多少并發(fā)的時候,服務(wù)器Down掉?
吞吐量:多少人一起來,都沒問題尺锚?
并發(fā)數(shù):每秒能處理多少人猪腕?
響應(yīng)時間:每人需要等待的時間多長生均?
調(diào)優(yōu)點:
硬件配置優(yōu)化:
虛擬機
物理機
CPU
內(nèi)存
磁盤IO
網(wǎng)絡(luò)
操作系統(tǒng)優(yōu)化
JVM參數(shù)優(yōu)化
-Xms:設(shè)置jvm內(nèi)存的初始大小
-Xmx:設(shè)置jvm內(nèi)存的最大值
-Xmn:設(shè)置新域的大猩莼搿(這個似乎只對 jdk1.4來說是有效的,后來就廢棄了)
-Xss:設(shè)置每個線程的堆棧大小(也就是說,在相同物理內(nèi)存下怕吴,減小這個值能生成更多的線程)
-XX:NewRatio :設(shè)置新域與舊域之比,如-XX:NewRatio = 4就表示新域與舊域之比為1:4
-XX:NewSize:設(shè)置新域的初始值
-XX:MaxNewSize :設(shè)置新域的最大值
-XX:PermSize:設(shè)置永久域的初始值
-XX:MaxPermSize:設(shè)置永久域的最大值
-XX:SurvivorRatio=n:設(shè)置新域中Eden區(qū)與兩個Survivor區(qū)的比值县踢。(Eden區(qū)主要是用來存放新生的對象转绷,而兩個 Survivor區(qū)則用來存放每次垃圾回收后存活下來的對象)
容器優(yōu)化
- 線程池
<jetty>
線程池線程資源大小確定了服務(wù)器的服務(wù)能力
默認大小不一定能滿足生產(chǎn)環(huán)境
線程分配方式?jīng)Q定了服務(wù)器的資源利用效率
固定線程數(shù)處理多任務(wù),代表:JDK的ThreadPoolExecutor
以最大線程數(shù)為限處理多任務(wù),代表:Jetty自帶QueuedThreadPool
<tomcat>
maxThreads:表示最多同時處理的連接數(shù)殿雪。應(yīng)該將線程數(shù)(最大線程數(shù))設(shè)置比最大預(yù)期負載(同時并發(fā)的點擊)多25%(經(jīng)驗規(guī)則)(低配置用戶可通過降低maxThreads并同時增大
acceptCount值來保證系統(tǒng)的穩(wěn)定)暇咆。
acceptCount:當同時連接的人數(shù)達到maxThreads時,還可以接收排隊的連接丙曙。
minSpareThread:指“啟動以后爸业,總是保持該數(shù)量的線程空閑等待”;設(shè)置比預(yù)期負載多25%亏镰。
maxSpareThread:指“如果超過了minSpareThread扯旷,然后總是保持該數(shù)量的線程空閑等待”;設(shè)置比預(yù)期負載多25%索抓。
其中主要修改兩個參數(shù)maxThreads和acceptCount值钧忽。增加maxThreads,減少acceptCount值有利縮短系統(tǒng)的響應(yīng)時間逼肯。但是maxThreads和acceptCount的總和最高值不能超過6000耸黑,而且
maxThreads過大會增加CPU和內(nèi)存消耗,故低配置用戶可通過降低maxThreads并同時增大acceptCount值來保證系統(tǒng)的穩(wěn)定篮幢。
connectionTimeout:連接超時大刊,最大超時時間,當響應(yīng)速度慢的時候三椿,通過調(diào)整該參數(shù)缺菌,來平衡正確率和服務(wù)器資源的回收。
- Connectors
選擇Connector時搜锰,需要考慮應(yīng)用自身的特點伴郁,例如股票、聊天室.
TCP 連接數(shù) Keep-Alive Java BIO Connectors SocketConnector (HTTP)
Ajp13SocketConnector (AJP) SslSocketConnector(SSL)
Java NIO Connectors electChannelConnector(HTTP) SslSelectChannelConnector(SSL)
Acceptors 表示同時在監(jiān)聽read事件的線程數(shù)
默認值是 1 典型值范圍 1~(處理器內(nèi)核數(shù)+1)
對于NIO 來說蛋叼,設(shè)置為(處理器內(nèi)核數(shù)+1)比較合適
maxIdleTime 表示連接最大空閑時間 默認值是 200000焊傅,一般這個值都太大了
典型值 3000 左右足夠
對AJP來說一般設(shè)置為-1剂陡,表示連接需要一直保持
LowResourcesMaxIdleTime 表示線程資源稀少時的maxIdleTime 默認值是 -1,表示沒有設(shè)置
一般設(shè)置值應(yīng)該<=maxIdleTime
lowResourcesConnections 只有NIO才有這個設(shè)置狐胎,表示連接空閑時的連接數(shù)鹏倘,大于這個數(shù)將被shutdown
默認值是 0,表示該設(shè)置沒有生效 每個acceptor的連接數(shù)=(lowResourcesConnections+acceptors-1)/acceptors
AcceptQueueSize 連接被 accept 前允許等待的連接數(shù)即Socket的Backlog ,默認 50
SoLingerTime 具有指定逗留時間(以毫秒為單位) 即socket的setSoLinger顽爹,默認關(guān)閉
ResolveNames 是否反查 getRemoteHost() 默認false
- Content Cache
動態(tài)內(nèi)容不會被cache 靜態(tài)內(nèi)容才會被cache
maxCacheSize 256,000,000
maxCachedFileSize 200,000,000
maxCachedFiles ?2,048
useFileMappedBuffer ?true
可以通過etc/webdefault.xml配置
- 冗余組件去除
去除多余的Connector 去除不需要的構(gòu)建Handler 例如SessionHandler,ServletHandler
關(guān)閉不必要的服務(wù) 例如 jmx-console纤泵。(JBoss)
代碼優(yōu)化:
在高峰期,減去日志記錄的操作镜粤,或者把日志暫時先緩存起來捏题,使用異步處理的方式。
減少一些數(shù)據(jù)庫操作肉渴。
減少NC 身份證等匹配方式公荧。
數(shù)據(jù)庫優(yōu)化:
索引
視圖
其他:
壓縮css,js,圖片
使用瀏覽器緩存
CDN加速
分布式緩存服務(wù)器
集群、負載均衡
調(diào)優(yōu)技巧
1.粗狂的掃點與詳細的指標相結(jié)合同规,盡量讓驗證調(diào)優(yōu)的過程更敏捷,讓主要的指標穩(wěn)定下來循狰,在確定指標前,再使用詳細的方式去測出各種指標券勺。
2.分輪測試绪钥,在測試結(jié)果中,找出各個參數(shù)的規(guī)律关炼。為調(diào)優(yōu)提供指導(dǎo)數(shù)據(jù)程腹。
3.在程序增加計數(shù)器,驗證LR的請求次數(shù)儒拂。
4.在程序每個步驟寸潦,增加多一些時間,檢查下社痛,到底是卡在哪個步驟见转,尤其是操作數(shù)據(jù)庫前后。
Ref:
http://www.sxrczx.com/pages/gordon-tech.lofter.com/post/481906_24eb191.html