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