Java程序性能調優(yōu)步驟_第1頁
Java程序性能調優(yōu)步驟_第2頁
Java程序性能調優(yōu)步驟_第3頁
Java程序性能調優(yōu)步驟_第4頁
Java程序性能調優(yōu)步驟_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、java程序性能調優(yōu)步驟2013年06月20日09:18供稿中心:互聯(lián)網(wǎng)運營部摘要:java程序性能調優(yōu)步驟1、性能調優(yōu)的步驟1.1、衡量系統(tǒng)現(xiàn)狀包括請求次數(shù)、響應時間、資源消耗等;如:a系統(tǒng)目前95%的請求響應為is。1.2、設定調優(yōu)目標根據(jù)用戶所能接受的響應速度、系統(tǒng)現(xiàn)有的機器、所支撐的用戶最制定出來的,因此通常會設定調 優(yōu)目標:95%的 請求在500ms內返回。1.3、尋找性能瓶頸在【2、尋找性能瓶頸】會專門介紹。通常性能瓶頸的表像是:1.3、1資源消耗過多(cpu、文件10、網(wǎng)絡10、內存)1.3.2、外部系統(tǒng)處理不足(所調用的其他系統(tǒng)提供的功能一一多數(shù)情況也是資源消耗過多、數(shù)據(jù)的 操

2、作響應速度不夠一一根據(jù)數(shù)據(jù)庫sql執(zhí)行速度、數(shù)據(jù)庫機器的iops、數(shù)據(jù)庫的active sessions等分 析出來的)1.3.3、程序代碼運行效率不夠高,未充分使用資源或程序結構不合理。1.4、性能調優(yōu)在后面的【3、性能調優(yōu)】會專門介紹1.5、衡量是否達到目標值優(yōu)化部署后,達到目標則結束,如果沒有則重復1.3、1.4步驟2、尋找性能瓶頸2. 1、cpu消耗分析(top、pidstat等方式查看cpu消耗狀況;vmstat查看cpu的上下文切換、運行隊 列、利用率)在linux中,cpu消耗主要用于中斷、內核以及用戶進程的任務處理。優(yōu)先級為:中斷內核用戶進 程。cpu消耗嚴重時,主要體現(xiàn)在:

3、us用戶進程所占的%過高的原因:1、線程一直處于可運行(runnable)狀態(tài),通常線程在執(zhí)行無阻塞、循環(huán)、正則或純粹 的計算等動作引起的。2、頻繁的gc操作引起。如:每次請求需要分配較多內存,當訪問量高的吋,就不 斷的進行gc,系統(tǒng)響應速度下降。進而造成堆積的請求更多,消耗內存更嚴重,故嚴重的時候可能導致系 統(tǒng)不斷的進行fui丄gco可通過jvh內存的消耗分析來査找原因。可通過 kill -3 javapid、jstack pid | grep 'n id 二 ox.的方式 dump 出應用的 java 線程 信息。通過轉換出的十六進制的值就可以找到對應的nid值的線程。該線程即為消

4、耗cpu的線程。在采樣 時多執(zhí)行幾次上訴過程,以確保找到真實的消耗cpu的線程。也可以通過intel vtune這樣的商業(yè)軟件進 行分析 sy內核線程所占的過高的原因:linux花費更多的時間在進行線程切換。java應用造成這個原因是:因為啟動了的線 程比較多,h這些線程多數(shù)都處于不斷的阻塞(鎖等待、10等待狀態(tài))和執(zhí)行狀態(tài)的變化過程,導致了操作 系統(tǒng)需要不斷的切換執(zhí)行的線程。從而產(chǎn)生大量的上下文切換??赏ㄟ^kill -3 javapid > jstack -1 javapid的方式dump出java應用線程信息,查看線程的 狀態(tài)、鎖信息找出等待狀態(tài)或鎖競爭過多的線程。結合vvmstat

5、查看cpu消耗狀況。如cs(上下文切換)、 sy等。 ni被nice命令改變優(yōu)先級的任務所占的 i d-cpu空閑時間所占的 wa執(zhí)行過程中等待io所占的hi硬件中斷所占的si軟件中斷所占的2.2、文件10消耗分析(通過pidstat、iostat命令分析)java應用造成io消耗嚴重主要是: 多個線程需耍大量內容寫入(如頻繁的log寫入)動作; 磁盤設備本身的處理速度慢 文件系統(tǒng)慢 操作的文件本身已經(jīng)很大2. 3、網(wǎng)絡10消耗分析(通過sar命令,如需跟著tcp/ip通信過程的信息,則可通過tcpdump來進 行)對于分布式java應用而言,網(wǎng)絡10的消耗非常值得關注,尤其要注意網(wǎng)絡中斷是不

6、是均衡地分配 到各cpu的(通過cat/proc/i nterrupts命令查看)。對于網(wǎng)卡只分配到一個cpu的現(xiàn)彖采用修改kernle方 法(google使用)、采用支持msi-x的網(wǎng)卡進行修復。由于沒辦法分析具體每個線程所消耗的網(wǎng)絡10,因此當網(wǎng)絡10消耗高時,對于java應用而言只能 對線程進dump。查找產(chǎn)生大量網(wǎng)絡【0操作的線程,這些線程的特征是讀取或寫入網(wǎng)絡流,在java網(wǎng)絡通信時,通 常要對對彖進行序列化為字節(jié)流,進行發(fā)送,或者讀取。并反序列化為對象。這個過程要消耗jym堆內存,jvm對內存通 常是有限的。因此,jo溜應用一般不會造成網(wǎng)絡10消耗嚴重。2.4、內存消耗分析(vms

7、tat> sar、pidstat、top)冃前java應用只有在創(chuàng)建線程和使用direct by t ebuff er時才會操作jvm堆意外的內存。對于jvm 堆以外的內存方面消耗,最為值得關注的是swpd的消耗以及物理內存的消耗(可通過vmstal、sar、top. pidstat等方式查看swap和物理內存的消耗狀況)。2.5、消耗資源不多,在訪問量不大的情況。但程序執(zhí)行慢的原因,主要有3方面 鎖競爭激烈(如:數(shù)據(jù)庫連接池數(shù),但是請求數(shù)多于連接池數(shù)) 未充分使用硬件資源(如:多核cpu,但程序卻釆用單線程串行操作。) 數(shù)據(jù)量增長(如:數(shù)據(jù)量的海量增長。可對數(shù)據(jù)庫的表拆分、庫拆分)3、

8、性能調優(yōu)3. 1jvm調優(yōu)3.1.1、代大小調優(yōu) 避免新生代大小設置過小1、避免頻繁進行minor gc;2.可能導致minor gc對象直接進入舊生代,占據(jù)舊生代空間,觸發(fā)full gco 避免新生代設置過大1、導致舊生代變小,可能導致full gc頻繁執(zhí)行;2、導致minor gc的耗時大幅度增加。 避免survivor space過小或者過大 根據(jù)具體代碼合理設置新生代的存活周期。3. 2. 1、gc策略調優(yōu)串行gc性能太差,因此實際應用時主要是應用并行和并發(fā)gc,人部分web應用在處理請求時設置了 一個最大可同時處理的請求數(shù),當超出此請求數(shù)吋,會將之后的請求放入等待隊列中,而這個等待隊

9、列也 限制了大小。當?shù)却犃袧M了后,仍然有請求進入,那么這些請求將丟棄,所有的請求又都是有超時限制 度。在這種情況下如果觸發(fā)了 fill gc造成應用暫停時間較長的fill gc,則有可能等這次full gc之后, 應用中很多請求就超時或者被丟棄了。從上面可以看出,壯b應用非常需要一個對應用造成粋停時間較短的gc,再加上大部分web應用的 瓶頸都不在cpu上。因此對于web應用而言,在g1還不夠成熟的情況下,cms gc是不錯的選擇。3.2、程序調優(yōu)3.2、1、cpu us高的解決方法 執(zhí)行線程無任何掛起動作,且一直運行,導致cpu沒冇機會去調度執(zhí)行其他的線程,造成線程餓 死的現(xiàn)彖。解決:對這

10、種線程的動作増加thread, sleep(int),以釋放cpu的執(zhí)行權,降低cpu的消耗。原理:以損失單次執(zhí)行性能為代價,但由于降低了 cpu消耗,在多線程的情況下,反而提高了平均 性能。 狀態(tài)掃描。如:某線程要等其他線程改變了值才可以繼續(xù)執(zhí)行。解決:改為采用wait/notify機制。 循環(huán)次數(shù)過多、正則、計算等造成cpu us過高的情況。結合業(yè)務需求進行調優(yōu)。code review是 王道。 頻繁gc造成us高的情況,通過jvm調優(yōu)或程序調優(yōu),降低gc的執(zhí)行次數(shù)。3.2.2、cpu sy高的解決方法 線程運行狀態(tài)經(jīng)常切換解決:減少線程數(shù),且使用線程池 線程之間鎖競爭激烈解決:盡可能降低

11、鎖的競爭。1、使用并發(fā)包中的類(java. util, concurrent. *)2、使用trcibcr算法3、使用michael-scott非阻塞隊列算法(concurrentlj nkedqueue就是典型的該算法的非阻塞隊列)4、通常沒必要對整個方法加鎖,只對需要控制資源的地方做加鎖操作。5、拆分鎖,把獨占鎖拆分為多把鎖,如:concurrenthashmap。很大程度上可以提高讀寫速度。6、去除讀寫操作的互斥鎖 較多網(wǎng)絡10操作或者確實需要一些鎖競爭機制(如數(shù)據(jù)庫連接池),但為了能夠支持高的并發(fā)戢, 在java應用中乂只能借助更多的線程來支撐。解決:采用協(xié)程(coroutine)來支

12、持更高的并發(fā)量,避免并發(fā)量上漲之后造成cpu sy消耗嚴重、系 統(tǒng)load迅速上漲和系統(tǒng)性能下降。java中目前主要可用于實現(xiàn)協(xié)程的框架為kilim,早使用k訂im執(zhí)行一項任務,并不創(chuàng)建thread, 而是采用taske3. 3、文件10消耗嚴重的解決方法從程序角度看,造成文件10消耗嚴重的原因主要是多個線程在寫人量的數(shù)據(jù)到同一文件。導致文件 很快變大。從而寫入速度越來越慢,并造成各線程激烈爭搶文件鎖,對于這種情況解決方法:1、異步寫入文件;2、批量讀寫;3、限流;4、限制文件大小;5、盡可能釆用緩沖區(qū)等方式來讀取文件 內容3. 4、網(wǎng)絡t0消耗嚴重的解決方法從程序角度而言,造成網(wǎng)絡t0消耗嚴

13、重的主要原因是同時需要發(fā)送或接受的包太多。可采用限流。 限流通常是限制發(fā)送packet的頻率,從而在網(wǎng)絡10消耗可接受的情況下來發(fā)送packet o3.5、內存消耗嚴重的情況1、對jvm調優(yōu);2、代碼調優(yōu);代碼調優(yōu)的方式: 釋放不必耍的引用。如使用threadlocal,由于線程復用,threadlocal中存放的對象如未主動 釋放的話,不會被gc。應該在執(zhí)行完畢執(zhí)行threodlocal. set把對象清除,避免此冇不必要的對象引用。 使用對象緩存池(亨元模式) 采用合理的緩存失效算法(fifo、lru、lfu等)當緩存池達到最大容最后,如果再加入新對象時采用fifo、lru、lfu等失效算法。 對丁-占據(jù)內存但又不是必須存在的對彖使用softreference、weakreference的方式進行緩存。softreference在內存不夠用的情況進行回收;wcakrcfcrcncc在full gc的情況下進行回收。3.6、對于資源消耗不多,但程序執(zhí)行慢的情況3. 6. 1、鎖競爭激烈一見3. 2. 23.6.2、未充分利用硬件資源。 未充分利用cpu啟

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論