diff options
author | Steve Wills <swills@FreeBSD.org> | 2018-01-15 21:42:38 +0000 |
---|---|---|
committer | Steve Wills <swills@FreeBSD.org> | 2018-01-15 21:42:38 +0000 |
commit | 1d3eedfd1407310c68c8e9f0ccb4dab5596fd760 (patch) | |
tree | 007f8ee1fc4128a5100e27ee0fe51be4e264ee37 /net-mgmt | |
parent | d26c7ca19214091688a08348079d4da4f7285d53 (diff) | |
download | ports-1d3eedfd1407310c68c8e9f0ccb4dab5596fd760.tar.gz ports-1d3eedfd1407310c68c8e9f0ccb4dab5596fd760.zip |
Notes
Diffstat (limited to 'net-mgmt')
-rw-r--r-- | net-mgmt/nstat/Makefile | 15 | ||||
-rw-r--r-- | net-mgmt/nstat/distinfo | 3 | ||||
-rw-r--r-- | net-mgmt/nstat/files/Makefile | 4 | ||||
-rw-r--r-- | net-mgmt/nstat/files/nstat.1 | 58 | ||||
-rw-r--r-- | net-mgmt/nstat/files/nstat.c | 423 | ||||
-rw-r--r-- | net-mgmt/nstat/pkg-descr | 2 |
6 files changed, 12 insertions, 493 deletions
diff --git a/net-mgmt/nstat/Makefile b/net-mgmt/nstat/Makefile index 5ce691dfb33b..becfbb5cba29 100644 --- a/net-mgmt/nstat/Makefile +++ b/net-mgmt/nstat/Makefile @@ -2,25 +2,24 @@ PORTNAME= nstat PORTVERSION= 1.0 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= net-mgmt -MASTER_SITES= # empty -DISTFILES= # empty MAINTAINER= swills@FreeBSD.org COMMENT= Replacement for bw/netstat/vmstat/pcm-memory.x +LICENSE= BSD2CLAUSE +LICENSE_FILE= ${WRKSRC}/LICENSE + RUN_DEPENDS= pcm.x:sysutils/intel-pcm -NO_FETCH= yes +USE_GITHUB= yes +GH_ACCOUNT= gallatin +GH_TAGNAME= 5839b41 PLIST_FILES= bin/nstat \ man/man1/nstat.1.gz -do-extract: - @${MKDIR} ${WRKSRC} - @(cd ${FILESDIR} && ${CP} -R . ${WRKSRC}) - do-install: ${MKDIR} ${STAGEDIR}${PREFIX}/bin ${INSTALL_PROGRAM} ${WRKSRC}/nstat ${STAGEDIR}${PREFIX}/bin diff --git a/net-mgmt/nstat/distinfo b/net-mgmt/nstat/distinfo new file mode 100644 index 000000000000..1ddf6df6721b --- /dev/null +++ b/net-mgmt/nstat/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1516051596 +SHA256 (gallatin-nstat-1.0-5839b41_GH0.tar.gz) = 1f43ce88e2a1b09a4369325e6761fa490a7a680ea20a8cedc0644c4023195ac8 +SIZE (gallatin-nstat-1.0-5839b41_GH0.tar.gz) = 5136 diff --git a/net-mgmt/nstat/files/Makefile b/net-mgmt/nstat/files/Makefile deleted file mode 100644 index 51dd29d499c9..000000000000 --- a/net-mgmt/nstat/files/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PROG= nstat -WARNS= 2 - -.include <bsd.prog.mk> diff --git a/net-mgmt/nstat/files/nstat.1 b/net-mgmt/nstat/files/nstat.1 deleted file mode 100644 index 27857331c748..000000000000 --- a/net-mgmt/nstat/files/nstat.1 +++ /dev/null @@ -1,58 +0,0 @@ -.\" Copyright (c) 2017 -.\" Netflix Inc. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd May 22, 2017 -.Dt NSTAT 1 -.Os -.Sh NAME -.Nm nstat -.Nd Display various stats. -.Sh SYNOPSIS -.Nm -.Op Fl m -.Op wait -.Sh DESCRIPTION -The -.Nm -utility will display system stats similar to netstat and vmstat. - -.Pp -The options are as follows: -.Bl -tag -width indent -.Fl m -run pcm-memory.x and report memory bandwidth statistics -.Pp -.Sh EXAMPLES -The command: -.Dl netstat -m 10 -will print what the system is doing every 10 -seconds, including reporting memory bandwith. - -.Sh SEE ALSO -.Xr netstat 1 , -.Xr vmstat 8 , -.Xr pcm-memory.x 1 - diff --git a/net-mgmt/nstat/files/nstat.c b/net-mgmt/nstat/files/nstat.c deleted file mode 100644 index ddc620d0fe34..000000000000 --- a/net-mgmt/nstat/files/nstat.c +++ /dev/null @@ -1,423 +0,0 @@ -/*- - * Copyright (c) 2017 - * Netflix Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * - */ - - -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/sysctl.h> -#include <sys/time.h> - -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sysexits.h> -#include <unistd.h> - -#include <net/if.h> -#include <net/if_types.h> -#include <net/if_mib.h> - -#include <netinet/tcp_fsm.h> - -#include <sys/resource.h> -#include <sys/ttycom.h> -#include <sys/vmmeter.h> - - -/* why is this only defined in the kernel */ -#define timespecadd(vvp, uvp) \ - do { \ - (vvp)->tv_sec += (uvp)->tv_sec; \ - (vvp)->tv_nsec += (uvp)->tv_nsec; \ - if ((vvp)->tv_nsec >= 1000000000) { \ - (vvp)->tv_sec++; \ - (vvp)->tv_nsec -= 1000000000; \ - } \ - } while (0) - - -#define SWAP_CPU() { cpu_tmp = cpu; cpu = cpu_prev; cpu_prev = cpu_tmp; } -double -get_cpu(void) -{ - static long cpu_time[CPUSTATES]; - static long cpu_time_too[CPUSTATES]; - static long *cpu = cpu_time, *cpu_prev = cpu_time_too, *cpu_tmp; - long busy, idle; - size_t len; - int i, status; - - SWAP_CPU(); - len = sizeof(cpu_time); - status = sysctlbyname("kern.cp_time", cpu, &len, NULL, 0); - if (status) { - err(EX_OSERR, "Cant get CPU time"); - } - for (busy = 0, i = 0; i < CPUSTATES; i++) { - if (i != CP_IDLE) - busy += cpu[i] - cpu_prev[i]; - } - idle = cpu[CP_IDLE] - cpu_prev[CP_IDLE]; - - return ((double)busy / (double)(busy + idle) * 100.0); -} - -#define SWAP_VM() { vmm_tmp = vmm; vmm = vmm_prev; vmm_prev = vmm_tmp; } -struct my_vmmeter { - uint64_t v_syscall; - uint64_t v_swtch; - uint64_t v_intr; - uint64_t v_free_count; -}; - -void -get_vmm(u_int *syscall, u_int *csw, u_int *irq, double *free) -{ - static struct my_vmmeter vmm_arr[2]; - static struct my_vmmeter *vmm = &vmm_arr[0], *vmm_prev = &vmm_arr[1], - *vmm_tmp; - size_t len; - int status; - - SWAP_VM(); - len = sizeof(vmm->v_syscall); - status = sysctlbyname("vm.stats.sys.v_syscall", - &vmm->v_syscall, &len, NULL, 0); - status |= sysctlbyname("vm.stats.sys.v_swtch", - &vmm->v_swtch, &len, NULL, 0); - status |= sysctlbyname("vm.stats.sys.v_intr", - &vmm->v_intr, &len, NULL, 0); - status |= sysctlbyname("vm.stats.vm.v_free_count", - &vmm->v_free_count, &len, NULL, 0); - if (status) { - err(EX_OSERR, "Cant get CPU time"); - } - *syscall = vmm->v_syscall - vmm_prev->v_syscall; - *csw = vmm->v_swtch - vmm_prev->v_swtch; - *irq = vmm->v_intr - vmm_prev->v_intr; - *free = ((double)vmm->v_free_count * 4096.0) / - (1024.0 * 1024.0 * 1024.0); - -} - -static int -find_if(char *wanted) -{ - size_t len; - int if_maxidx, i; - int name[6]; - char ifn[128]; - - name[0] = CTL_NET; - name[1] = PF_LINK; - name[2] = NETLINK_GENERIC; - name[3] = IFMIB_SYSTEM; - name[4] = IFMIB_IFCOUNT; - - len = sizeof(if_maxidx); - if (sysctl(name, 5, &if_maxidx, &len, 0, 0) < 0) - err(EX_OSERR, "can't get ifcnt"); - - - for (i = 0; i <= if_maxidx; i++) { - name[3] = IFMIB_IFDATA; - name[4] = i; - name[5] = IFDATA_DRIVERNAME; - len = sizeof(ifn); - if (sysctl(name, 6, ifn, &len, 0, 0) < 0) { - if (errno == ENOENT) - continue; - err(EX_OSERR, "can't get ifname"); - } - if (0 == strncmp(wanted, ifn, len)) - return (i); - } - printf("Could not find %s\n", wanted); - exit(ENOENT); -} - -static void -get_nic_stats(int if_idx, struct ifmibdata *ifm) -{ - size_t len; - int name[6]; - - name[0] = CTL_NET; - name[1] = PF_LINK; - name[2] = NETLINK_GENERIC; - name[3] = IFMIB_IFDATA; - name[4] = if_idx; - name[5] = IFDATA_GENERAL; - len = sizeof(*ifm); - if (sysctl(name, 6, ifm, &len, 0, 0) < 0) - err(EX_OSERR, "could not get nic stats"); -} - -static char * -find_ifname(void) -{ - static char ifbuf[80]; - FILE *pipe; - char *p; - - - pipe = popen("netstat -4rn | grep default", "r"); - if (pipe == NULL) - err(EX_OSERR, "could not run netsat"); - (void)fread(ifbuf, sizeof(ifbuf) - 1, 1, pipe); - pclose(pipe); - p = &ifbuf[sizeof(ifbuf) - 1]; - while (*p != ' ') { - if (*p == '\n') - *p = '\0'; - p--; - if (p == ifbuf) - err(EX_DATAERR, "can't read def rt"); - } - /* we are point to a space, point to 1st ifname char */ - return (p + 1); -} - -static int -find_rows(void) -{ - struct winsize sz; - int rows; - - rows = 24; - if (isatty(STDOUT_FILENO)) { - if (0 == ioctl(STDOUT_FILENO, TIOCGWINSZ, &sz)) - rows = sz.ws_row; - } - return (rows); -} - -static void -get_pcm_mem(double interval, double *r, double *w, double *rw) -{ - static FILE * pipe = NULL; - static int pipe_fd; - char *open_str; - char buf[256]; - char *p; - int sem_cnt, ret_found; - ssize_t bytes; - - if (pipe == NULL) { - open_str = alloca(80); - snprintf(open_str, 80, - "pcm-memory.x -csv %f 2>/dev/null", interval * 0.99); - pipe = popen(open_str, "r"); - if (pipe == NULL) - err(EX_OSERR, "pipe"); - /* read one-time CSV hdrs */ - (void)fread(buf, sizeof(buf) - 1, 1, pipe); - pipe_fd = fileno(pipe); - fcntl(pipe_fd, F_SETFL, O_NONBLOCK); - } - bzero(buf, sizeof(buf)); - bytes = read(pipe_fd, buf, sizeof(buf)); - if (bytes == 0) - err(EX_OSERR, - "pcm-memory.x exited - kldload cpuctl?"); - - if (bytes == -1) { - if (errno == EAGAIN) - return; - err(EX_OSERR, "read from pcm-memory.x failed"); - } - - p = &buf[bytes]; - /* - * the CSV is formatted as: ...; ....; readbw; writebw; rwbw\n - * - * So we start at the end of the buffer, and look backwards for a - * return. Once found, we then count back 3 semi-colons, and then - * pass it to sscanf - */ - - ret_found = 0; - sem_cnt = 0; - while (p != buf && sem_cnt < 3) { - p--; - if (!ret_found && *p != '\n') - continue; - ret_found = 1; - if (*p == ';') - sem_cnt++; - } - if (sem_cnt == 3) { - p++; - sscanf(p, "%lf; %lf; %lf", r, w, rw); - } -} - -long -get_tcp_est() -{ - uint64_t tcps[TCP_NSTATES]; - size_t len = sizeof(tcps); - int status; - - status = sysctlbyname("net.inet.tcp.states", tcps, &len, NULL, 0); - if (status != 0) - err(EX_OSERR, "could not fetch tcp states"); - - return ((long)tcps[TCPS_ESTABLISHED]); -} - -#define SWAP_IFM() { ifm_tmp = ifm; ifm = ifm_prev; ifm_prev = ifm_tmp; } - - -static void -print_hdr(int do_pcm_mem) -{ - printf(" InMpps OMpps InGbs OGbs err TCP Est %%CPU syscalls csw irq GBfree"); - if (do_pcm_mem) - printf(" MemRd MemWr MemRW"); - printf("\n"); - -} - -static void -usage(char *name) -{ - fprintf(stderr, - "usage: %s [-m] [-I interface] [wait]\n", name); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct ifmibdata ifmd[2]; - struct ifmibdata *ifm, *ifm_prev, *ifm_tmp; - char *ifname = NULL; - int c, if_idx; - double o_gbps, i_gbps, o_mpps, i_mpps; - long errs, est; - double interval = 1.0; - int rows = find_rows() - 1; - int row = 0; - int do_pcm_mem = 0; - u_int syscalls, csw, irq; - double free_mem; - double mem_rd = 0.0, mem_wr = 0.0, mem_rw = 0.0; - struct timespec interval_ts, deadline_ts; - - - while ((c = getopt(argc, argv, "mI:")) != -1) { - switch (c) { - case 'm': - do_pcm_mem = 1; - break; - case 'I': - ifname = optarg; - break; - default: - usage(argv[0]); - } - } - argc -= optind; - argv += optind; - - if (*argv) - interval = atof(*argv); - - interval_ts.tv_sec = (time_t)interval; - interval_ts.tv_nsec = (interval - (time_t)interval) * 1000000000; - - if (ifname == NULL) - ifname = find_ifname(); - - if_idx = find_if(ifname); - ifm = &ifmd[0]; - ifm_prev = &ifmd[1]; - - /* - * preload all the counters so 1st interval looks reasonable - */ - - if (do_pcm_mem) - get_pcm_mem(interval, &mem_rd, &mem_wr, &mem_rw); - get_nic_stats(if_idx, ifm); - est = get_tcp_est(); - get_vmm(&syscalls, &csw, &irq, &free_mem); - (void)get_cpu(); - usleep(interval * 1000 * 1000); - clock_gettime(CLOCK_UPTIME, &deadline_ts); - while (1) { - if (row == 0) - print_hdr(do_pcm_mem); - SWAP_IFM(); - get_nic_stats(if_idx, ifm); - i_gbps = ifm->ifmd_data.ifi_ibytes - - ifm_prev->ifmd_data.ifi_ibytes; - i_gbps = (8.0 * i_gbps) / (1000.0 * 1000.0 * 1000.0 * interval); - o_gbps = ifm->ifmd_data.ifi_obytes - - ifm_prev->ifmd_data.ifi_obytes; - o_gbps = (8.0 * o_gbps) / (1000.0 * 1000.0 * 1000.0 * interval); - i_mpps = ifm->ifmd_data.ifi_ipackets - - ifm_prev->ifmd_data.ifi_ipackets; - i_mpps = i_mpps / (1000 * 1000 * interval); - o_mpps = ifm->ifmd_data.ifi_opackets - - ifm_prev->ifmd_data.ifi_opackets; - o_mpps = o_mpps / (1000 * 1000 * interval); - - /* all errs .. should be rare, don't clutter output */ - errs = ifm->ifmd_data.ifi_oerrors - - ifm_prev->ifmd_data.ifi_oerrors; - errs += ifm->ifmd_data.ifi_ierrors - - ifm_prev->ifmd_data.ifi_ierrors; - errs += ifm->ifmd_data.ifi_oqdrops - - ifm_prev->ifmd_data.ifi_oqdrops; - errs += ifm->ifmd_data.ifi_iqdrops - - ifm_prev->ifmd_data.ifi_iqdrops; - - est = get_tcp_est(); - get_vmm(&syscalls, &csw, &irq, &free_mem); - printf("%6.2lf %6.2lf %6.2lf %6.2lf %2ld %6ld %4.2lf %6.0f %6.0f %6.0f %5.2lf", - i_mpps, o_mpps, i_gbps, o_gbps, errs, est, get_cpu(), - syscalls / interval, csw / interval, irq / interval, - free_mem); - - if (do_pcm_mem) { - get_pcm_mem(interval, &mem_rd, &mem_wr, &mem_rw); - printf(" %8.2f %8.2f %8.2f", mem_rd, mem_wr, mem_rw); - } - printf("\n"); - if (++row == rows) - row = 0; - - timespecadd(&deadline_ts, &interval_ts); - clock_nanosleep(CLOCK_UPTIME, TIMER_ABSTIME, &deadline_ts, NULL); - } -} diff --git a/net-mgmt/nstat/pkg-descr b/net-mgmt/nstat/pkg-descr index c7f1eff8d693..98d31976ac83 100644 --- a/net-mgmt/nstat/pkg-descr +++ b/net-mgmt/nstat/pkg-descr @@ -2,3 +2,5 @@ nstat is a replacement for the most frequently used parts of vmstat, netstat (bw), and pmc-memory.x The advantage of using nstat is that it can run all in a single session, rather than having to use 3 terminal sessions to monitor a machine. + +WWW: https://github.com/gallatin/nstat |