filetop: support specifying sort column via cmdline argument
authorDaniel Neiter <dneiter@fb.com>
Thu, 2 Mar 2017 01:21:25 +0000 (17:21 -0800)
committerDaniel Neiter <dneiter@fb.com>
Thu, 2 Mar 2017 01:53:50 +0000 (17:53 -0800)
man/man8/filetop.8
tools/filetop.py
tools/filetop_example.txt

index 1cc6a04..e70d908 100644 (file)
@@ -2,14 +2,15 @@
 .SH NAME
 filetop \- File reads and writes by filename and process. Top for files.
 .SH SYNOPSIS
-.B filetop [\-h] [\-C] [\-r MAXROWS] [\-p PID] [interval] [count]
+.B filetop [\-h] [\-C] [\-r MAXROWS] [\-s {reads,writes,rbytes,wbytes}] [\-p PID] [interval] [count]
 .SH DESCRIPTION
 This is top for files.
 
-This traces file reads and writes, and prints a per-file summary every
-interval (by default, 1 second). The summary is sorted on the highest read
-throughput (Kbytes). By default only IO on regular files is shown. The -a
-option will list all file types (sokets, FIFOs, etc).
+This traces file reads and writes, and prints a per-file summary every interval
+(by default, 1 second). By default the summary is sorted on the highest read
+throughput (Kbytes). Sorting order can be changed via -s option. By default only
+IO on regular files is shown. The -a option will list all file types (sokets,
+FIFOs, etc).
 
 This uses in-kernel eBPF maps to store per process summaries for efficiency.
 
@@ -39,6 +40,9 @@ Don't clear the screen.
 \-r MAXROWS
 Maximum number of rows to print. Default is 20.
 .TP
+\-s {reads,writes,rbytes,wbytes}
+Sort column. Default is rbytes (read throughput).
+.TP
 \-p PID
 Trace this PID only.
 .TP
index ed7e716..c8122ce 100755 (executable)
@@ -38,6 +38,9 @@ parser.add_argument("-C", "--noclear", action="store_true",
     help="don't clear the screen")
 parser.add_argument("-r", "--maxrows", default=20,
     help="maximum rows to print, default 20")
+parser.add_argument("-s", "--sort", default="rbytes",
+    choices=["reads", "writes", "rbytes", "wbytes"],
+    help="sort column, default rbytes")
 parser.add_argument("-p", "--pid", type=int, metavar="PID", dest="tgid",
     help="trace this PID only")
 parser.add_argument("interval", nargs="?", default=1,
@@ -184,7 +187,8 @@ while 1:
     counts = b.get_table("counts")
     line = 0
     for k, v in reversed(sorted(counts.items(),
-                                key=lambda counts: counts[1].rbytes)):
+                                key=lambda counts:
+                                  getattr(counts[1], args.sort))):
         name = k.name.decode()
         if k.name_len > DNAME_INLINE_LEN:
             name = name[:-3] + "..."
index de1591d..66595ad 100644 (file)
@@ -29,10 +29,11 @@ PID    COMM             READS  WRITES R_Kb    W_Kb    T FILE
 26628  ld               12     0      52      0       R swap.o
 [...]
 
-This shows various files read and written during a Linux kernel build. The
-output is sorted by the total read size in Kbytes (R_Kb). This is instrumenting
-at the VFS interface, so this is reads and writes that may return entirely
-from the file system cache (page cache).
+This shows various files read and written during a Linux kernel build. By
+default the output is sorted by the total read size in Kbytes (R_Kb). Sorting
+order can be changed via -s option. This is instrumenting at the VFS interface,
+so this is reads and writes that may return entirely from the file system cache
+(page cache).
 
 While not printed, the average read and write size can be calculated by
 dividing R_Kb by READS, and the same for writes.
@@ -146,6 +147,8 @@ optional arguments:
   -C, --noclear         don't clear the screen
   -r MAXROWS, --maxrows MAXROWS
                         maximum rows to print, default 20
+  -s {reads,writes,rbytes,wbytes}, --sort {reads,writes,rbytes,wbytes}
+                        sort column, default rbytes
   -p PID, --pid PID     trace this PID only
 
 examples: