diff options
author | Colin Cross <ccross@android.com> | 2013-06-21 12:55:56 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2013-06-22 13:10:57 -0700 |
commit | d2b8656ce47ee08aba7cb95499deeb29254eb655 (patch) | |
tree | 50ff3869c873b9570e9777bf58e138bb9f6c7563 /librank/librank.c | |
parent | 6f5b13c5f68995db4191ec1b8cc97e18fbd7b390 (diff) | |
download | extras-d2b8656ce47ee08aba7cb95499deeb29254eb655.tar.gz |
librank: show swapped pages per library
Add a column showing swapped pages per library, but only show it
if swapped pages exist in at least one library.
Change-Id: I8f5a55dee7ed8d1f02ed7c947f6a22f7a5771eb8
Diffstat (limited to 'librank/librank.c')
-rw-r--r-- | librank/librank.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/librank/librank.c b/librank/librank.c index 5f82a021..22985465 100644 --- a/librank/librank.c +++ b/librank/librank.c @@ -61,6 +61,7 @@ declare_sort(vss); declare_sort(rss); declare_sort(pss); declare_sort(uss); +declare_sort(swap); #define INIT_LIBRARIES 16 #define INIT_MAPPINGS 4 @@ -220,6 +221,8 @@ int main(int argc, char *argv[]) { uint64_t required_flags; uint64_t flags_mask; + bool has_swap = false; + signal(SIGPIPE, SIG_IGN); compfn = &sort_by_pss; order = -1; @@ -242,12 +245,13 @@ int main(int argc, char *argv[]) { {"uss", 0, 0, 'u'}, {"vss", 0, 0, 'v'}, {"rss", 0, 0, 'r'}, + {"swap", 0, 0, 's'}, {"reverse", 0, 0, 'R'}, {"path", required_argument, 0, 'P'}, {"perm", required_argument, 0, 'm'}, {0, 0, 0, 0} }; - c = getopt_long(argc, argv, "acChm:pP:uvrR", longopts, NULL); + c = getopt_long(argc, argv, "acChm:pP:uvrsR", longopts, NULL); if (c < 0) { break; } @@ -286,6 +290,9 @@ int main(int argc, char *argv[]) { case 'r': compfn = &sort_by_rss; break; + case 's': + compfn = &sort_by_swap; + break; case 'R': order *= -1; break; @@ -353,12 +360,23 @@ int main(int argc, char *argv[]) { pm_map_name(maps[j]), proc->pid); exit(EXIT_FAILURE); } + + if (map_usage.swap) { + has_swap = true; + } + pm_memusage_add(&mi->usage, &map_usage); pm_memusage_add(&li->total_usage, &map_usage); } } - printf( " %6s %6s %6s %6s %6s %s\n", "RSStot", "VSS", "RSS", "PSS", "USS", "Name/PID"); + printf(" %6s %6s %6s %6s %6s ", "RSStot", "VSS", "RSS", "PSS", "USS"); + + if (has_swap) { + printf(" %6s ", "Swap"); + } + + printf("Name/PID\n"); fflush(stdout); qsort(libraries, libraries_count, sizeof(libraries[0]), &licmp); @@ -366,7 +384,11 @@ int main(int argc, char *argv[]) { for (i = 0; i < libraries_count; i++) { li = libraries[i]; - printf("%6dK %6s %6s %6s %6s %s\n", li->total_usage.pss / 1024, "", "", "", "", li->name); + printf("%6dK %6s %6s %6s %6s ", li->total_usage.pss / 1024, "", "", "", ""); + if (has_swap) { + printf(" %6s ", ""); + } + printf("%s\n", li->name); fflush(stdout); qsort(li->mappings, li->mappings_count, sizeof(li->mappings[0]), compfn); @@ -374,11 +396,15 @@ int main(int argc, char *argv[]) { for (j = 0; j < li->mappings_count; j++) { mi = li->mappings[j]; pi = mi->proc; - printf( " %6s %6dK %6dK %6dK %6dK %s [%d]\n", "", + printf( " %6s %6dK %6dK %6dK %6dK ", "", mi->usage.vss / 1024, mi->usage.rss / 1024, mi->usage.pss / 1024, - mi->usage.uss / 1024, + mi->usage.uss / 1024); + if (has_swap) { + printf("%6dK ", mi->usage.swap / 1024); + } + printf(" %s [%d]\n", pi->cmdline, pi->pid); } @@ -390,13 +416,14 @@ int main(int argc, char *argv[]) { } static void usage(char *myname) { - fprintf(stderr, "Usage: %s [ -P | -L ] [ -v | -r | -p | -u | -h ]\n" + fprintf(stderr, "Usage: %s [ -P | -L ] [ -v | -r | -p | -u | -s | -h ]\n" "\n" "Sort options:\n" " -v Sort processes by VSS.\n" " -r Sort processes by RSS.\n" " -p Sort processes by PSS.\n" " -u Sort processes by USS.\n" + " -s Sort processes by swap.\n" " (Default sort order is PSS.)\n" " -a Show all mappings, including stack, heap and anon.\n" " -P /path Limit libraries displayed to those in path.\n" @@ -445,3 +472,4 @@ create_sort(vss, numcmp) create_sort(rss, numcmp) create_sort(pss, numcmp) create_sort(uss, numcmp) +create_sort(swap, numcmp) |