From owner-freebsd-net@freebsd.org Wed Aug 21 05:34:49 2019 Return-Path: Delivered-To: freebsd-net@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id BBBA7BB178 for ; Wed, 21 Aug 2019 05:34:49 +0000 (UTC) (envelope-from crapsh@monkeybrains.net) Received: from sfo.monkeybrains.net (sfo.monkeybrains.net [208.69.40.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.monkeybrains.net", Issuer "AlphaSSL CA - SHA256 - G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46CxF44fZkz4WXM for ; Wed, 21 Aug 2019 05:34:48 +0000 (UTC) (envelope-from crapsh@monkeybrains.net) Received: from Rudys-iMac.local (148-64-102-151.PUBLIC.monkeybrains.net [148.64.102.151] (may be forged)) (authenticated bits=0) by sfo.monkeybrains.net (8.15.2/8.15.2) with ESMTPSA id x7L5Ye8X035142 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 20 Aug 2019 22:34:40 -0700 (PDT) (envelope-from crapsh@monkeybrains.net) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=monkeybrains.net; s=dkim; t=1566365680; bh=DG0VzRoeaPDnlxXKJ0o9gMK7/oHbUMpg2qIbsqjkBBY=; h=To:From:Subject:Date; b=WZUE/pLD/ZmkKlmxQwwdaKKEEkouRkzFidyIL4NpFJbw5VrJROBFugbbMaoQ9mtB9 DTaWsgugX9t3gLAFtAMuaCXEuXdATbjxltQF5EXAl8hJoBQgV8YwirnSFzwlvU8fDh DL/E4pAmeDFVqZZOb1XRz7tAxbmmn3dr0YMfyQto= X-Authentication-Warning: mail.monkeybrains.net: Host 148-64-102-151.PUBLIC.monkeybrains.net [148.64.102.151] (may be forged) claimed to be Rudys-iMac.local To: freebsd-net@freebsd.org From: Rudy Subject: packets per second tool for CLI - and question about checksum_errs Message-ID: <380fff29-8df3-2671-69c3-ef47131aaf58@monkeybrains.net> Date: Tue, 20 Aug 2019 22:34:40 -0700 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Content-Language: en-US X-Virus-Scanned: clamav-milter 0.100.2 at mail.monkeybrains.net X-Virus-Status: Clean X-Rspamd-Queue-Id: 46CxF44fZkz4WXM X-Spamd-Bar: ----- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=monkeybrains.net header.s=dkim header.b=WZUE/pLD; dmarc=pass (policy=none) header.from=monkeybrains.net; spf=pass (mx1.freebsd.org: domain of crapsh@monkeybrains.net designates 208.69.40.9 as permitted sender) smtp.mailfrom=crapsh@monkeybrains.net X-Spamd-Result: default: False [-5.76 / 15.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; R_DKIM_ALLOW(-0.20)[monkeybrains.net:s=dkim]; NEURAL_HAM_MEDIUM(-1.00)[-1.000,0]; FROM_HAS_DN(0.00)[]; R_SPF_ALLOW(-0.20)[+ptr]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; HAS_XAW(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[freebsd-net@freebsd.org]; RCPT_COUNT_ONE(0.00)[1]; DWL_DNSWL_LOW(-1.00)[monkeybrains.net.dwl.dnswl.org : 127.0.5.1]; TO_DN_NONE(0.00)[]; DKIM_TRACE(0.00)[monkeybrains.net:+]; DMARC_POLICY_ALLOW(-0.50)[monkeybrains.net,none]; NEURAL_HAM_SHORT(-0.97)[-0.968,0]; NEURAL_HAM_LONG(-1.00)[-1.000,0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; IP_SCORE(-0.79)[asn: 32329(-3.90), country: US(-0.05)]; ASN(0.00)[asn:32329, ipnet:208.69.40.0/22, country:US]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_TLS_ALL(0.00)[]; RCVD_COUNT_TWO(0.00)[2] Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Aug 2019 05:34:49 -0000 Here is a quick tool so show Packets Per Second on the CLI for all your interfaces (only tested with ix and igb). It uses the output of sysctl every second.  If you like it, great! Quick question, why am I seeing checksum_errs around 1k on a link doing 3Gbps? * **Sample output of script:* Tue Aug 20 22:28:16 2019                          00:00:01      Dev RX bits   TX bits    RX PPS    TX PPS  CK Error     igb0                 0         2         0     igb1                 0         0         0      ix0    2589 M     415 M     311 k     171 k      11      ix1     254 M    2120 M     108 k     248 k       1 k      ix2     171 M     508 M      62 k      63 k     385      ix3       1 k       1 k       0         0         0  Host: yourbox.example.com Rudy #!/usr/local/bin/perl # # pps - Packets Per Second tool like top # # Tue Aug 20 22:09:25 PDT 2019, MonkeyBrains.NET # my $SAMPLETIME = shift || 4; my $DAMPEN = undef;  # set to 1 to make Mbps be an average $SAMPLETIME =~ /^\d{1,4}$/ or die "Usage: $0 [delay]\n"; use Term::ANSIScreen qw/:color :cursor :screen :keyboard/; #  footer text my $hostname = `hostname`; chomp($hostname); my $footer = "Host: $hostname"; # colors in the table my @c = ('bold white on black', 'green', 'cyan', 'bold green', 'bold blue', 'bold red'); # columns in table my @c2 = ('bold yellow on black', 'black on yellow', 'black on yellow'); # header and footer my @w = (8);  # width for columns (decided on 10 for all but first...) my $totalWidth = $w[0] + 50; my $width1 = $totalWidth-30; my $width2 = $totalWidth-$w[0]; # some variables my %info; my %avg;  # tamper Mbps fluctations... print cls(); #clear screen my $s = 0;  # number of sysctl runs while (1) {     open STATS, "sysctl dev | " or die;     my %sum;     while () {         my ($dev,$p1,$p2,$v,$delta);         if (s/^dev\.([a-z]+)\.(\d+)\.//) {             $dev = $1.$2;         } else {             next;         }         if (/^(mac_stats).good_(octets_.*): *(\d+)$/o) {             ($p1,$p2,$v) = ($1,$2,$3*8);  # bytes * 8             # use a rolling 'last 4 data points' average             $delta=$v-$info{$dev}{$p1}{$p2}{'last'} if $info{$dev}{$p1}{$p2}{'last'};             $info{$dev}{$p1}{$p2}{'last'}=$v;             if ($DAMPEN) {                 # keep a running average...                 if ($avg{$dev}{$p2} && $delta) {                     # add t0 average over past 2 cycles                     $avg{$dev}{$p2} = ($delta + $avg{$dev}{$p2} * 2)/ 3;                     $delta = $avg{$dev}{$p2} unless ($delta = 0);  # hard zero at 0                 } else {                     # first time through                     $avg{$dev}{$p2} = 0; # init                 }             }         } elsif (/^(mac_stats|queue.*)\.(.*): *(\d+)$/o) {             ($p1,$p2,$v) = ($1,$2,$3);             $delta=$v-$info{$dev}{$p1}{$p2}{'last'} if $info{$dev}{$p1}{$p2}{'last'};             $info{$dev}{$p1}{$p2}{'last'}=$v;         } else {             next;         }         $sum{$dev}{$p2} += $delta;  # will aggregate all queues     }     locate 1, 1;  # move cursor to top left     my $seconds = time-$^T;     my $hours = int( $seconds / (60*60) );     my $mins = ( $seconds / 60 ) % 60;     my $secs = $seconds % 60;     my $elapsed = sprintf("%02d:%02d:%02d", $hours,$mins,$secs);     print colored [$c2[0]],sprintf("%-30s%${width1}s\n",scalar(localtime),$elapsed); # clear line, and return     print colored [$c2[1]],sprintf("%$w[0]s%-${width2}s\n", "Dev"," RX bits   TX bits    RX PPS    TX PPS  CK Error ");     $s++;     foreach my $dev (sort keys %sum) {         my $i = 0;         print colored [$c[0]], sprintf("%$w[$i]s",$dev);         foreach my $p2 (qw(octets_rcvd octets_txd rx_packets tx_packets checksum_errs)) {             $i++;             my $v = $sum{$dev}{$p2};             $v /= $SAMPLETIME if $s > 2; # need two values             $v =~ s/\..*//; # floor             # conver to M and k for Mega and Kilo             if ($v >  1000000) {                 $v /= 1000000;                 $v =~ s/\.\d+//;                 $v .= ' M';             } elsif ($v >  1000) {                 $v /= 1000;                 $v =~ s/\.\d+//;                 $v .= ' k';             } else {                 $v .= '  ';  # some padding for alignment             }             my $width = $w[$i] || 10;             print colored [$c[$i]],sprintf("%${width}s",$v);         }         print "\n";     }     print colored [$c2[2]],sprintf("%-${totalWidth}s\n", " $footer");     close STATS;     if ($s == 1) {         sleep 1;  # only sleep 1 on startup         next;     }     sleep $SAMPLETIME; }