From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13167 invoked by alias); 17 Nov 2006 22:27:05 -0000 Received: (qmail 13157 invoked by uid 22791); 17 Nov 2006 22:27:03 -0000 X-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from e34.co.us.ibm.com (HELO e34.co.us.ibm.com) (32.97.110.152) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 17 Nov 2006 22:26:55 +0000 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.13.8/8.12.11) with ESMTP id kAHMQsuw006946 for ; Fri, 17 Nov 2006 17:26:54 -0500 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.13.6/8.13.6/NCO v8.1.1) with ESMTP id kAHMQsdi537846 for ; Fri, 17 Nov 2006 15:26:54 -0700 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id kAHMQrx5007661 for ; Fri, 17 Nov 2006 15:26:53 -0700 Received: from [127.0.0.1] (wecm-9-67-0-113.wecm.ibm.com [9.67.0.113]) by d03av02.boulder.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id kAHMQo7E007434 for ; Fri, 17 Nov 2006 15:26:53 -0700 Message-ID: <455E3718.8030202@us.ibm.com> Date: Fri, 17 Nov 2006 23:19:00 -0000 From: Mike Mason User-Agent: Thunderbird 1.5.0.8 (Windows/20061025) MIME-Version: 1.0 To: systemtap@sources.redhat.com Subject: Sockets tapset and script Content-Type: multipart/mixed; boundary="------------030304020604040409020900" X-Virus-Checked: Checked by ClamAV on sourceware.org X-IsSubscribed: yes Mailing-List: contact systemtap-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Post: List-Help: , Sender: systemtap-owner@sourceware.org X-SW-Source: 2006-q4/txt/msg00462.txt.bz2 This is a multi-part message in MIME format. --------------030304020604040409020900 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 4731 Attached is a sockets tapset and a script that uses the tapset. I thought I'd post them for review even though they're not done. The tapset just contains what I needed to write the script. More comments, probes and helper functions are needed. I also need to write some tests. The tapset contains functions to map numbers to strings and strings to numbers for: - protocols - protocol families - socket types - socket states - socket flags - message flags Mapping functions are something I think script writers need, not just for sockets, but in a lot of other areas. Some of these functions using mapping arrays. What do people think of this approach? The script (socktop) prints socket traffic for the top n processes and, optionally, network device traffic. Besides being a useful script (I hope), it demonstrates a few methods that should be applicable to many scripts: - using a shell script to process command line options - filtering on multiple categories (in this case, process ID and name, user name, protocol, protocol family and socket type) - passing array-like data from a shell script to a systemtap script and tokenizing that data in systemtap - passing in a timezone adjustment Also, note the sign bit hack in the return probes. This is something I'd like to remove before posting the script on the wiki (hint, hint :-). Here's some example output from socktop: [root@localhost probes]# ./socktop -P TCP -P UDP -d ======================= Fri Nov 17 14:10:57 2006 ======================== ------------------------------- PROCESSES ------------------------------- PID UID #SEND #RECV SEND_KB RECV_KB PROT FAMILY COMMAND 14668 0 0 2546 0 3635 TCP INET firefox-bin 6765 0 10 10 31 0 TCP INET Xvnc -------------------------------- DEVICES -------------------------------- DEV #XMIT #RECV XMIT_KB RECV_KB eth0 1396 2643 121 3769 ========================================================================= ======================= Fri Nov 17 14:11:02 2006 ======================== ------------------------------- PROCESSES ------------------------------- PID UID #SEND #RECV SEND_KB RECV_KB PROT FAMILY COMMAND 14668 0 0 2457 0 3487 TCP INET firefox-bin 6765 0 11 11 14 0 TCP INET Xvnc 29852 0 2 0 0 0 TCP INET6 sshd -------------------------------- DEVICES -------------------------------- DEV #XMIT #RECV XMIT_KB RECV_KB eth0 1309 2533 98 3620 ========================================================================= ======================= Fri Nov 17 14:11:07 2006 ======================== ------------------------------- PROCESSES ------------------------------- PID UID #SEND #RECV SEND_KB RECV_KB PROT FAMILY COMMAND 14668 0 0 1886 0 2676 TCP INET firefox-bin 6765 0 83 292 532 2 TCP INET Xvnc 29852 0 1 0 0 0 TCP INET6 sshd -------------------------------- DEVICES -------------------------------- DEV #XMIT #RECV XMIT_KB RECV_KB eth0 1501 2478 624 2797 ========================================================================= [root@localhost probes]# ./socktop -d ======================= Fri Nov 17 14:09:45 2006 ======================== ------------------------------- PROCESSES ------------------------------- PID UID #SEND #RECV SEND_KB RECV_KB PROT FAMILY COMMAND 14668 0 0 2796 0 3969 TCP INET firefox-bin 6765 0 221 284 535 429 IP LOCAL Xvnc 6909 0 77 139 277 276 IP LOCAL wnck-applet 14668 0 53 79 103 220 IP LOCAL firefox-bin 6840 0 61 125 26 17 IP LOCAL metacity 6902 0 21 27 21 21 IP LOCAL nautilus 6765 0 11 11 32 0 TCP INET Xvnc 6900 0 3 7 0 0 IP LOCAL gnome-panel 6820 0 0 8 0 0 IP LOCAL gnome-settings- 1610 0 1 3 0 0 IP NETLINK ifconfig -------------------------------- DEVICES -------------------------------- DEV #XMIT #RECV XMIT_KB RECV_KB eth0 1516 2888 129 4115 ========================================================================= All comments are welcome. Mike Mason --------------030304020604040409020900 Content-Type: application/x-compressed; name="sockets.tgz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="sockets.tgz" Content-length: 10350 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 oECBAgUKFChQoECBAgUKFOg70D+VF9JRAKAAAA== --------------030304020604040409020900--