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