原博客地址:http://www.sxrczx.com/pages/gordon-tech.lofter.com/post/481906_24eb191.html
轉載過來只是爲了收藏,望原博主見諒
一、一般調優的基本過程
1.明瞭需要調優的系統架構
2.設定性能調優的目標
3.明瞭目標當前的性能情況
4.找出目前的性能瓶頸的所在
5.解決引起性能瓶頸的根本問題
6.重複以上過程直到達到設定目標性能爲止
二、性能指標:
崩潰點:同時多少併發的時候,服務器Down掉?
吞吐量:多少人一起來,都沒問題?
併發數:每秒能處理多少人?
響應時間:每人需要等待的時間多長?
三、調優點:
1.硬件配置優化:
虛擬機
物理機
CPU 內存
2、系統優化(Linux)
已經根據門戶的方式去優化。
3.JVM參數優化:
-Xms:設置jvm內存的初始大小
-Xmx:設置jvm內存的最大值
-Xmn:設置新域的大小(這個似乎只對 jdk1.4來說是有效的,後來就廢棄了)
-Xss:設置每個線程的堆棧大小(也就是說,在相同物理內存下,減小這個值能生成更多的線程)
-XX:NewRatio :設置新域與舊域之比,如-XX:NewRatio = 4就表示新域與舊域之比爲1:4
-XX:NewSize:設置新域的初始值
-XX:MaxNewSize :設置新域的最大值
-XX:PermSize:設置永久域的初始值
-XX:MaxPermSize:設置永久域的最大值
-XX:SurvivorRatio=n:設置新域中Eden區與兩個Survivor區的比值。(Eden區主要是用來存放新生的對象,而兩個 Survivor區則用來存放每次垃圾回收後存活下來的對象)
監控內存 CPU
常見的錯誤 :
java.lang.OutOfMemoryError相信很多開發人員都用到過,這個主要就是JVM參數沒有配好引起的,但是這種錯誤又分兩種:java.lang.OutOfMemoryError: Java heap space和
java.lang.OutOfMemoryError: PermGen space,其中前者是有關堆內存的內存溢出,可以同過配置-Xms和-Xmx參數來設置,而後者是有關永久域的內存溢出,可以通過配置-XX:MaxPermSize來設置。
4.容器優化:
a.線程池
<jetty>
線程池線程資源大小確定了服務器的服務能力
默認大小不一定能滿足生產環境
線程分配方式決定了服務器的資源利用效率
固定線程數處理多任務,代表:JDK的ThreadPoolExecutor
以最大線程數爲限處理多任務,代表:Jetty自帶QueuedThreadPool
Work-stealing 分配,Jetty目前沒有這個實現 Jetty中配置實例:
<tomcat>
maxThreads:表示最多同時處理的連接數。應該將線程數(最大線程數)設置比最大預期負載(同時併發的點擊)多25%(經驗規則)(低配置用戶可通過降低maxThreads並同時增大
acceptCount值來保證系統的穩定)。
acceptCount:當同時連接的人數達到maxThreads時,還可以接收排隊的連接。
minSpareThread:指“啓動以後,總是保持該數量的線程空閒等待”;設置比預期負載多25%。
maxSpareThread:指“如果超過了minSpareThread,然後總是保持該數量的線程空閒等待”;設置比預期負載多25%。
其中主要修改兩個參數maxThreads和acceptCount值。增加maxThreads,減少acceptCount值有利縮短系統的響應時間。但是maxThreads和acceptCount的總和最高值不能超過6000,而且
maxThreads過大會增加CPU和內存消耗,故低配置用戶可通過降低maxThreads並同時增大acceptCount值來保證系統的穩定。
connectionTimeout:連接超時,最大超時時間,當響應速度慢的時候,通過調整該參數,來平衡正確率和服務器資源的回收。
b.Connectors
選擇Connector時,需要考慮應用自身的特點,例如股票、聊天室.
TCP 連接數 Keep-Alive Java BIO Connectors SocketConnector (HTTP)
Ajp13SocketConnector (AJP) SslSocketConnector(SSL)
Java NIO Connectors electChannelConnector(HTTP) SslSelectChannelConnector(SSL)
Acceptors 表示同時在監聽read事件的線程數
默認值是 1 典型值範圍 1~(處理器內核數+1)
對於NIO 來說,設置爲(處理器內核數+1)比較合適
maxIdleTime 表示連接最大空閒時間 默認值是 200000,一般這個值都太大了
典型值 3000 左右足夠
對AJP來說一般設置爲-1,表示連接需要一直保持
LowResourcesMaxIdleTime 表示線程資源稀少時的maxIdleTime 默認值是 -1,表示沒有設置
一般設置值應該<=maxIdleTime
lowResourcesConnections 只有NIO纔有這個設置,表示連接空閒時的連接數,大於這個數將被shutdown
默認值是 0,表示該設置沒有生效 每個acceptor的連接數=(lowResourcesConnections+acceptors-1)/acceptors
AcceptQueueSize 連接被 accept 前允許等待的連接數即Socket的Backlog ,默認 50
SoLingerTime 具有指定逗留時間(以毫秒爲單位) 即socket的setSoLinger,默認關閉
ResolveNames 是否反查 getRemoteHost() 默認false
c.JVM
Jetty性能調優點-JVM
JVM參數調整主要涉及兩個方面
堆/棧內存大小調整
Xmx/xms 最大/最小堆大小
xmn 新生代大小
-XX:MaxPermSize 持久代堆大小
垃圾分配回收算法考慮暫停時間、吞吐量選擇不同算法
串行/並行/併發收集
d.Content Cache
動態內容不會被cache 靜態內容纔會被cache
maxCacheSize 256,000,000
maxCachedFileSize 200,000,000
maxCachedFiles ?2,048
useFileMappedBuffer ?true
可以通過etc/webdefault.xml配置
e.冗餘組件去除
去除多餘的Connector 去除不需要的構建Handler 例如SessionHandler,ServletHandler
關閉不必要的服務 例如 jmx-console。(JBoss)
5.代碼優化:
在高峯期,減去日誌記錄的操作,或者把日誌暫時先緩存起來,使用異步處理的方式。
減少一些數據庫操作。
減少NC 身份證等匹配方式。
6.數據庫優化:
索引
視圖
7.其他:
壓縮css,js,圖片
使用瀏覽器緩存
CDN加速
分佈式緩存服務器
集羣、負載均衡
三.調優策略:
a.關鍵點,找到瓶頸,給瓶頸分配更多的資源,或者減輕其工作量。
四、調優原則
a.每臺服務器,所能承載的參數,都會有差異,尤其是內存 CPU的配置不一致。
b.每種服務所需的計算資源各不相同,要根據服務的偏向不同,而去把最好的資源,分配到最需要的地方
c.性能優化,是永恆的話題,沒有永久最優解,只能查出目前最優解,是一個不斷優化的過程。
五、調優技巧
1.粗狂的掃點與詳細的指標相結合,儘量讓驗證調優的過程更敏捷,讓主要的指標穩定下來,在確定指標前,再使用詳細的方式去測出各種指標。
2.分輪測試,在測試結果中,找出各個參數的規律。爲調優提供指導數據。
3.在程序增加計數器,驗證LR的請求次數。
4.在程序每個步驟,增加多一些時間,檢查下,到底是卡在哪個步驟,尤其是操作數據庫前後。
六、測試的協作經驗
1.產品人員,對調優的各個參數,不是很懂,只有在不斷的嘗試中,去理解和學習各個參數的含義,這樣就會產生比較多測試任務。
2.產品人員,沒有安排詳細的測試計劃,使得測試人員,有些迷茫,甚至兩邊的人員的思路,不是很統一。
3.產品人員,有時比較忙,沒顧得及響應,測試人員的問題,溝通也不到位。
2.不是理解這種測試思路?測試的過程中,只是別人說測就測,產品人員給其講調優思路,調優參數,測試人員,聽不懂或者不想去懂,所以就感覺很多個環境,在進行,做了很多次重複工作
。
3.在產品和測試中,配合中,缺少一種,共同把事情幹好的思想,缺少主動去探討一些問題,缺少主動建議一些問題,更多的是爭論一些問題,是對還是錯的,當然裏面涉及到一些面子因素和一些主動做事的心態。
4.測試的過程不夠敏捷,跑一次測試,需要的時間太長,開發人員需要不斷得去嘗試去理解,對各種參數的理解。開發人員,在調整參數的時候,不需要很清晰得知道,在這種情況下的各種指標是如何,各重要的是,去理解這個參數帶來的影響如何。
5.使用正式環境做壓力測試,嚴重影響項目的其他進度的正常使用。是否考慮使用備用機器,做性能測試。(城建)
七、參考資料:
網站性能優化思路
http://blog.sina.com.cn/s/blog_6cbe69e30101e54o.html
Jboss部署及性能調優
http://blog.sina.com.cn/s/blog_7c1092a90101iwhs.html
Jetty和Tomcat的使用及性能測試
http://www.verydemo.com/demo_c199_i12761.html
jetty服務器性能調整過程分析
http://download.csdn.net/detail/wujuan321/4458261
jetty7.5 調 優 文 檔(非常好的實例)
http://wenku.baidu.com/link?url=ljZS54Yf4fPE3jbcwr8csKqiBhJJ_YmRlGf8jlCOVWRYNPjFksLRrEQ7e_zD3qjbKAUm4mfAc6iI5VuvqE2PrJvKfaBcCA6s1Ywcn807aCC
Jetty服務器架構及調優(講得有點多)
http://www.cnblogs.com/zhizhesky/articles/2225460.html