Merge "Add data from /proc/pagetypeinfo to procstats." into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4dbdd5d971
@@ -43,6 +43,8 @@ import com.android.internal.app.procstats.DumpUtils.*;
|
|||||||
import dalvik.system.VMRuntime;
|
import dalvik.system.VMRuntime;
|
||||||
import libcore.util.EmptyArray;
|
import libcore.util.EmptyArray;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
@@ -51,6 +53,8 @@ import java.util.Arrays;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
public final class ProcessStats implements Parcelable {
|
public final class ProcessStats implements Parcelable {
|
||||||
public static final String TAG = "ProcessStats";
|
public static final String TAG = "ProcessStats";
|
||||||
@@ -151,7 +155,7 @@ public final class ProcessStats implements Parcelable {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Current version of the parcel format.
|
// Current version of the parcel format.
|
||||||
private static final int PARCEL_VERSION = 20;
|
private static final int PARCEL_VERSION = 21;
|
||||||
// In-memory Parcel magic number, used to detect attempts to unmarshall bad data
|
// In-memory Parcel magic number, used to detect attempts to unmarshall bad data
|
||||||
private static final int MAGIC = 0x50535454;
|
private static final int MAGIC = 0x50535454;
|
||||||
|
|
||||||
@@ -188,6 +192,12 @@ public final class ProcessStats implements Parcelable {
|
|||||||
// For reading parcels.
|
// For reading parcels.
|
||||||
ArrayList<String> mIndexToCommonString;
|
ArrayList<String> mIndexToCommonString;
|
||||||
|
|
||||||
|
private static final Pattern sPageTypeRegex = Pattern.compile(
|
||||||
|
"^Node\\s+(\\d+),.*. type\\s+(\\w+)\\s+([\\s\\d]+?)\\s*$");
|
||||||
|
private final ArrayList<Integer> mPageTypeZones = new ArrayList<Integer>();
|
||||||
|
private final ArrayList<String> mPageTypeLabels = new ArrayList<String>();
|
||||||
|
private final ArrayList<int[]> mPageTypeSizes = new ArrayList<int[]>();
|
||||||
|
|
||||||
public ProcessStats(boolean running) {
|
public ProcessStats(boolean running) {
|
||||||
mRunning = running;
|
mRunning = running;
|
||||||
reset();
|
reset();
|
||||||
@@ -493,6 +503,7 @@ public final class ProcessStats implements Parcelable {
|
|||||||
mReadError = null;
|
mReadError = null;
|
||||||
mFlags = 0;
|
mFlags = 0;
|
||||||
evaluateSystemProperties(true);
|
evaluateSystemProperties(true);
|
||||||
|
updateFragmentation();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean evaluateSystemProperties(boolean update) {
|
public boolean evaluateSystemProperties(boolean update) {
|
||||||
@@ -515,6 +526,101 @@ public final class ProcessStats implements Parcelable {
|
|||||||
|
|
||||||
static final int[] BAD_TABLE = new int[0];
|
static final int[] BAD_TABLE = new int[0];
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the system's memory fragmentation info.
|
||||||
|
*/
|
||||||
|
public void updateFragmentation() {
|
||||||
|
// Parse /proc/pagetypeinfo and store the values.
|
||||||
|
BufferedReader reader = null;
|
||||||
|
try {
|
||||||
|
reader = new BufferedReader(new FileReader("/proc/pagetypeinfo"));
|
||||||
|
final Matcher matcher = sPageTypeRegex.matcher("");
|
||||||
|
mPageTypeZones.clear();
|
||||||
|
mPageTypeLabels.clear();
|
||||||
|
mPageTypeSizes.clear();
|
||||||
|
while (true) {
|
||||||
|
final String line = reader.readLine();
|
||||||
|
if (line == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
matcher.reset(line);
|
||||||
|
if (matcher.matches()) {
|
||||||
|
final Integer zone = Integer.valueOf(matcher.group(1), 10);
|
||||||
|
if (zone == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mPageTypeZones.add(zone);
|
||||||
|
mPageTypeLabels.add(matcher.group(2));
|
||||||
|
mPageTypeSizes.add(splitAndParseNumbers(matcher.group(3)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
mPageTypeZones.clear();
|
||||||
|
mPageTypeLabels.clear();
|
||||||
|
mPageTypeSizes.clear();
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
if (reader != null) {
|
||||||
|
try {
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException allHopeIsLost) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split the string of digits separaed by spaces. There must be no
|
||||||
|
* leading or trailing spaces. The format is ensured by the regex
|
||||||
|
* above.
|
||||||
|
*/
|
||||||
|
private static int[] splitAndParseNumbers(String s) {
|
||||||
|
// These are always positive and the numbers can't be so big that we'll overflow
|
||||||
|
// so just do the parsing inline.
|
||||||
|
boolean digit = false;
|
||||||
|
int count = 0;
|
||||||
|
final int N = s.length();
|
||||||
|
// Count the numbers
|
||||||
|
for (int i=0; i<N; i++) {
|
||||||
|
final char c = s.charAt(i);
|
||||||
|
if (c >= '0' && c <= '9') {
|
||||||
|
if (!digit) {
|
||||||
|
digit = true;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
digit = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Parse the numbers
|
||||||
|
final int[] result = new int[count];
|
||||||
|
int p = 0;
|
||||||
|
int val = 0;
|
||||||
|
for (int i=0; i<N; i++) {
|
||||||
|
final char c = s.charAt(i);
|
||||||
|
if (c >= '0' && c <= '9') {
|
||||||
|
if (!digit) {
|
||||||
|
digit = true;
|
||||||
|
val = c - '0';
|
||||||
|
} else {
|
||||||
|
val *= 10;
|
||||||
|
val += c - '0';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (digit) {
|
||||||
|
digit = false;
|
||||||
|
result[p++] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count > 0) {
|
||||||
|
result[count-1] = val;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void writeCompactedLongArray(Parcel out, long[] array, int num) {
|
private void writeCompactedLongArray(Parcel out, long[] array, int num) {
|
||||||
for (int i=0; i<num; i++) {
|
for (int i=0; i<num; i++) {
|
||||||
long val = array[i];
|
long val = array[i];
|
||||||
@@ -717,6 +823,15 @@ public final class ProcessStats implements Parcelable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fragmentation info (/proc/pagetypeinfo)
|
||||||
|
final int NPAGETYPES = mPageTypeLabels.size();
|
||||||
|
out.writeInt(NPAGETYPES);
|
||||||
|
for (int i=0; i<NPAGETYPES; i++) {
|
||||||
|
out.writeInt(mPageTypeZones.get(i));
|
||||||
|
out.writeString(mPageTypeLabels.get(i));
|
||||||
|
out.writeIntArray(mPageTypeSizes.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
mCommonStringToIndex = null;
|
mCommonStringToIndex = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -981,6 +1096,20 @@ public final class ProcessStats implements Parcelable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fragmentation info
|
||||||
|
final int NPAGETYPES = in.readInt();
|
||||||
|
mPageTypeZones.clear();
|
||||||
|
mPageTypeZones.ensureCapacity(NPAGETYPES);
|
||||||
|
mPageTypeLabels.clear();
|
||||||
|
mPageTypeLabels.ensureCapacity(NPAGETYPES);
|
||||||
|
mPageTypeSizes.clear();
|
||||||
|
mPageTypeSizes.ensureCapacity(NPAGETYPES);
|
||||||
|
for (int i=0; i<NPAGETYPES; i++) {
|
||||||
|
mPageTypeZones.add(in.readInt());
|
||||||
|
mPageTypeLabels.add(in.readString());
|
||||||
|
mPageTypeSizes.add(in.createIntArray());
|
||||||
|
}
|
||||||
|
|
||||||
mIndexToCommonString = null;
|
mIndexToCommonString = null;
|
||||||
|
|
||||||
if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!");
|
if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!");
|
||||||
@@ -1271,6 +1400,8 @@ public final class ProcessStats implements Parcelable {
|
|||||||
*/
|
*/
|
||||||
pw.print(" mRunning="); pw.println(mRunning);
|
pw.print(" mRunning="); pw.println(mRunning);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dumpFragmentationLocked(pw);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
|
public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
|
||||||
@@ -1282,6 +1413,21 @@ public final class ProcessStats implements Parcelable {
|
|||||||
dumpTotalsLocked(pw, now);
|
dumpTotalsLocked(pw, now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void dumpFragmentationLocked(PrintWriter pw) {
|
||||||
|
pw.println();
|
||||||
|
pw.println("Available pages by page size:");
|
||||||
|
final int NPAGETYPES = mPageTypeLabels.size();
|
||||||
|
for (int i=0; i<NPAGETYPES; i++) {
|
||||||
|
pw.format("Zone %3d %14s ", mPageTypeZones.get(i), mPageTypeLabels.get(i));
|
||||||
|
final int[] sizes = mPageTypeSizes.get(i);
|
||||||
|
final int N = sizes == null ? 0 : sizes.length;
|
||||||
|
for (int j=0; j<N; j++) {
|
||||||
|
pw.format("%6d", sizes[j]);
|
||||||
|
}
|
||||||
|
pw.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight,
|
long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight,
|
||||||
long totalTime, long curTotalMem, int samples) {
|
long totalTime, long curTotalMem, int samples) {
|
||||||
if (memWeight != 0) {
|
if (memWeight != 0) {
|
||||||
@@ -1540,6 +1686,24 @@ public final class ProcessStats implements Parcelable {
|
|||||||
pw.print(totalMem.processStateSamples[i]);
|
pw.print(totalMem.processStateSamples[i]);
|
||||||
}
|
}
|
||||||
pw.println();
|
pw.println();
|
||||||
|
|
||||||
|
final int NPAGETYPES = mPageTypeLabels.size();
|
||||||
|
for (int i=0; i<NPAGETYPES; i++) {
|
||||||
|
pw.print("availablepages,");
|
||||||
|
pw.print(mPageTypeLabels.get(i));
|
||||||
|
pw.print(",");
|
||||||
|
pw.print(mPageTypeZones.get(i));
|
||||||
|
pw.print(",");
|
||||||
|
final int[] sizes = mPageTypeSizes.get(i);
|
||||||
|
final int N = sizes == null ? 0 : sizes.length;
|
||||||
|
for (int j=0; j<N; j++) {
|
||||||
|
if (j != 0) {
|
||||||
|
pw.print(",");
|
||||||
|
}
|
||||||
|
pw.print(sizes[j]);
|
||||||
|
}
|
||||||
|
pw.println();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user