procrank: show swapped pages per process
Add a column showing swapped pages per process, but only show it
if swapped pages exist in at least one process.
Change-Id: I51a12fb8999c2a73418277fd575e7109478667d5
diff --git a/procrank/procrank.c b/procrank/procrank.c
index 061f40f..cc06bcc 100644
--- a/procrank/procrank.c
+++ b/procrank/procrank.c
@@ -16,6 +16,7 @@
#include <dirent.h>
#include <errno.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
@@ -41,6 +42,7 @@
declare_sort(rss);
declare_sort(pss);
declare_sort(uss);
+declare_sort(swap);
int (*compfn)(const void *a, const void *b);
static int order;
@@ -122,8 +124,10 @@
size_t num_procs;
unsigned long total_pss;
unsigned long total_uss;
+ unsigned long total_swap;
char cmdline[256]; // this must be within the range of int
int error;
+ bool has_swap = false;
#define WS_OFF 0
#define WS_ONLY 1
@@ -143,6 +147,7 @@
if (!strcmp(argv[arg], "-r")) { compfn = &sort_by_rss; continue; }
if (!strcmp(argv[arg], "-p")) { compfn = &sort_by_pss; continue; }
if (!strcmp(argv[arg], "-u")) { compfn = &sort_by_uss; continue; }
+ if (!strcmp(argv[arg], "-s")) { compfn = &sort_by_swap; continue; }
if (!strcmp(argv[arg], "-w")) { ws = WS_ONLY; continue; }
if (!strcmp(argv[arg], "-W")) { ws = WS_RESET; continue; }
if (!strcmp(argv[arg], "-R")) { order *= -1; continue; }
@@ -201,6 +206,10 @@
fprintf(stderr, "warning: could not read usage for %d\n", pids[i]);
}
+ if (ws != WS_RESET && procs[i]->usage.swap) {
+ has_swap = true;
+ }
+
pm_process_destroy(proc);
}
@@ -220,13 +229,24 @@
qsort(procs, num_procs, sizeof(procs[0]), compfn);
- if (ws)
- printf("%5s %7s %7s %7s %s\n", "PID", "WRss", "WPss", "WUss", "cmdline");
- else
- printf("%5s %7s %7s %7s %7s %s\n", "PID", "Vss", "Rss", "Pss", "Uss", "cmdline");
+ printf("%5s ", "PID");
+ if (ws) {
+ printf("%s %7s %7s ", "WRss", "WPss", "WUss");
+ if (has_swap) {
+ printf("%7s ", "WSwap");
+ }
+ } else {
+ printf("%8s %7s %7s %7s ", "Vss", "Rss", "Pss", "Uss");
+ if (has_swap) {
+ printf("%7s ", "Swap");
+ }
+ }
+
+ printf("%s\n", "cmdline");
total_pss = 0;
total_uss = 0;
+ total_swap = 0;
for (i = 0; i < num_procs; i++) {
if (getprocname(procs[i]->pid, cmdline, (int)sizeof(cmdline)) < 0) {
@@ -240,42 +260,67 @@
total_pss += procs[i]->usage.pss;
total_uss += procs[i]->usage.uss;
+ total_swap += procs[i]->usage.swap;
- if (ws)
- printf("%5d %6dK %6dK %6dK %s\n",
- procs[i]->pid,
+ printf("%5d ", procs[i]->pid);
+
+ if (ws) {
+ printf("%6dK %6dK %6dK ",
procs[i]->usage.rss / 1024,
procs[i]->usage.pss / 1024,
- procs[i]->usage.uss / 1024,
- cmdline
+ procs[i]->usage.uss / 1024
);
- else
- printf("%5d %6dK %6dK %6dK %6dK %s\n",
- procs[i]->pid,
+ } else {
+ printf("%7dK %6dK %6dK %6dK ",
procs[i]->usage.vss / 1024,
procs[i]->usage.rss / 1024,
procs[i]->usage.pss / 1024,
- procs[i]->usage.uss / 1024,
- cmdline
+ procs[i]->usage.uss / 1024
);
+ }
+
+ if (has_swap) {
+ printf("%6dK ", procs[i]->usage.swap / 1024);
+ }
+
+ printf("%s\n", cmdline);
free(procs[i]);
}
free(procs);
+ /* Print the separator line */
+ printf("%5s ", "");
+
if (ws) {
- printf("%5s %7s %7s %7s %s\n",
- "", "", "------", "------", "------");
- printf("%5s %7s %6ldK %6ldK %s\n",
- "", "", total_pss / 1024, total_uss / 1024, "TOTAL");
+ printf("%7s %7s %7s ", "", "------", "------");
} else {
- printf("%5s %7s %7s %7s %7s %s\n",
- "", "", "", "------", "------", "------");
- printf("%5s %7s %7s %6ldK %6ldK %s\n",
- "", "", "", total_pss / 1024, total_uss / 1024, "TOTAL");
+ printf("%8s %7s %7s %7s ", "", "", "------", "------");
}
+ if (has_swap) {
+ printf("%7s ", "------");
+ }
+
+ printf("%s\n", "------");
+
+ /* Print the total line */
+ printf("%5s ", "");
+ if (ws) {
+ printf("%7s %6ldK %6ldK ",
+ "", total_pss / 1024, total_uss / 1024);
+ } else {
+ printf("%8s %7s %6ldK %6ldK ",
+ "", "", total_pss / 1024, total_uss / 1024);
+ }
+
+ if (has_swap) {
+ printf("%6ldK ", total_swap);
+ }
+
+ printf("TOTAL\n");
+
printf("\n");
print_mem_info();
@@ -283,11 +328,12 @@
}
static void usage(char *myname) {
- fprintf(stderr, "Usage: %s [ -W ] [ -v | -r | -p | -u | -h ]\n"
+ fprintf(stderr, "Usage: %s [ -W ] [ -v | -r | -p | -u | -s | -h ]\n"
" -v Sort by VSS.\n"
" -r Sort by RSS.\n"
" -p Sort by PSS.\n"
" -u Sort by USS.\n"
+ " -s Sort by swap.\n"
" (Default sort order is PSS.)\n"
" -R Reverse sort order (default is descending).\n"
" -w Display statistics for working set only.\n"
@@ -373,3 +419,4 @@
create_sort(rss, numcmp)
create_sort(pss, numcmp)
create_sort(uss, numcmp)
+create_sort(swap, numcmp)