概述
透過之前的調研,發現Android官方得的iotop效率更高,於是計劃從定位iotop原始碼,原始碼編譯,新增IO歷史資料功能幾步入手,進一步調研iotop的使用。
內容
1. 定位iotop原始碼
由於發現iotop是android9.0以上系統自帶的工具,因此去查了9.0的原始碼,發現iotop原始碼果然在這裡,是c++寫的。
主要就這個幾個檔案,但是由於iotop內部引用了Android自建庫的一些函式,因此沒法單獨編譯,需要把android相關程式碼下全一起編譯。
2. Android原始碼下載並編譯
借了一臺外網伺服器,xshell連線上,配置了一大堆東西,具體可見參考裡的文章(記一次編譯Android原始碼),主要是執行了
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r3
下載好原始碼之後開始開始嘗試編譯iotop,
source build/envsetup.sh
lunch
選擇一個與目標機器一致的就可以了,我這裡是aosp¬_x86_eng,
編譯好之後用lrzsz工具將編好的iotop可執行檔案拷到本地再傳到裝置裡,覆蓋掉之前的iotop,然後順利執行。
3. Iotop獲取IO資料得方式
透過原始碼可以看到官方的iotop的核心獲取資料邏輯在taskstats.cpp裡面,主要是使用了GetStats這個函式,原始碼可見:taskstats.cpp,關鍵邏輯如下截圖,
這裡使用了linux/taskstats.h這個結構體,這裡面定義了一些io屬性,透過替換taskstats.cpp原始碼裡的變數,實驗後發現這些變數裡沒有可以表示IO歷史記錄的。原始碼可見:taskstats.h
4. 修改iotop,加上歷史IO監控
Holding
5. Shell指令碼Iotop獲取資料的方式
讀取了io下的write_bytes資料,這個值是儲存了程序自建立以來的歷史IO資訊,存在虛擬記憶體中,程序被銷燬重建後進程id會重新分配,因此程序被殺再啟動,就會重新統計新pid的歷史io資料。
小結
透過原始碼閱讀和實驗,android官方的iotop工具目前看來暫不支援獲取IO歷史資料。具體獲取資料的方法需要閱讀taskstats相關原始碼,深入linux核心去探查了,因為已經基本確定無法達到需求,筆者沒有繼續深入了。
參考
AndroidXref Pie 9.0.0_r3
記一次編譯Android原始碼
Linux上傳下載軟體lrzsz
linux taskstats初探
taskstats.h原始碼
http://androidxref.com/9.0.0_r3/xref/system/extras/taskstats/taskstats.c
本文章已修改原文用詞符合繁體字使用者習慣使其容易閱讀
版權宣告:此處為CSDN博主「飛翔的易拉罐」的原創文章,依據CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/moxiouhao/article/details/101283070