tools: continue adding --ebpf support (#1986)
Use argparse in cachestat, add --ebpf support.
Add --ebpf support for u* tools, finalize language sorting.
Remove sole --ebpf string on usage line in tcpsubnet.
diff --git a/tools/cachestat.py b/tools/cachestat.py
index 573c697..b00c804 100755
--- a/tools/cachestat.py
+++ b/tools/cachestat.py
@@ -19,6 +19,7 @@
from __future__ import print_function
from bcc import BPF
from time import sleep, strftime
+import argparse
import signal
import re
from sys import argv
@@ -48,43 +49,25 @@
hits = 0
debug = 0
-# args
-def usage():
- print("USAGE: %s [-T] [ interval [count] ]" % argv[0])
- exit()
-
# arguments
-interval = 5
-count = -1
-tstamp = 0
+parser = argparse.ArgumentParser(
+ description="Count cache kernel function calls",
+ formatter_class=argparse.RawDescriptionHelpFormatter)
+parser.add_argument("-T", "--timestamp", action="store_true",
+ help="include timestamp on output")
+parser.add_argument("interval", nargs="?", default=5,
+ help="output interval, in seconds")
+parser.add_argument("count", nargs="?", default=-1,
+ help="number of outputs")
+parser.add_argument("--ebpf", action="store_true",
+ help=argparse.SUPPRESS)
+args = parser.parse_args()
+count = int(args.count)
+tstamp = args.timestamp
+interval = int(args.interval)
-if len(argv) > 1:
- if str(argv[1]) == '-T':
- tstamp = 1
-
-if len(argv) > 1 and tstamp == 0:
- try:
- if int(argv[1]) > 0:
- interval = int(argv[1])
- if len(argv) > 2:
- if int(argv[2]) > 0:
- count = int(argv[2])
- except:
- usage()
-
-elif len(argv) > 2 and tstamp == 1:
- try:
- if int(argv[2]) > 0:
- interval = int(argv[2])
- if len(argv) >= 4:
- if int(argv[3]) > 0:
- count = int(argv[3])
- except:
- usage()
-
-# load BPF program
+# define BPF program
bpf_text = """
-
#include <uapi/linux/ptrace.h>
struct key_t {
u64 ip;
@@ -102,6 +85,13 @@
}
"""
+
+if debug or args.ebpf:
+ print(bpf_text)
+ if args.ebpf:
+ exit()
+
+# load BPF program
b = BPF(text=bpf_text)
b.attach_kprobe(event="add_to_page_cache_lru", fn_name="do_count")
b.attach_kprobe(event="mark_page_accessed", fn_name="do_count")
@@ -129,7 +119,7 @@
# as cleanup can take many seconds, trap Ctrl-C:
signal.signal(signal.SIGINT, signal_ignore)
- counts = b.get_table("counts")
+ counts = b["counts"]
for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
if re.match(b'mark_page_accessed', b.ksym(k.ip)) is not None:
@@ -175,7 +165,7 @@
cached = int(mem["Cached"]) / 1024
buff = int(mem["Buffers"]) / 1024
- if tstamp == 1:
+ if tstamp:
print("%-8s " % strftime("%H:%M:%S"), end="")
print("%8d %8d %8d %8d %12.0f %10.0f" %
(total, misses, hits, mbd, buff, cached))