xref: /illumos-gate/usr/src/cmd/dtrace/demo/udp/udptop.d (revision 9cd928fe)
1*9cd928feSAlan Maguire #!/usr/sbin/dtrace -s
2*9cd928feSAlan Maguire /*
3*9cd928feSAlan Maguire  * udptop: display top UDP network packets by process.
4*9cd928feSAlan Maguire  *	Written using DTrace udp Provider.
5*9cd928feSAlan Maguire  *
6*9cd928feSAlan Maguire  * Usage: dtrace -s udptop.d [count] [interval]
7*9cd928feSAlan Maguire  *
8*9cd928feSAlan Maguire  * This analyses UDP network packets and prints the responsible PID plus
9*9cd928feSAlan Maguire  * standard details such as IP address and port. This captures traffic
10*9cd928feSAlan Maguire  * of newly created UDP connections that were established while this program
11*9cd928feSAlan Maguire  * was running along with traffic from existing connections. It can help
12*9cd928feSAlan Maguire  * identify which processes is causing UDP traffic.
13*9cd928feSAlan Maguire  *
14*9cd928feSAlan Maguire  * CDDL HEADER START
15*9cd928feSAlan Maguire  *
16*9cd928feSAlan Maguire  * The contents of this file are subject to the terms of the
17*9cd928feSAlan Maguire  * Common Development and Distribution License (the "License").
18*9cd928feSAlan Maguire  * You may not use this file except in compliance with the License.
19*9cd928feSAlan Maguire  *
20*9cd928feSAlan Maguire  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
21*9cd928feSAlan Maguire  * or http://www.opensolaris.org/os/licensing.
22*9cd928feSAlan Maguire  * See the License for the specific language governing permissions
23*9cd928feSAlan Maguire  * and limitations under the License.
24*9cd928feSAlan Maguire  *
25*9cd928feSAlan Maguire  * When distributing Covered Code, include this CDDL HEADER in each
26*9cd928feSAlan Maguire  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
27*9cd928feSAlan Maguire  * If applicable, add the following below this CDDL HEADER, with the
28*9cd928feSAlan Maguire  * fields enclosed by brackets "[]" replaced with your own identifying
29*9cd928feSAlan Maguire  * information: Portions Copyright [yyyy] [name of copyright owner]
30*9cd928feSAlan Maguire  *
31*9cd928feSAlan Maguire  * CDDL HEADER END
32*9cd928feSAlan Maguire  *
33*9cd928feSAlan Maguire  */
34*9cd928feSAlan Maguire /*
35*9cd928feSAlan Maguire  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
36*9cd928feSAlan Maguire  *
37*9cd928feSAlan Maguire  * Portions Copyright 2010 Brendan Gregg
38*9cd928feSAlan Maguire  */
39*9cd928feSAlan Maguire 
40*9cd928feSAlan Maguire #pragma D option quiet
41*9cd928feSAlan Maguire #pragma D option defaultargs
42*9cd928feSAlan Maguire #pragma D option switchrate=10hz
43*9cd928feSAlan Maguire 
44*9cd928feSAlan Maguire /*
45*9cd928feSAlan Maguire  * Print header
46*9cd928feSAlan Maguire  */
47*9cd928feSAlan Maguire dtrace:::BEGIN
48*9cd928feSAlan Maguire {
49*9cd928feSAlan Maguire 	/* starting values */
50*9cd928feSAlan Maguire 	counts = $1 ? $1 : 10;
51*9cd928feSAlan Maguire 	secs = $2 ? $2 : 5;
52*9cd928feSAlan Maguire 	UDP_out = 0;
53*9cd928feSAlan Maguire 	UDP_in = 0;
54*9cd928feSAlan Maguire 
55*9cd928feSAlan Maguire 	printf("Sampling... Please wait.\n");
56*9cd928feSAlan Maguire }
57*9cd928feSAlan Maguire 
58*9cd928feSAlan Maguire 
59*9cd928feSAlan Maguire udp:::send
60*9cd928feSAlan Maguire / args[1]->cs_pid != -1 /
61*9cd928feSAlan Maguire {
62*9cd928feSAlan Maguire 	@out[args[1]->cs_zoneid, args[1]->cs_pid, args[2]->ip_saddr,
63*9cd928feSAlan Maguire 	    args[4]->udp_sport, args[2]->ip_daddr, args[4]->udp_dport] =
64*9cd928feSAlan Maguire 	    sum(args[4]->udp_length);
65*9cd928feSAlan Maguire }
66*9cd928feSAlan Maguire 
67*9cd928feSAlan Maguire udp:::receive
68*9cd928feSAlan Maguire / args[1]->cs_pid != -1 /
69*9cd928feSAlan Maguire {
70*9cd928feSAlan Maguire 	@out[args[1]->cs_zoneid, args[1]->cs_pid, args[2]->ip_daddr,
71*9cd928feSAlan Maguire 	    args[4]->udp_dport, args[2]->ip_saddr, args[4]->udp_sport] =
72*9cd928feSAlan Maguire 	    sum(args[4]->udp_length);
73*9cd928feSAlan Maguire }
74*9cd928feSAlan Maguire 
75*9cd928feSAlan Maguire /*
76*9cd928feSAlan Maguire  * UDP Systemwide Stats
77*9cd928feSAlan Maguire  */
78*9cd928feSAlan Maguire mib:::udpHCOutDatagrams		{ UDP_out += args[0]; }
79*9cd928feSAlan Maguire mib:::udpHCInDatagrams		{ UDP_in  += args[0]; }
80*9cd928feSAlan Maguire 
81*9cd928feSAlan Maguire profile:::tick-1sec
82*9cd928feSAlan Maguire /secs != 0/
83*9cd928feSAlan Maguire {
84*9cd928feSAlan Maguire 	secs--;
85*9cd928feSAlan Maguire }
86*9cd928feSAlan Maguire 
87*9cd928feSAlan Maguire /*
88*9cd928feSAlan Maguire  * Print Report
89*9cd928feSAlan Maguire  */
90*9cd928feSAlan Maguire profile:::tick-1sec
91*9cd928feSAlan Maguire /secs == 0/
92*9cd928feSAlan Maguire {
93*9cd928feSAlan Maguire 	/* fetch 1 min load average */
94*9cd928feSAlan Maguire 	this->load1a  = `hp_avenrun[0] / 65536;
95*9cd928feSAlan Maguire 	this->load1b  = ((`hp_avenrun[0] % 65536) * 100) / 65536;
96*9cd928feSAlan Maguire 
97*9cd928feSAlan Maguire 	/* print status */
98*9cd928feSAlan Maguire 	printf(%Y,  load: %d.%02d,  UDP datagrams in: %6d, ",
99*9cd928feSAlan Maguire 	    walltimestamp, this->load1a, this->load1b, UDP_in);
100*9cd928feSAlan Maguire 	printf("UDP datagrams out: %6d\n\n", UDP_out);
101*9cd928feSAlan Maguire 
102*9cd928feSAlan Maguire 	/* print headers */
103*9cd928feSAlan Maguire 	printf("%6s %6s %-15s %5s %-15s %5s %9s\n",
104*9cd928feSAlan Maguire 	    "ZONE", "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE");
105*9cd928feSAlan Maguire 
106*9cd928feSAlan Maguire 	/* print data */
107*9cd928feSAlan Maguire 	printa("%6d %6d %-15s %5d %-15s %5d %@9d\n", @out);
108*9cd928feSAlan Maguire 	printf("\n");
109*9cd928feSAlan Maguire 
110*9cd928feSAlan Maguire 	/* clear data */
111*9cd928feSAlan Maguire 	trunc(@out);
112*9cd928feSAlan Maguire 	UDP_in = 0;
113*9cd928feSAlan Maguire 	UDP_out = 0;
114*9cd928feSAlan Maguire 	secs = 5;
115*9cd928feSAlan Maguire 	counts--;
116*9cd928feSAlan Maguire }
117*9cd928feSAlan Maguire 
118*9cd928feSAlan Maguire /*
119*9cd928feSAlan Maguire  * End of program
120*9cd928feSAlan Maguire  */
121*9cd928feSAlan Maguire profile:::tick-1sec
122*9cd928feSAlan Maguire /counts == 0/
123*9cd928feSAlan Maguire {
124*9cd928feSAlan Maguire 	exit(0);
125*9cd928feSAlan Maguire }
126*9cd928feSAlan Maguire 
127*9cd928feSAlan Maguire /*
128*9cd928feSAlan Maguire  * Cleanup for Ctrl-C
129*9cd928feSAlan Maguire  */
130*9cd928feSAlan Maguire dtrace:::END
131*9cd928feSAlan Maguire {
132*9cd928feSAlan Maguire 	trunc(@out);
133*9cd928feSAlan Maguire }
134