寰俊鎼滅储銆愯剳琛ョ偢楸笺€戝叧娉ㄨ繖涓偢鑲濈偢楸笺€傛湰鏂嘒itHubgithub.com/eddycjy/blog宸叉敹褰曪紝闄勬湁鎴戠殑绯诲垪鏂囩珷銆佽祫鏂欏拰寮€婧怗o涔︾睄銆傛渶鏂扮増PProf鍒嗘瀽锛屾帹鑽愰槄璇伙細GolangKiller鎬ц兘鍒嗘瀽PProf鍓嶈█鍐欎簡濂藉嚑鍚ㄤ唬鐮侊紝瀹炵幇浜嗕笂鐧句釜鎺ュ彛銆傚姛鑳芥祴璇曚篃閫氳繃浜嗭紝鏈€缁堥儴缃叉垚鍔熴€傜粨鏋滃氨鏄€ц兘涓嶅ソ锛屼粈涔堥锛燄煒兂鍋氭€ц兘鍒嗘瀽PProf鎯冲仛鎬ц兘浼樺寲锛岄鍏堝叧娉ㄧ殑鏄疓o鏈韩鎻愪緵鐨勫伐鍏烽摼浣滀负鍒嗘瀽渚濇嵁锛屾湰鏂囧皢甯︿綘瀛︿範鍜屼娇鐢℅o鐨勫悗鑺卞洯锛屾秹鍙婁互涓嬪唴瀹癸細runtime/pprof锛氶噰闆嗙▼搴忥紙闈濻erver锛塏et/http/pprof锛氶噰闆咹TTPServer杩愯鏃舵暟鎹繘琛屽垎鏋愩€備粈涔堟槸pprof锛熷畠鏄竴涓彲瑙嗗寲鍜屽垎鏋愭€ц兘鍒嗘瀽鏁版嵁鐨勫伐鍏枫€俻prof鐢╬rofile.proto璇诲彇鍒嗘瀽鏍锋湰闆嗗悎骞剁敓鎴愭姤鍛婏紝浠ュ彲瑙嗗寲鍜屽府鍔╁垎鏋愭暟鎹紙鏀寔鏂囨湰鍜屽浘褰㈡姤鍛婏級profile.proto鏄疨rotocolBufferv3鐨勬弿杩版枃浠讹紝鎻忚堪浜嗕竴缁勮皟鐢ㄥ爢鏍堝拰绗﹀彿鍖栦俊鎭紝浠ュ強鐢ㄤ簬琛ㄧず涓€缁勯噰鏍风殑璋冪敤鏍堬紝鐢ㄤ簬缁熻鍒嗘瀽锛屽緢甯歌stacktrace閰嶇疆鏂囦欢鏍煎紡鏀寔WhatusagemodesReportgeneration锛氭姤鍛婄敓鎴怚nteractiveterminaluse锛氫氦浜掑紡缁堢浣跨敤Webinterface锛歸eb鐣岄潰鍙互鍋氫粈涔圕PUProfiling锛欳PU鍒嗘瀽锛屼互涓€瀹氱殑棰戠巼鏀堕泦琚洃鎺х殑搴旂敤绋嬪簭CPU锛堝寘鎷瘎瀛樺櫒锛夛紝浠ョ‘瀹氭偍鐨勫簲鐢ㄧ▼搴忓湪绉瀬娑堣€桟PU鍛ㄦ湡鐨勫悓鏃惰姳璐规椂闂寸殑浣嶇疆鐩戣褰撳墠鍜屽巻鍙插唴瀛樹娇鐢ㄦ儏鍐碉紝骞舵鏌ュ唴瀛樻硠婕廈lockProfiling:Blockingprofiling锛岃褰昰oroutine闃诲绛夊緟鍚屾鐨勫湴鏂癸紙鍖呮嫭timerchannels锛塎utexProfiling锛歁utexprofiling锛屾姤鍛妋utexracecondition鍦ㄥ垵姝ュ垎鏋愬熀纭€绋嬪簭鐨勫熀纭€涓婄紪鍐檇emo鏂囦欢锛?锛塪emo.go锛屾枃浠跺唴瀹癸細packagemainimport("log""net/http"_"net/http/pprof""github.com/EDDYCJY/go-pprof-example/data")funcmain(){gofunc(){for{log.Println(data.Add("https://github.com/EDDYCJY"))}}()http.ListenAndServe("0.0.0.0:6060",nil)}(2)data/d.go,鏂囦欢鍐呭锛歱ackagedatavardatas[]stringfuncAdd(strstring)string{data:=[]byte(str)sData:=string(data)datas=append(datas,sData)returnsData}杩愯杩欎釜鏂囦欢锛屼綘鐨凥TTP鏈嶅姟鍦ㄩ偅閲屽皢鏄竴涓澶栫殑/debug/pprof绔偣锛屽彲鐢ㄤ簬瑙傚療搴旂敤绋嬪簭鐨勬儏鍐点€?.閫氳繃web鐣岄潰鏌ョ湅褰撳墠姒傝锛氳闂甴ttp://127.0.0.1:6060/debug/pprof//debug/pprof/profiles:0block5goroutine3heap0mutex9threadcreatefullgoroutinestackdump杩欎釜椤甸潰鏈夊緢澶氬瓙椤甸潰锛岃鎴戜滑缁х画鐮旂┒锛岀湅鐪嬫垜浠兘寰楀埌浠€涔堬紵cpu锛圕PUProfiling锛夛細$HOST/debug/pprof/profile锛岄粯璁?0s鐨凜PUProfiling锛岃幏鍙栦竴涓猵rofile鏂囦欢鍧楋紙BlockProfiling锛夛細$HOST/debug/pprof/block锛屾煡鐪嬪鑷撮樆濉炲悓姝ョ殑鏍堣窡韪猤oroutine:$HOST/debug/pprof/goroutine锛屾煡鐪嬪綋鍓嶈繍琛岀殑鎵€鏈塯oroutinesstacktraceheap(MemoryProfiling)锛?HOST/debug/pprof/heap锛屾煡鐪嬫椿鍔ㄥ璞utex鐨勫唴瀛樺垎閰?MutexProfiling)锛?HOST/debug/pprof/mutex锛屾煡鐪嬪鑷翠簰鏂ラ攣绾跨▼鍒涘缓鐨勭珵浜夋寔鏈夎€呯殑鍫嗘爤璺熻釜锛?HOST/debug/pprof/threadcreate锛屾煡鐪嬪垱寤烘柊鎿嶄綔绯荤粺绾跨▼鐨勫爢鏍堣窡韪猅race2.浣跨敤浜や簰寮忕粓绔?1)gotoolpprofhttp://localhost:6060/debug/p...$gotoolpprofhttp://localhost:6060/debug/pprof/profile\?seconds\=60Fetching閫氳繃HTTP浠巋ttp://localhost:6060/debug/pprof/profile?seconds=60Saved閰嶇疆鏂囦欢/Users/eddycjy/pprof/pprof.samples.cpu.007.pb.gzType:cpuDuration:1mins,Totalsamples=26.55s(44.15%)杩涘叆浜や簰妯″紡锛堝懡浠よ緭鍏モ€渉elp鈥濓紝閫夐」杈撳叆鈥渙鈥濓級(pprof)鎵ц璇ュ懡浠ゅ悗锛岄渶瑕佺瓑寰?0绉掞紙绉掔殑鍊煎彲浠ヨ皟鏁达級锛宲prof浼氭墽琛孋PUProfiling缁撴潫鍚庨粯璁や細杩涘叆pprof鐨勪氦浜掑懡浠ゆā寮忥紝鍙互鏌ョ湅鎴栧鍑哄垎鏋愮粨鏋溿€傚叿浣撴墽琛宲profhelp鏌ョ湅鍛戒护璇存槑(pprof)top10Showingnodesaccountingfor25.92s,97.63%of26.55stotalDropped85nodes(cum<=0.13s)Showingtop10nodesoutof21flatflat%sum%cumcum%23.28s87.68%87.68%23.29s87.72%syscall.Syscall0.77s2.90%90.58%0.77s2.90%runtime.memmove0.58s2.18%92.77%0.58s2.18%runtime.freedefer0.53s2.00%94.76%1.42s5.35%runtime.scanobject0.36s1.36%96.12%0.39s1.47%runtime.heapBitsForObject0.35s1.32%97.44%0.45s1.69%runtime.greyobject0.02s0.075%97.51%24.96s94.01%main.main.func1%0.035%0.038ss90.06%os.(*File).Write0.01s0.038%97.59%0.19s0.72%runtime.mallocgc0.01s0.038%97.63%23.30s87.76%syscall.Writeflat锛氳姳鍦ㄧ粰瀹氬嚱鏁颁笂鐨勬椂闂磃lat%锛氬悓涓奀PU杩愯鎬昏€楁椂鐜噑um%锛氱粰瀹氬嚱鏁扮疮璁℃€籆PU浣跨敤鐜嘽um锛歵鎬昏繍琛屾椂闂磆ecurrentfunctionpluscallsaboveitcum%:鎬荤殑CPU杩愯鏃堕棿姣斾緥濡備笂鏈€鍚庝竴鍒楁槸鍑芥暟鍚嶏紝鍦ㄥぇ澶氭暟鎯呭喌涓嬶紝鎴戜滑鍙互閫氳繃杩欎簲鍒楀緱鍒颁竴涓簲鐢ㄧ▼搴忕殑杩愯鐘舵€侊紝骞跺鍏惰繘琛屼紭鍖栶煠?2)鍘籺oolpprofhttp://localhost:6060/debug/p...$gotoolpprofhttp://localhost:6060/debug/pprof/heapFetchingprofileoverHTTPfromhttp://localhost:6060/debug/pprof/heapSaved鍦?Users/eddycjy/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gzType:inuse_spaceEnteringinteractivemode(type"help"forcommands,"o"foroptions)(pprof)topShowingnodesaccountingfor837.48MB,100%of837.48MBtotalflatflat%sum%cumcum%837.48MB100%100%837.48MB100%main.main.func1-inuse_space锛氬垎鏋愬簲鐢ㄧ▼搴忕殑甯搁┗鍐呭瓨浣跨敤鎯呭喌-alloc_objects锛氬垎鏋愬簲鐢ㄧ▼搴忕殑涓存椂鍒嗛厤ofmemory(3)gotoolpprofhttp://localhost:6060/debug/p...(4)gotoolpprofhttp://localhost:6060/debug/p...3.PProf鐨勫彲瑙嗗寲鐣岄潰鏄竴涓护浜哄叴濂嬬殑閮ㄥ垎鍦ㄦ涔嬪墠锛屾垜浠渶瑕佺畝鍗曠殑缂栧啓濂芥祴璇曠敤渚嬫潵杩愯銆傜紪鍐欐祴璇曠敤渚?1)鏂板缓data/d_test.go锛屾枃浠跺唴瀹癸細packagedataimport"testing"consturl="https://github.com/EDDYCJY"funcTestAdd(t*testing.T){s:=Add(url)ifs==""{t.Errorf("Test.Adderror!")}}funcBenchmarkAdd(b*testing.B){fori:=0;鎴?b.N;i++{Add(url)}}(2)鎵ц娴嬭瘯鐢ㄤ緥$gotest-bench=.-cpuprofile=cpu.profpkg:github.com/EDDYCJY/go-pprof-example/dataBenchmarkAdd-410000000187ns/opPASSokgithub.com/EDDYCJY/go-pprof-example/data2.300s-memprofile浣犱篃鍙互浜嗚В鍚姩PProf鍙鍖栫晫闈㈡柟娉曚竴锛?gotoolpprof-http=:8080cpu.prof鏂规硶浜岋細$gotoolpprofcpu.prof$(pprof)web濡傛灉鏈塁ouldnotexecutedot;鍙兘闇€瑕佸畨瑁単raphviz.锛屼細鎻愮ず瀹夎graphviz锛堣鍙宠浆Google锛夋煡鐪婸Prof鍙鍖栫晫闈紙1锛塗op锛?锛塆raph鏂规瓒婂ぇ锛岀嚎鏉¤秺绮楋紝鏃堕棿瓒婇暱骞朵笖鍦╒iew鑿滃崟鏍忎腑锛屼篃鏀寔浠ヤ笂鏂瑰紡鐨勫垏鎹€傛兂涓€鎯筹紝褰撲綘涓嶇煡閬撻棶棰樺嚭鍦ㄥ摢閲屾椂锛屼綘鍙互浣跨敤杩欎簺杈呭姪宸ュ叿鏉ユ娴嬮棶棰樸€傛槸涓嶆槸鐬棿鏁堢巼缈诲€嶏紵4.PProfFlameFigure鍙︿竴绉嶅彲瑙嗗寲鏁版嵁鐨勬柟娉曟柟娉曟槸鐏劙鍥撅紝闇€瑕佹墜鍔ㄥ畨瑁呭師鐢熺殑PProf宸ュ叿锛氾紙1锛夊畨瑁匬Prof$goget-ugithub.com/google/pprof锛?锛夊惎鍔≒Prof鍙鍖栫晫闈細$pprof-http=:8080cpu.prof(3)鏌ョ湅PProf鍙鍖栫晫闈㈡墦寮€PProf鍙鍖栫晫闈紝浣犱細鏄庢樉鍙戠幇瀹冩瘮瀹樻柟鐨勫伐鍏烽摼PProf鏇村姞绮捐嚧锛屽苟涓斿浜咶lameGraph锛堢伀鐒板浘锛夈€傝繖鏄繖娆$殑鐩爣涔嬩竴銆傚畠鏈€澶х殑浼樼偣鏄姩鎬佽皟鐢ㄩ『搴忔槸浠庝笂鍒颁笅锛圓->B->C->D锛夛紝姣忎竴鍧椾唬琛ㄤ竴涓嚱鏁帮紝鍧楄秺澶э紝鍗犵敤CPU鐨勬椂闂磋秺闀裤€傚悓鏃惰繕鏀寔鐐瑰嚮鍖哄潡杩涜娣卞害鍒嗘瀽锛佸皬缁撴湰绔犵矖鐣ヤ粙缁嶄簡Go鐨勬€ц兘宸ュ叿PProf銆傚湪鐗瑰畾鍦烘櫙涓嬶紝PProf瀵瑰畾浣嶅拰鍒嗘瀽闂甯︽潵浜嗗緢澶х殑甯姪銆傚笇鏈涜繖绡囨枃绔犲鎮ㄦ湁鎵€甯姪銆傚彟澶栵紝寤鸿鑷繁鍔ㄦ墜銆傛渶濂芥繁鍏ユ€濊€冧竴涓嬨€傞噷闈㈠寘鍚簡寰堝鐢ㄦ硶鍜岀煡璇嗙偣馃鎬濊€冮缁撳眬澶у宸茬粡鐪嬬殑寰堝ソ浜嗭紝鎺ヤ笅鏉ュ氨鏄袱閬撶畝鍗曠殑鎬濊€冮锛屽笇鏈涜兘鎷撳睍涓€涓嬪ぇ瀹剁殑鎬濊矾锛?锛塮lat涓€瀹氬ぇ浜巆um锛屼负浠€涔堬紵浠€涔堟儏鍐典笅cum浼氭瘮flat澶э紵(2)鏈珷鐨刣emo浠g爜鏈夊摢浜涙€ц兘闂锛熷浣曡В鍐筹紵鏉ュ惂锛屽垎浜綘鐨勬兂娉曪紒馃槅鍘熸枃鍦板潃锛欸olangKillerPProf鎬ц兘鍒嗘瀽
