Re: [PATCH] perf: Add drop monitor script

Arnaldo Carvalho de Melo
2011-07-25T15:03:16Z

Em Mon, Jul 04, 2011 at 01:40:17PM -0400, Neil Horman escreveu:
> A while back I created the dropmonitor protocol, which allowed users to get
> reports of dropped frames communicated to them via a netlink socket. While
> useful, several people have now asked that I integrate the ability to do drop
> monitoring with perf, so they don't have to run additional tools. This patch
> adds a drop monitor script to the perf suite, and provides the same output that
> the netlink socket does.

Its OK and shows areas were the python binding can improve, namely
making the symbol resolving library accessible.

I'll merge this one and as time permits try to implement an equivalent
using the python binding.

- Arnaldo

> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
> CC: Paul Mackerras <paulus@samba.org>
> CC: Ingo Molnar <mingo@elte.hu>
> CC: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
> ---
> .../perf/scripts/python/bin/net_dropmonitor-record | 2 +
> .../perf/scripts/python/bin/net_dropmonitor-report | 4 +
> tools/perf/scripts/python/net_dropmonitor.py | 73 ++++++++++++++++++++
> 3 files changed, 79 insertions(+), 0 deletions(-)
> create mode 100755 tools/perf/scripts/python/bin/net_dropmonitor-record
> create mode 100755 tools/perf/scripts/python/bin/net_dropmonitor-report
> create mode 100755 tools/perf/scripts/python/net_dropmonitor.py
>
> diff --git a/tools/perf/scripts/python/bin/net_dropmonitor-record b/tools/perf/scripts/python/bin/net_dropmonitor-record
> new file mode 100755
> index 0000000..423fb81
> --- /dev/null
> +++ b/tools/perf/scripts/python/bin/net_dropmonitor-record
> @@ -0,0 +1,2 @@
> +#!/bin/bash
> +perf record -e skb:kfree_skb $@
> diff --git a/tools/perf/scripts/python/bin/net_dropmonitor-report b/tools/perf/scripts/python/bin/net_dropmonitor-report
> new file mode 100755
> index 0000000..8d698f5
> --- /dev/null
> +++ b/tools/perf/scripts/python/bin/net_dropmonitor-report
> @@ -0,0 +1,4 @@
> +#!/bin/bash
> +# description: display a table of dropped frames
> +
> +perf script -s "$PERF_EXEC_PATH"/scripts/python/net_dropmonitor.py $@
> diff --git a/tools/perf/scripts/python/net_dropmonitor.py b/tools/perf/scripts/python/net_dropmonitor.py
> new file mode 100755
> index 0000000..67cd26b
> --- /dev/null
> +++ b/tools/perf/scripts/python/net_dropmonitor.py
> @@ -0,0 +1,73 @@
> +# Monitor the system for dropped packets and proudce a report of drop locations and counts
> +
> +import os
> +import sys
> +
> +sys.path.append(os.environ['PERF_EXEC_PATH'] + \
> + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
> +
> +from perf_trace_context import *
> +from Core import *
> +from Util import *
> +
> +drop_log = {}
> +kallsyms = []
> +
> +def get_kallsyms_table():
> + global kallsyms
> + try:
> + f = open("/proc/kallsyms", "r")
> + linecount = 0
> + for line in f:
> + linecount = linecount+1
> + f.seek(0)
> + except:
> + return
> +
> +
> + j = 0
> + for line in f:
> + loc = int(line.split()[0], 16)
> + name = line.split()[2]
> + j = j +1
> + if ((j % 100) == 0):
> + print "\r" + str(j) + "/" + str(linecount),
> + kallsyms.append({ 'loc': loc, 'name' : name})
> +
> + print "\r" + str(j) + "/" + str(linecount)
> + kallsyms.sort()
> + return
> +
> +def get_sym(sloc):
> + loc = int(sloc)
> + for i in kallsyms:
> + if (i['loc'] >= loc):
> + return (i['name'], i['loc']-loc)
> + return (None, 0)
> +
> +def print_drop_table():
> + print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")
> + for i in drop_log.keys():
> + (sym, off) = get_sym(i)
> + if sym == None:
> + sym = i
> + print "%25s %25s %25s" % (sym, off, drop_log[i])
> +
> +
> +def trace_begin():
> + print "Starting trace (Ctrl-C to dump results)"
> +
> +def trace_end():
> + print "Gathering kallsyms data"
> + get_kallsyms_table()
> + print_drop_table()
> +
> +# called from perf, when it finds a correspoinding event
> +def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
> + skbaddr, protocol, location):
> + slocation = str(location)
> + try:
> + drop_log[slocation] = drop_log[slocation] + 1
> + except:
> + drop_log[slocation] = 1
> +
> --
> 1.7.6