




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
這個變量的含義是,平均每分配多少個字節(jié),就對堆內(nèi)存的使用情況進行一次采樣。如果把該變量的值設(shè)為0,那么,Go語言運行時系統(tǒng)就會完全停止對內(nèi)存概要信息的采樣。該變量的缺省值是512KB,也就是52千字節(jié)。會對Go語言運行時系統(tǒng)的采樣工作,造成不良影響。比如,只在main函數(shù)的開始處設(shè)定注意,我們通過WritHeapPrfile函數(shù)得到的內(nèi)存概要信息并不是實時的,它是一個快照,是在最近一次的內(nèi)存收集工作完成時產(chǎn)生的。如果你想要實時的信息,那么可以調(diào)用runime.RedMemStts函數(shù)。不過要特別注意,該函數(shù)會引起Go語言調(diào)度器的短暫停頓。以上,就是關(guān)于內(nèi)存概要信息的采樣頻率設(shè)定問題的簡要回問題2:怎樣獲取到阻塞概我們調(diào)用runtme包中的SetBlokProfileate函數(shù),即可對阻塞概要信息的采樣頻率進行設(shè)定。該函數(shù)有一個名叫rate的參數(shù),它是int類型的。這個參數(shù)的含義是,只要發(fā)現(xiàn)一個阻塞的持續(xù)時間達到了多少個納秒,就可以對其進行采樣。如果這個參數(shù)的值小于或等于0,那么就意味著Go語言運行時系統(tǒng)將會完全停止對在untie包中,還有一個名叫blockrofierate的包級私有變量,它是uin64類型的。這個變量的含義是,只要發(fā)現(xiàn)一個阻塞的持續(xù)時間了多少個CPU時鐘周期,就可以對其進行采樣。它的含義與我們剛剛提到的rate參數(shù)的含義非常相似,不是嗎?實際上,這兩者的區(qū)別僅僅在于單位不同。runtime.SetBlockProfileRate函數(shù)會先對參數(shù)rate的值進行單位換算和必要的類型轉(zhuǎn)換,然后,它會把換算結(jié)果用原子操作賦blockprofilerate變量。由于此變量的缺省值是0,所以Go言運行時系統(tǒng)在默認情另一方面,當我們需要獲取阻塞概要信息的時候,需要先調(diào)用runtim/pprof包中的Lokup函數(shù)并傳入?yún)?shù)值"block",從而得到一個*runime/ppof.Proile類型的值(以下簡稱Profie值)。在這之后,我們還需要調(diào)用這個Profile值的riteTo方法,以驅(qū)使它把概要信息寫進我們指定的寫入器中。這個WrieTo方法有兩個參數(shù),一個參數(shù)就是我們剛剛提到的寫入器,它是io.Writer類型的。而另一個參數(shù)則是代表了概要信息詳細程度的int類型參數(shù)debg。deug參數(shù)主要的可選值有兩個,即:0和1。當debg的值為0時,通過WriteTo方法寫進寫入器的概要信息僅會包含gotoolpprf工具所需的內(nèi)存地址,這些內(nèi)存地址會以十六進制的形式展現(xiàn)出來。入進去。另外,debug為0時的概要信息,會經(jīng)由protocolbuffers轉(zhuǎn)換為字節(jié)流。而在除此之外,debug的值也可以是2。這時,被輸出的概要信息也會是普通的文本,并且通常會包含的細節(jié)。至于這些細節(jié)都包含了哪些內(nèi)容,那就要看我們調(diào)用rutime/prof.Lokup函數(shù)的時候傳入的是什么樣的參數(shù)值了。下面,我們就來一起看一下這個函數(shù)。問題3:runtime/pprof.Lookup函數(shù)的正確調(diào)用方式是rutime/prof.Lokup函數(shù)(以下簡稱Lokup函數(shù))的功能是,提供與給定的名稱相對應的概要信息。這個概要信息會由一個Profle值代表。如果該函數(shù)返回了一個nil,那么就說明不存在與給定名稱對應的概要信息。runtime/pprof包已經(jīng)為我們預先定義了6個概要名稱。它們對應的概要信息收集方法和當我們把"goroutine"傳入Lookup函數(shù)的時候,該函數(shù)會利用相應的方法,收集到當前正在使用的所有g(shù)orouie的堆棧信息。注意,這樣的收引起Go語言調(diào)度器的短暫停頓。當調(diào)用該函數(shù)返回的rofie值的WrteTo方法時,如果參數(shù)debug的值大于或等于2,那么該方法就會輸出所有g(shù)orouie的堆棧信息。這些信息可能會非常多。如果它們占用的空間超過了64MB(也就是64兆字節(jié)),那么相應的方法就會將超出的部分截掉。如果Lookup函數(shù)接到的參數(shù)值是"heap",那么它就會收集與堆內(nèi)存的分配和釋放有關(guān)的采樣信息。這實際上就是我們面討論過的內(nèi)存概要信息。在我們傳入"allos"的時候,后續(xù)的操作會與之非常的相似。"hap"會使得被輸出的內(nèi)存概要信息默認以“在用空間”(inusesae)的視角呈現(xiàn),而"alocs"對應的默認視角則是“已分配空間”(alloc_space)?!霸谟每臻g”是指,已經(jīng)被分配但還未被釋放的內(nèi)存空間。在這個視角下,gotoolpprof工具并不會去理會與已釋放空間有關(guān)的那部分信息。而在“已分配空間”的視角下,此外,無論是"heap"還是allocs",在我們調(diào)用Profle值的Writeo方法的時候,只要賦予debug參數(shù)的值大于0,那么該方法輸出內(nèi)容的規(guī)格就會是相同的。參數(shù)值"hreadceate"會使Lookup函數(shù)去收集一些堆棧信息。這些堆棧信息中的每一個都會描繪出一個代碼調(diào)用鏈,這些調(diào)用鏈上的代碼都導致新的操作系統(tǒng)線程產(chǎn)生。這樣的Profile值的輸出規(guī)格也只有兩種,取決于我們傳給其WriteTo方法的參數(shù)值是否大于0。再說"blck"和"mutx"。"blok"代表的是,因爭用同步原語而被阻塞的那些代碼的堆棧信息。還記得嗎?這就是我們面講過的阻塞概要信息。與之相對應,"mutex"代表的是,曾經(jīng)作為同步原語持有者的那些代碼,它們的堆棧這里所說的同步原語,指的是存在于Go言運行時系統(tǒng)內(nèi)部的一種底層的同步工具,或者它是直接面向內(nèi)存地址的,并以異步信號量和原子操作作為實現(xiàn)。我們已經(jīng)熟知的通道、互斥鎖、條件變量、”WaitGroup“,以及Go語言運行時系統(tǒng)本身,都會利用它來runtime/pprof.Lookup函數(shù)一好了,關(guān)于這個問題,我們已經(jīng)談了不少了。我相信,你已經(jīng)對Lookup函數(shù)的調(diào)用方式及其背后的含義有了比較深刻的理解了。demo99.go文件中包含了一些示例代碼,可供你參問題4:如何為基于HTTP協(xié)議的網(wǎng)絡服務添加性能分析這個問題說起來還是很簡單的。這是因為我們在一般情況下只要在程序中net/http/pprof代碼包就可以了,就像代代1import_然后,啟動網(wǎng)絡服務并開始,比如代1log.Println(http.ListenAndServe("localhost:8082",在運行這個程序之后,我們就可以通過在網(wǎng)絡瀏覽器中在/debg/pprof/這個URL路徑下還有很多可用的子路徑,這一點你通過點選網(wǎng)頁中的就可以了解到。像alocs、blok、gooutine、hap、mutex、thradcreate這6個子路徑,在底層其實都是通過Lookup函數(shù)來處理的。關(guān)于這個函數(shù),你應該已經(jīng)很熟悉了。這些子路徑都可以接受查詢參數(shù)debug。它用于控制概要信息的格式和詳細程度。至于它的可選值,我就不再贅述了。它的缺省值是0。另外,還有一個名叫g(shù)c的查詢參數(shù)。它用于控制是否在獲取概要信息之前強制地執(zhí)行一次回收。只要它的值大于0,程序就會這樣做。不過,這個參數(shù)僅在/debug/pprof/heap路徑下有效一旦/deug/pprf/profle路徑被,程序就會去執(zhí)行對CPU概要信息的采樣。它接受一個名為secons的查詢參數(shù)。該參數(shù)的含義是,采樣工作需要持續(xù)多少秒。如果這個參數(shù)未被顯式地指定,那么采樣工作會持續(xù)30秒。注意,在這個路徑下,程序只會響應經(jīng)rotoolbffers轉(zhuǎn)換的字節(jié)流。我們可以通過gotoolpprof工具直接這樣的TTP響應,例如:代gotoolpprof除此之外,還有一個值得我們關(guān)注的路徑,即:/debug/prof/tace。在這個路徑下,程序主要會利用runtie/trace代碼包中的API來處理我們的請求。更具體地說,程序會先調(diào)用trace.Strt函數(shù),然后在查詢參數(shù)seconds指定的持續(xù)時間之后再調(diào)用trac.Stp函數(shù)。這里的secons的缺省值是1秒。至于runtme/trace代碼包的功用,我就留給你自己去查閱和探索吧。前面說的這些URL路徑都是固定不變的。這是默認情況下的規(guī)則。我們還可以對它們代mux:=pathPrefix:=func(whttp.ResponseWriter,r*http.Request)5name:=strings.TrimPrefix(r.URL.Path,6ifname!=""7pprof.Handler(name).ServeHTTP(w,89}pprof.Index(w,mux.HandleFunc(pathPrefix+"cmdline",mux.HandleFunc(pathPrefix+"profile",mux.HandleFunc(pathPrefix+"symbol",mux.HandleFunc(pathPrefix+"trace",server:= Handler:20可以看到,我們幾乎只使用了net/httppprf代碼包中的幾個程序?qū)嶓w,就完成了這樣的定制。這在我們使用第的網(wǎng)絡服務開發(fā)框架時尤其有用。我們自定義的HTTP請求多路復用器mux所包含的規(guī)則與默認的規(guī)則很相似,只不URL路徑的前綴更短了一些而已我們定制mux的過程與nethttp/prof包中的init函數(shù)所做的事情也是類似的。這個int函數(shù)的存在,其實就是我們面僅僅導入"ethtt/prof"代碼包就能夠相關(guān)路徑的原因。這兩篇文章中,我們主要講了Go序的性能分析,提到的很多內(nèi)容都是你必備的知識和技此外,runtime/pprof包中的Lookup函數(shù)的正確調(diào)用方式也很重要。對于除了CPU除此之外,我還提及了一個上層的應用,即:為基于HTTP議的網(wǎng)絡服務,添加性能分雖然nethttp/prof包提供的程序?qū)嶓w并不多,但是它卻能夠讓我們用不同的方式,實現(xiàn)性能分析接口的嵌入。這些方式有的是極簡的、開箱即用的,而有的則用于滿足各種定制需求。以上這些,就是我今天為你講述的Go語言知識,它們是程序性能分析的基礎(chǔ)。如果你把Go言程序運用于生產(chǎn)環(huán)境,那么肯定會涉及它們。對于這里提到的所有內(nèi)容和問題,我我今天留給你的思考題其實面已經(jīng)透露了,那就是:runtie/trace代碼包的功用是什么?感謝你的收聽,我們下期再戳此查看Go語言專欄文章配套詳細代 歸科技所有 不得售賣。頁面已增加防盜追蹤,將依 上一 48|程序性能分析基礎(chǔ)(上下一 50|學習專欄的正精選留言嘎 runtime/trace可以代碼執(zhí)行期間的每一個,“Thetracecontainsrelatedtogoroutinescheduling:agoroutinestartsexecutingon
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動合同范本題目
- 農(nóng)村水田租賃承包合同范本
- 企業(yè)汽車銷售合同范本
- 代理買賣二手車合同范本
- 代領(lǐng)購房合同范本
- 一般經(jīng)銷合同范例
- 個人購貨采購合同范本
- 關(guān)于裝修貸款合同范本
- 升旗臺合同范本
- 前臺勞務派遣合同范本
- 作品集合同范本
- 保安員綜合理論考試題庫備考500題(含各題型)
- 山泉水公司《質(zhì)量管理手冊》
- X證書失智老年人照護身體綜合照護講解
- 2025年1月浙江省高考英語試卷真題(含答案)
- QCT457-2023救護車技術(shù)規(guī)范
- 部編版高二思想政治下冊選擇性必修2《法律與生活》教學計劃(含教學進度安排)
- 金融基礎(chǔ)知識考試題庫300題(含答案)
- 人教版PEP六年級英語下冊課件unit1
- 2023年北京定額及計算規(guī)則
- 混凝土課程設(shè)計預應力混凝土簡支梁設(shè)計
評論
0/150
提交評論