性能工具之所以使用擴展的BPF,部分原因在于它的可編程性。BPF程序可以執(zhí)行自定義等待時間計算和統(tǒng)計摘要。僅這些功能就可以構成一個有趣的工具,并且還有許多其他具有這些功能的跟蹤工具。使BPF與眾不同的是,它還高效且生產(chǎn)安全,并且內(nèi)置于Linux內(nèi)核中。使用BPF,您可以在生產(chǎn)環(huán)境中運行這些工具,而無需添加任何新的內(nèi)核組件。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供涵江網(wǎng)站建設、涵江做網(wǎng)站、涵江網(wǎng)站設計、涵江網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、涵江企業(yè)網(wǎng)站模板建站服務,10多年涵江做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
讓我們看一些輸出和一個圖表,以了解性能工具如何使用BPF。該示例來自我發(fā)布的早期BPF工具bitehist,該工具以直方圖的形式顯示了磁盤I/O的大?。?/p>
關鍵的變化是直方圖可以在內(nèi)核上下文中生成,這大大減少了復制到用戶空間的數(shù)據(jù)量。這種效率的提高是如此之大,以至于它可以允許工具在生產(chǎn)中運行,否則這些工具將太昂貴。詳細地:
在BPF之前,生成此直方圖摘要的完整步驟為:
1. 在內(nèi)核中:為磁盤I / O事件啟用檢測。
2. 在內(nèi)核中,對于每個事件:將一條記錄寫入perf緩沖區(qū)。如果使用跟蹤點(首選),則記錄包含有關磁盤I / O的元數(shù)據(jù)的幾個字段。
3. 在用戶空間中:定期將所有事件的緩沖區(qū)復制到用戶空間。
4. 在用戶空間中:遍歷每個事件,為字節(jié)字段解析事件元數(shù)據(jù)。其他字段將被忽略。
5. 在用戶空間中:生成字節(jié)字段的直方圖摘要。
注意:這些是可用的最佳步驟,但它們并沒有顯示唯一的方法。您可以安裝樹外跟蹤器(例如SystemTap),但是根據(jù)您的內(nèi)核和發(fā)行版,這可能會很艱難。您也可以修改內(nèi)核代碼,或開發(fā)自定義kprobe模塊,但是這兩種方法都涉及挑戰(zhàn),并帶來風險。我開發(fā)了自己的解決方法,稱為“ hacktogram”,其中涉及為直方圖的每一行創(chuàng)建多個帶范圍過濾器的perf(1)統(tǒng)計計數(shù)器[16]。那太差了。
步驟2到步驟4對于高I / O系統(tǒng)具有高性能開銷。想象一下,每秒傳輸10,000個磁盤I / O跟蹤記錄到用戶空間程序以進行分析和匯總。
使用BPF,bitesize程序的步驟為:
1. 在內(nèi)核中:啟用對磁盤I / O事件的檢測,并附加一個由bitesize定義的自定義BPF程序。
2. 在內(nèi)核中,對于每個事件:運行BPF程序。它僅獲取字節(jié)字段,并將其保存到自定義BPF映射直方圖中。
3. 在用戶空間中:一次讀取BPF地圖直方圖并打印出來。
此方法避免了將事件復制到用戶空間并對其進行重新處理的開銷。它還避免了復制未使用的元數(shù)據(jù)字段。復制到用戶空間的唯一數(shù)據(jù)顯示在上一個輸出中:“ count”列,它是數(shù)字數(shù)組。