如何通过ADB获取Android设备进程固定周期的缺页故障数据?
自定义周期获取Android进程缺页故障数据的可行方案
方案1:基于proc/{pid}/stat的定时采样脚本
/proc/{pid}/stat文件直接存储了进程启动以来的**主缺页故障(maj_flt)和次缺页故障(min_flt)**累计值,你可以通过定时采样、计算增量的方式,实现自定义时间窗口的统计。
脚本示例
#!/bin/sh # 参数说明:目标PID、采样间隔(秒)、采样次数 TARGET_PID=$1 SAMPLING_INTERVAL=$2 SAMPLING_TIMES=$3 # 获取初始累计值 read -r _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ MIN_FLT_START MAJ_FLT_START < /proc/$TARGET_PID/stat for i in $(seq 1 $SAMPLING_TIMES); do sleep $SAMPLING_INTERVAL # 获取当前累计值 read -r _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ MIN_FLT_CURRENT MAJ_FLT_CURRENT < /proc/$TARGET_PID/stat # 计算周期内增量 MIN_FLT_DELTA=$((MIN_FLT_CURRENT - MIN_FLT_START)) MAJ_FLT_DELTA=$((MAJ_FLT_CURRENT - MAJ_FLT_START)) echo "[$(date +%Y-%m-%d_%H:%M:%S)] 次缺页增量: $MIN_FLT_DELTA | 主缺页增量: $MAJ_FLT_DELTA" # 更新初始值为当前值,用于下一次计算 MIN_FLT_START=$MIN_FLT_CURRENT MAJ_FLT_START=$MAJ_FLT_CURRENT done
使用步骤
# 推送脚本到设备 adb push page_fault_sample.sh /data/local/tmp/ # 赋予执行权限 adb shell chmod +x /data/local/tmp/page_fault_sample.sh # 执行采样:PID为1234的进程,每5秒采样一次,共采10次 adb shell /data/local/tmp/page_fault_sample.sh 1234 5 10
这个方案完全自定义周期,数据准确无额外依赖,仅需自行处理进程退出、权限等异常情况。
方案2:Perfetto SQL筛选单个进程缺页数据
Perfetto支持通过SQL精准提取单个进程的缺页事件,只需先录制包含缺页轨迹的trace文件,再通过查询聚合数据:
录制trace文件
adb shell perfetto -o /data/local/tmp/page_fault_trace.trace -t 30s \ -c ' buffers: { size_kb: 8192 } data_sources: { config { name: "linux.page_faults" } } data_sources: { config { name: "linux.process_stats" target_buffer: 0 process_stats_config { scan_all_processes_on_start: true } } }'
解析单个进程数据
将trace文件拉到本地后,用Perfetto UI或命令行执行SQL查询,例如筛选PID为1234的进程,按1秒周期聚合:
SELECT ts / 1000000000 as timestamp, pid, process.name, CASE type WHEN 1 THEN "主缺页" WHEN 2 THEN "次缺页" END as fault_type, COUNT(*) as fault_count FROM page_faults JOIN process USING (pid) WHERE pid = 1234 GROUP BY timestamp, pid, fault_type ORDER BY timestamp
命令行解析方式:
perfetto query -i page_fault_trace.trace --sql "SELECT ..."
该方案无需手动计算增量,还能关联进程名称等信息,适合复杂分析场景。
方案3:dumpsys meminfo辅助采样
虽然dumpsys meminfo不支持自定义周期,但它会输出进程的缺页累计值,你可以结合定时脚本计算增量:
adb shell dumpsys meminfo <PID> | grep Faults
输出示例:
Faults: 1234 minor, 56 major
内容的提问来源于stack exchange,提问作者Shazer
相关产品推荐
相关产品推荐

