Part 1 采集數(shù)據(jù)
- 在fio的Android.bp加入下面的code.
pgo: {
instrumentation: true,
benchmarks: [
"fio", // benchmarks可以理解為當(dāng)前優(yōu)化的workload的名字.
],
profile_file: "fio.profdata", // fio.profdata表示會(huì)去toolchain/pgo-profiles下面尋找該文件.
}
- make fio ANDROID_PGO_INSTRUMENT=fio
- 運(yùn)行binary/library, 它會(huì)在/data/local/tmp下面生成profraw的文件
# build/soong/cc/pgo.go
const profileInstrumentFlag = "-fprofile-generate=/data/local/tmp"
- llvm-profdata merge -output=fio.profdata default_xxxxxx.profraw
注意llvm-profdata需要用Android prebuild的版本, 位于./prebuilts/clang/host/
llvm-profdata show -all-functions fio.profdata // 可以dump profile信息, 可以通過function id將default_xxx.profraw和具體的library/binary對應(yīng)起來.
Part 2 使用profile來優(yōu)化
- 把profdata放到toolchain/pgo-profiles
- make fio // 不設(shè)置ANDROID_PGO_INSTRUMENT的話, 它就不會(huì)插入profile的代碼.
- run
PS:
- 進(jìn)程會(huì)在exit的時(shí)候dump profile, 收到signal 9的時(shí)候并不會(huì)dump.
所以如果是要優(yōu)化長期存在的service, 需要做些hack.
# external/compiler-rt/lib/profile/InstrProfilingFile.c
int __llvm_profile_register_write_file_atexit(void) {
- 假設(shè)已經(jīng)帶上ANDROID_PGO_INSTRUMENT編譯過libc了. 但是你在make別的庫的時(shí)候, 沒有加這個(gè)變量, 同時(shí)這個(gè)庫引用過libc, 那也會(huì)引起libc的重編譯
- 可以通過nm或者objdump來驗(yàn)證opted library是否符合預(yù)期.
(hot的method排列在相鄰的VMA上)
nm -n [lib_name]
參考: https://source.android.com/devices/tech/perf/pgo
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者