android监控io产生的应用,Android IO性能分析及排查
概述
Android得IO問題實際上就是探究Linux得IO問題。
本文主要是總結了網上各路大神得經驗,寫了一些實際操作中遇到得問題和解決方案。
最近在搞性能優化方面得研究,研究使用Soloπ得io占用對性能得影響問題時,偶然發現了機器上IO很頻繁。老大說去看看為啥io那么頻繁吧,于是乎…走上了一條不歸路啊T.T。
內容
網上搜來搜去基本就那幾篇東西,大部分都是轉來轉去。而且多是針對linux系統得,專門針對Android得資料不多。
筆者結合實際操作體驗,簡單介紹下Android系統中幾種統計方式和實際效果。使用目標是找到頻繁IO的進程并優化。
系統級IO監控:iostat、vmstat
進程級IO監控:iodump、iotop
文件級IO監控:ioprofile,sysstat
vmstat
可以獲取全局IO信息。筆者也是通過這個命令發現系統IO異常的。
用法:adb shell vmstat 1#每一秒打印一次數據
我們主要看io下面的bi和bo,
bi:從塊設備讀取數據的量(讀磁盤);從磁盤里出來進入到內存里邊去
bo: 從塊設備寫入數據的量(寫磁盤);
其他參數可以獲取內存,cpu等數據,可以去每天一個linux命令:vmstat自行了解。
lsof + strace
這個方案算是我暫時的解決方案了。
Android未閹割的Linux原生命令,可以獲取很多系統參數輔助分析,缺點是數據沒有格式化需要自己處理。
邏輯:用lsof查找系統文件占用,找到占用文件的進程;再用strace 監控進程系統方法調用。
用法:
1、adb shell lsof #查詢目前被占用得文件及進程
2、adb shell strace –p 1693 #按照Pid查詢系統調用
可以看到write()頻繁調用,輸出的就是寫入的文件大小,單位是KB。
基本可以定位到問題出在logcat上,想辦法關掉他的本地寫入或者別寫太多數據就可以解決問題。
iotop
需要cpu內核開幾個io配置。要聯系內核開發的同學。我的機器上沒辦法配置這些,因此用不了。
Git地址:https://github.com/laufersteppenwolf/iotop
不用找了,再找都是這個地址,或是直接復制的這里的內容。
原理:開啟內核io記錄,遍歷查詢proc/{pid}/io數據并分析。
看圖結果還是十分直觀的,只可惜用不了。
用法:
開啟內核配置
聯系內核開發的同學,修改defconfig里面的配置。(我就掛在這一步)
To enable I/O accounting the following configs have to be set:
CONFIG_TASKSTATS
CONFIG_TASK_IO_ACCOUNTING
CONFIG_TASK_XACCT
CONFIG_TASK_DELAY_ACCT
將iotop的代碼導入設備,執行sh iotop.sh
也就是運行一段腳本。當然linux的也可以yum install iotop。可是android么得yum啊…
執行iotop命令,查詢結果
iopp
在網上看到有人說iotop受到內核限制,因此搞了個iopp,滿懷希望以為不用搞內核配置了,結果發現沒卵用。
Git地址:https://github.com/markwkm/iopp
用法:(yum很簡單,但是用不了)
由于是C代碼,因此要編譯成執行文件,gcc搞起來。cmake應該也可以,不過筆者沒有試。
去Git把代碼搞下來,放到設備里
懶人捷徑iopp.c 不放心的自行去下面git里面下。
編譯c代碼
adb shell 進到iopp.c再設備商的存放路徑。
gcc -Wall -fPIE -pie -o iopp iopp.c
當然要執行上面這段話不是那么容易滴。
首先得有個gcc編譯環境。
a、豌豆莢下載gcc plugin for C4Droid。b、后綴改成zip,解壓出assest中得gcc壓縮包。c、得到gcc執行器代碼。
懶人福利gcc。
鏈接: https://pan.baidu.com/s/1dmUvO4xj8afM8r0CP00KTA 提取碼: 87gw
想嘗試得去下吧,筆者解壓好了。(MD csdn資源竟然強制下載要積分)
偷懶傳送門:在Android上使用gcc編譯C/C++源程序
配置過程中會遇到如下錯誤,配置不對或者su錯了,請多試幾次。
/system/bin/sh: gcc: not found
執行
OK搞定!!終于可以編譯了!!!
gcc -o iopp.c成功!
執行./iopp,
報錯:"./iopp": error: only position independent executables (PIE) are supported.
瑪德,5.0以上手機要用 gcc -fPIE -pie.為啥子自己去查吧。
再來gcc -Wall -fPIE -pie -o iopp iopp.c
這回沒錯了,可是執行后發現…瑪德根本沒數據,不知道哪錯了,得去debug源碼了,放棄了,浪費時間。
iodump
原理:分析dmesg輸出得數據。
首先要開一個開關:echo 1 > /proc/sys/vm/block_dump
然后:watch -n 1 "dmesg -c | grep WRITE"
watch再android下是沒有得,針對這些沒有得命令咋搞呢?
busybox了解一下。android安裝busybox 去看吧,反正就是每秒執行,有別的命令也行。
執行成功,可以看到很多WRITE信息,但是筆者測試了一個應用得寫入操作,打印得卻不是該應用進程得PID,奇怪。
最后關一下:echo 0 > /proc/sys/vm/block_dump
總結
研究了兩三天,折騰了一大圈,網上多的是Linux得資料,Android用得時候受到諸如yum,gcc等很多命令限制。很難受。最后還是用的lsof + strace得方式去做得。
像其他得ioprofile,sysstat也很牛批,可以自行研究。
因為也是要裝插件,筆者沒去看了。
參考:
Linux下的IO監控與分析
Linux下的一些I/O統計工具
android I/O Performance 的一些查看方法
Linux 調試三劍客——strace,lsof,tcpdump
Linux下查看進程IO工具iopp
GCC常用選項
linux下dmesg命令詳解
總結
以上是生活随笔為你收集整理的android监控io产生的应用,Android IO性能分析及排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA格式代码出现两次_NullPoi
- 下一篇: 仿射加密加解密算法