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