From: Koki Sanagi <sanagi.koki@jp•fujitsu.com>
To: netdev@vger•kernel.org
Cc: davem@davemloft•net, nhorman@tuxdriver•com,
kaneshige.kenji@jp•fujitsu.com, izumi.taku@jp•fujitsu.com
Subject: [RFC PATCH 2/2] netdev: perf script to show the number of tx-packets in device
Date: Mon, 24 May 2010 13:52:36 +0900 [thread overview]
Message-ID: <4BFA0614.6020804@jp.fujitsu.com> (raw)
In-Reply-To: <4BFA0551.3080304@jp.fujitsu.com>
This patch adds perf script to calculate the time from entry of
ndo_start_xmit to dev_kfree_skb_* and the number of tx-packets in device.
Signed-off-by: Koki Sanagi <sanagi.koki@jp•fujitsu.com>
---
.../scripts/python/bin/tx-packet-in-device-record | 2 +
.../scripts/python/bin/tx-packet-in-device-report | 4 +
tools/perf/scripts/python/tx-packet-in-device.py | 109 ++++++++++++++++++++
3 files changed, 115 insertions(+), 0 deletions(-)
diff --git a/tools/perf/scripts/python/bin/tx-packet-in-device-record b/tools/perf/scripts/python/bin/tx-packet-in-device-record
new file mode 100644
index 0000000..18f2356
--- /dev/null
+++ b/tools/perf/scripts/python/bin/tx-packet-in-device-record
@@ -0,0 +1,2 @@
+#!/bin/bash
+perf record -c 1 -f -a -M -R -e skb:netdev_start_xmit -e skb:consume_skb -e skb:dev_kfree_skb_irq
diff --git a/tools/perf/scripts/python/bin/tx-packet-in-device-report b/tools/perf/scripts/python/bin/tx-packet-in-device-report
new file mode 100644
index 0000000..8ef4cc2
--- /dev/null
+++ b/tools/perf/scripts/python/bin/tx-packet-in-device-report
@@ -0,0 +1,4 @@
+#!/bin/bash
+# description: netif_receive_skb counts per poll
+# args: [comm]
+perf trace -s ~/libexec/perf-core/scripts/python/tx-packet-in-device.py $1
diff --git a/tools/perf/scripts/python/tx-packet-in-device.py b/tools/perf/scripts/python/tx-packet-in-device.py
new file mode 100644
index 0000000..fb1933f
--- /dev/null
+++ b/tools/perf/scripts/python/tx-packet-in-device.py
@@ -0,0 +1,109 @@
+# perf trace event handlers, generated by perf trace -g python
+# Licensed under the terms of the GNU GPL License version 2
+
+# The common_* event handler fields are the most useful fields common to
+# all events. They don't necessarily correspond to the 'common_*' fields
+# in the format files. Those fields not available as handler params can
+# be retrieved using Python functions of the form common_*(context).
+# See the perf-trace-python Documentation for the list of available functions.
+
+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 *
+
+# skb_dic = {skbaddr: {name:*, start_time:*}}
+#
+# skbaddr: address of skb through dev_hard_start_xmit
+# name: name of device
+# start_time: the time dev_start_hard_xmit pass
+skb_dic = {};
+
+# dev_stat_dic = {name: {pkt_in_tx:*, max_pkt_in_tx:*, total_pkt:*,
+# prev_time:*, total_time:*, max_lap_time:*,
+# total_lap_time:*}}
+#
+# name: name of device
+# pkt_in_tx: tx-packets a device has currently
+# max_pkt_in_tx: maximum of the above
+# total_pkt: total tx-packets through a device
+# prev_time: the time starting xmit or freeing skb
+# happened previously
+# total_time: the time from first starting xmit to now
+# max_lap_time: maximum time from starting xmit to freein skb
+# total_lap_time: sum of time tx-packet is in device
+dev_stat_dic = {};
+
+def trace_end():
+ for name in sorted(dev_stat_dic.keys()):
+ cstat = dev_stat_dic[name]
+ print "%s\tTX packets=%d" %\
+ (name, cstat['total_pkt'])
+ print "\tlap time between start_xmit - free_skb:"
+ avg_nsec = avg(1.0 * cstat['total_lap_time'],
+ cstat['total_pkt'])
+ print "\t avg=%fmsec" % (avg_nsec / 1000000.0)
+ print "\t max=%fmsec" % (cstat['max_lap_time'] / 1000000.0)
+ print "\tnumber of packets in device:"
+ print "\t avg=%7.2f" % avg(cstat['total_lap_time'] * 1.0,
+ cstat['total_time'])
+ print "\t max=%4d" % cstat['max_pkt_in_tx']
+ print ""
+
+def skb__dev_kfree_skb_irq(event_name, context, common_cpu,
+ common_secs, common_nsecs, common_pid, common_comm,
+ skbaddr):
+ free_skb(event_name, context, common_cpu,
+ common_secs, common_nsecs, common_pid, common_comm,
+ skbaddr)
+
+def skb__consume_skb(event_name, context, common_cpu,
+ common_secs, common_nsecs, common_pid, common_comm,
+ skbaddr):
+ free_skb(event_name, context, common_cpu,
+ common_secs, common_nsecs, common_pid, common_comm,
+ skbaddr)
+
+def free_skb(event_name, context, common_cpu,
+ common_secs, common_nsecs, common_pid, common_comm,
+ skbaddr):
+ if skbaddr in skb_dic.keys():
+ ctime = nsecs(common_secs, common_nsecs)
+ lap_time = ctime - skb_dic[skbaddr]['start_time']
+ cstat = dev_stat_dic[skb_dic[skbaddr]['name']]
+ cstat['total_lap_time'] += lap_time;
+ cstat['total_pkt'] += 1;
+ cstat = dev_stat_dic[skb_dic[skbaddr]['name']]
+ cstat['total_time'] += ctime - cstat['prev_time']
+ cstat['prev_time'] = ctime
+ cstat['pkt_in_tx'] -= 1;
+ if lap_time > cstat['max_lap_time']:
+ cstat['max_lap_time'] = lap_time
+ del skb_dic[skbaddr]
+
+def skb__netdev_start_xmit(event_name, context, common_cpu,
+ common_secs, common_nsecs, common_pid, common_comm,
+ skbaddr, len, name):
+ retry = 0
+ ctime = nsecs(common_secs, common_nsecs)
+ if skbaddr in skb_dic.keys():
+ retry = 1;
+ skb_dic[skbaddr] = {'name':name, 'start_time':ctime}
+ if name not in dev_stat_dic.keys():
+ dev_stat_dic[name] = {'pkt_in_tx':0, 'max_pkt_in_tx':0,\
+ 'total_pkt':0,\
+ 'prev_time':ctime, 'total_time':0,\
+ 'max_lap_time':0, 'total_lap_time':0}
+ cstat = dev_stat_dic[name]
+ cstat['total_time'] += ctime - cstat['prev_time']
+ cstat['prev_time'] = ctime
+ if retry == 0:
+ cstat['pkt_in_tx'] += 1
+ if cstat['pkt_in_tx'] > cstat['max_pkt_in_tx']:
+ cstat['max_pkt_in_tx'] = cstat['pkt_in_tx']
+
prev parent reply other threads:[~2010-05-24 4:52 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-24 4:49 [RFC PATCH 0/2] netdev: show the number of tx-packets in device Koki Sanagi
2010-05-24 4:51 ` [RFC PATCH 1/2] netdev: add tracepoint to dev_hard_start_xmit, consume_skb and dev_kfree_skb_irq Koki Sanagi
2010-05-24 4:52 ` Koki Sanagi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BFA0614.6020804@jp.fujitsu.com \
--to=sanagi.koki@jp$(echo .)fujitsu.com \
--cc=davem@davemloft$(echo .)net \
--cc=izumi.taku@jp$(echo .)fujitsu.com \
--cc=kaneshige.kenji@jp$(echo .)fujitsu.com \
--cc=netdev@vger$(echo .)kernel.org \
--cc=nhorman@tuxdriver$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox