From 151ceb96911bfec7ec57bfc26f591baec31a497f Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 6 Aug 2009 12:40:56 -0700 Subject: More work on issue #2030135: Device sluggish Also include the page faults in the cpu info, to help determine if the system is paging at the time of an ANR. --- services/java/com/android/server/ProcessStats.java | 74 +++++++++++++++++----- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/services/java/com/android/server/ProcessStats.java b/services/java/com/android/server/ProcessStats.java index 58f8980c004d..af80e20cc0e6 100644 --- a/services/java/com/android/server/ProcessStats.java +++ b/services/java/com/android/server/ProcessStats.java @@ -46,18 +46,23 @@ public class ProcessStats { PROC_SPACE_TERM, PROC_SPACE_TERM, PROC_SPACE_TERM, + PROC_SPACE_TERM|PROC_OUT_LONG, // 9: minor faults PROC_SPACE_TERM, - PROC_SPACE_TERM, - PROC_SPACE_TERM, + PROC_SPACE_TERM|PROC_OUT_LONG, // 11: major faults PROC_SPACE_TERM, PROC_SPACE_TERM|PROC_OUT_LONG, // 13: utime PROC_SPACE_TERM|PROC_OUT_LONG // 14: stime }; + static final int PROCESS_STAT_MINOR_FAULTS = 0; + static final int PROCESS_STAT_MAJOR_FAULTS = 1; + static final int PROCESS_STAT_UTIME = 2; + static final int PROCESS_STAT_STIME = 3; + /** Stores user time and system time in 100ths of a second. */ - private final long[] mProcessStatsData = new long[2]; + private final long[] mProcessStatsData = new long[4]; /** Stores user time and system time in 100ths of a second. */ - private final long[] mSinglePidStatsData = new long[2]; + private final long[] mSinglePidStatsData = new long[4]; private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] { PROC_SPACE_TERM, @@ -151,6 +156,11 @@ public class ProcessStats { public int rel_utime; public int rel_stime; + public long base_minfaults; + public long base_majfaults; + public int rel_minfaults; + public int rel_majfaults; + public boolean active; public boolean added; public boolean removed; @@ -313,12 +323,16 @@ public class ProcessStats { continue; } - final long utime = procStats[0]; - final long stime = procStats[1]; + final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS]; + final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS]; + final long utime = procStats[PROCESS_STAT_UTIME]; + final long stime = procStats[PROCESS_STAT_STIME]; if (utime == st.base_utime && stime == st.base_stime) { st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; if (st.active) { st.active = false; } @@ -342,6 +356,10 @@ public class ProcessStats { st.rel_stime = (int)(stime - st.base_stime); st.base_utime = utime; st.base_stime = stime; + st.rel_minfaults = (int)(minfaults - st.base_minfaults); + st.rel_majfaults = (int)(majfaults - st.base_majfaults); + st.base_minfaults = minfaults; + st.base_majfaults = majfaults; //Log.i("Load", "Stats changed " + name + " pid=" + st.pid // + " name=" + st.name + " utime=" + utime // + " stime=" + stime); @@ -364,11 +382,13 @@ public class ProcessStats { procStats, null)) { st.baseName = parentPid < 0 ? procStatsString[0] : Integer.toString(pid); - st.base_utime = procStats[1]; - st.base_stime = procStats[2]; + st.base_utime = 0; //procStats[1]; + st.base_stime = 0; //procStats[2]; + st.base_minfaults = st.base_majfaults = 0; } else { st.baseName = ""; st.base_utime = st.base_stime = 0; + st.base_minfaults = st.base_majfaults = 0; } if (parentPid < 0) { @@ -386,6 +406,8 @@ public class ProcessStats { //Log.i("Load", "New process: " + st.pid + " " + st.name); st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; st.added = true; if (!first) { workingProcs.add(st); @@ -396,6 +418,8 @@ public class ProcessStats { // This process has gone away! st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; st.removed = true; workingProcs.add(st); allProcs.remove(curStatsIndex); @@ -412,6 +436,8 @@ public class ProcessStats { final Stats st = allProcs.get(curStatsIndex); st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; st.removed = true; workingProcs.add(st); allProcs.remove(curStatsIndex); @@ -427,7 +453,8 @@ public class ProcessStats { final long[] statsData = mSinglePidStatsData; if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT, null, statsData, null)) { - long time = statsData[0] + statsData[1]; + long time = statsData[PROCESS_STAT_UTIME] + + statsData[PROCESS_STAT_STIME]; return time; } return 0; @@ -497,33 +524,35 @@ public class ProcessStats { pw.print(now-mCurrentSampleTime); pw.println("ms ago:"); - final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime + mRelIrqTime + - mRelSoftIrqTime + mRelIdleTime; + final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime + + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime; int N = mWorkingProcs.size(); for (int i=0; i 0 || majFaults > 0) { + pw.print(" / faults:"); + if (minFaults > 0) { + pw.print(" "); + pw.print(minFaults); + pw.print(" minor"); + } + if (majFaults > 0) { + pw.print(" "); + pw.print(majFaults); + pw.print(" major"); + } + } pw.println(); } -- cgit v1.2.3-59-g8ed1b