Date: Mon, 30 Jun 2014 08:01:04 GMT From: zkorchev@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r270204 - soc2014/zkorchev/freebsd_head/usr.sbin/iostat Message-ID: <201406300801.s5U814e8015046@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: zkorchev Date: Mon Jun 30 08:01:03 2014 New Revision: 270204 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=270204 Log: libsol support for iostat Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile ============================================================================== --- soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile Mon Jun 30 05:33:52 2014 (r270203) +++ soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile Mon Jun 30 08:01:03 2014 (r270204) @@ -5,7 +5,8 @@ MAN= iostat.8 DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBM} -LDADD= -ldevstat -lkvm -lm +LDADD= -ldevstat -lkvm -lm -lsol +CFLAGS+=-DSOL_ON -I/usr/local/include WARNS?= 1 Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c ============================================================================== --- soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c Mon Jun 30 05:33:52 2014 (r270203) +++ soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c Mon Jun 30 08:01:03 2014 (r270204) @@ -115,6 +115,9 @@ #include <string.h> #include <termios.h> #include <unistd.h> +#if defined(SOL_ON) +# include <sol.h> +#endif struct nlist namelist[] = { #define X_TTY_NIN 0 @@ -139,6 +142,11 @@ int dflag = 0, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0; int xflag = 0, zflag = 0; +int sol_format; +#if defined(SOL_ON) +static struct sol_stream sol_stream; +#endif + /* local function declarations */ static void usage(void); static void needhdr(int signo); @@ -442,6 +450,11 @@ wrows = IOSTAT_DEFAULT_ROWS; } +#if defined(SOL_ON) + sol_format = sol_init(&sol_stream); + if (sol_format) sol_map_start(&sol_stream); +#endif + for (headercount = 1;;) { struct devinfo *tmp_dinfo; long tmp; @@ -585,9 +598,22 @@ last.cp_time[i] = tmp; } - if (xflag == 0 && Tflag > 0) - printf("%4.0Lf %5.0Lf", cur.tk_nin / etime, - cur.tk_nout / etime); + if (xflag == 0 && Tflag > 0) { +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "tin"); + sol_float(&sol_stream, cur.tk_nin / etime); + SOL_MAP_KEYL(&sol_stream, "tout"); + sol_float(&sol_stream, cur.tk_nout / etime); + } + else +#endif + { + printf("%4.0Lf %5.0Lf", cur.tk_nin / etime, + cur.tk_nout / etime); + } + } devstats(hflag, etime, havelast); @@ -606,6 +632,13 @@ havelast = 1; } +#if defined(SOL_ON) + if (sol_format) { + sol_map_end(&sol_stream); + sol_term(&sol_stream); + } +#endif + exit(0); } @@ -666,6 +699,10 @@ int i, printed; char devbuf[256]; +#if defined(SOL_ON) + if (sol_format) return; +#endif + /* * If xflag is set, we need a per-loop header, not a page header, so * just return. We'll print the header in devstats(). @@ -738,7 +775,11 @@ int firstline = 1; char *devname; +#if defined(SOL_ON) + if ((xflag > 0) && !sol_format) { +#else if (xflag > 0) { +#endif printf(" extended device statistics "); if (Tflag > 0) printf(" tty "); @@ -819,73 +860,180 @@ mb_per_second_read > ((long double).0005)/1024 || mb_per_second_write > ((long double).0005)/1024 || busy_pct > 0.5) { - if (Iflag == 0) - printf("%-8.8s %5.1Lf %5.1Lf %7.1Lf %7.1Lf %4" PRIu64 " %5.1Lf %3.0Lf ", - devname, transfers_per_second_read, - transfers_per_second_write, - mb_per_second_read * 1024, - mb_per_second_write * 1024, - queue_len, - ms_per_transaction, busy_pct); +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "device"); + sol_string(&sol_stream, devname, strlen(devname)); + if (Iflag == 0) { + SOL_MAP_KEYL(&sol_stream, "r/s"); + sol_float(&sol_stream, transfers_per_second_read); + SOL_MAP_KEYL(&sol_stream, "w/s"); + sol_float(&sol_stream, transfers_per_second_write); + SOL_MAP_KEYL(&sol_stream, "kr/s"); + sol_float(&sol_stream, mb_per_second_read * 1024); + SOL_MAP_KEYL(&sol_stream, "kw/s"); + sol_float(&sol_stream, mb_per_second_write * 1024); + SOL_MAP_KEYL(&sol_stream, "qlen"); + sol_float(&sol_stream, queue_len); + SOL_MAP_KEYL(&sol_stream, "svc_t"); + sol_float(&sol_stream, ms_per_transaction); + SOL_MAP_KEYL(&sol_stream, "%b"); + sol_float(&sol_stream, busy_pct); + } + else { + SOL_MAP_KEYL(&sol_stream, "r/i"); + sol_float(&sol_stream, total_transfers_read); + SOL_MAP_KEYL(&sol_stream, "w/i"); + sol_float(&sol_stream, total_transfers_write); + SOL_MAP_KEYL(&sol_stream, "kr/i"); + sol_float(&sol_stream, total_bytes_read / 1024); + SOL_MAP_KEYL(&sol_stream, "kw/i"); + sol_float(&sol_stream, total_bytes_write / 1024); + SOL_MAP_KEYL(&sol_stream, "qlen"); + sol_float(&sol_stream, queue_len); + SOL_MAP_KEYL(&sol_stream, "tsvc_t/i"); + sol_float(&sol_stream, total_duration); + SOL_MAP_KEYL(&sol_stream, "sb/i"); + sol_float(&sol_stream, busy_time); + } + + if (firstline) { + /* + * If this is the first device + * we're printing, also print + * CPU or TTY stats if requested. + */ + firstline = 0; + if (Tflag > 0) { + SOL_MAP_KEYL(&sol_stream, "tin"); + sol_float(&sol_stream, cur.tk_nin / etime); + SOL_MAP_KEYL(&sol_stream, "tout"); + sol_float(&sol_stream, cur.tk_nout / etime); + } + if (Cflag > 0) + cpustats(); + } + } else - printf("%-8.8s %11.1Lf %11.1Lf " - "%12.1Lf %12.1Lf %4" PRIu64 - " %10.1Lf %9.1Lf ", - devname, - (long double)total_transfers_read, - (long double)total_transfers_write, - (long double) - total_bytes_read / 1024, - (long double) - total_bytes_write / 1024, - queue_len, - total_duration, busy_time); - if (firstline) { - /* - * If this is the first device - * we're printing, also print - * CPU or TTY stats if requested. - */ - firstline = 0; - if (Tflag > 0) - printf("%4.0Lf%5.0Lf", - cur.tk_nin / etime, - cur.tk_nout / etime); - if (Cflag > 0) - cpustats(); +#endif + { + if (Iflag == 0) + printf("%-8.8s %5.1Lf %5.1Lf %7.1Lf %7.1Lf %4" PRIu64 " %5.1Lf %3.0Lf ", + devname, transfers_per_second_read, + transfers_per_second_write, + mb_per_second_read * 1024, + mb_per_second_write * 1024, + queue_len, + ms_per_transaction, busy_pct); + else + printf("%-8.8s %11.1Lf %11.1Lf " + "%12.1Lf %12.1Lf %4" PRIu64 + " %10.1Lf %9.1Lf ", + devname, + (long double)total_transfers_read, + (long double)total_transfers_write, + (long double) + total_bytes_read / 1024, + (long double) + total_bytes_write / 1024, + queue_len, + total_duration, busy_time); + if (firstline) { + /* + * If this is the first device + * we're printing, also print + * CPU or TTY stats if requested. + */ + firstline = 0; + if (Tflag > 0) + printf("%4.0Lf%5.0Lf", + cur.tk_nin / etime, + cur.tk_nout / etime); + if (Cflag > 0) + cpustats(); + } + printf("\n"); } - printf("\n"); } free(devname); } else if (oflag > 0) { - int msdig = (ms_per_transaction < 100.0) ? 1 : 0; - - if (Iflag == 0) - printf("%4.0Lf%4.0Lf%5.*Lf ", - blocks_per_second, - transfers_per_second, - msdig, - ms_per_transaction); +#if defined(SOL_ON) + if (sol_format) + { + if (Iflag == 0) { + SOL_MAP_KEYL(&sol_stream, "sps"); + sol_float(&sol_stream, blocks_per_second); + SOL_MAP_KEYL(&sol_stream, "tps"); + sol_float(&sol_stream, transfers_per_second); + } + else { + SOL_MAP_KEYL(&sol_stream, "blk"); + sol_float(&sol_stream, total_blocks); + SOL_MAP_KEYL(&sol_stream, "xfr"); + sol_float(&sol_stream, total_transfers); + } + SOL_MAP_KEYL(&sol_stream, "msps"); + sol_float(&sol_stream, ms_per_transaction); + } else - printf("%4.1" PRIu64 "%4.1" PRIu64 "%5.*Lf ", - total_blocks, - total_transfers, - msdig, - ms_per_transaction); +#endif + { + int msdig = (ms_per_transaction < 100.0) ? 1 : 0; + + if (Iflag == 0) + printf("%4.0Lf%4.0Lf%5.*Lf ", + blocks_per_second, + transfers_per_second, + msdig, + ms_per_transaction); + else + printf("%4.1" PRIu64 "%4.1" PRIu64 "%5.*Lf ", + total_blocks, + total_transfers, + msdig, + ms_per_transaction); + } } else { - if (Iflag == 0) - printf(" %5.2Lf %3.0Lf %5.2Lf ", - kb_per_transfer, - transfers_per_second, - mb_per_second); - else { - total_mb = total_bytes; - total_mb /= 1024 * 1024; - - printf(" %5.2Lf %3.1" PRIu64 " %5.2Lf ", - kb_per_transfer, - total_transfers, - total_mb); +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "KB/t"); + sol_float(&sol_stream, kb_per_transfer); + + if (Iflag == 0) { + SOL_MAP_KEYL(&sol_stream, "tps"); + sol_float(&sol_stream, transfers_per_second); + SOL_MAP_KEYL(&sol_stream, "MB/s"); + sol_float(&sol_stream, mb_per_second); + } + else { + total_mb = total_bytes; + total_mb /= 1024 * 1024; + + SOL_MAP_KEYL(&sol_stream, "xfrs"); + sol_float(&sol_stream, total_transfers); + SOL_MAP_KEYL(&sol_stream, "MB"); + sol_float(&sol_stream, total_mb); + } + } + else +#endif + { + if (Iflag == 0) + printf(" %5.2Lf %3.0Lf %5.2Lf ", + kb_per_transfer, + transfers_per_second, + mb_per_second); + else { + total_mb = total_bytes; + total_mb /= 1024 * 1024; + + printf(" %5.2Lf %3.1" PRIu64 " %5.2Lf ", + kb_per_transfer, + total_transfers, + total_mb); + } } } } @@ -896,13 +1044,27 @@ * lines I/O because they were all zero, * print TTY/CPU stats. */ - printf("%52s",""); - if (Tflag > 0) - printf("%4.0Lf %5.0Lf", cur.tk_nin / etime, - cur.tk_nout / etime); - if (Cflag > 0) - cpustats(); - printf("\n"); +#if defined(SOL_ON) + if (sol_format) + { + SOL_MAP_KEYL(&sol_stream, "tin"); + sol_float(&sol_stream, cur.tk_nin / etime); + SOL_MAP_KEYL(&sol_stream, "tout"); + sol_float(&sol_stream, cur.tk_nout / etime); + if (Cflag > 0) + cpustats(); + } + else +#endif + { + printf("%52s",""); + if (Tflag > 0) + printf("%4.0Lf %5.0Lf", cur.tk_nin / etime, + cur.tk_nout / etime); + if (Cflag > 0) + cpustats(); + printf("\n"); + } } } @@ -916,9 +1078,20 @@ for (state = 0; state < CPUSTATES; ++state) time += cur.cp_time[state]; - for (state = 0; state < CPUSTATES; ++state) - printf(" %2.0f", - rint(100. * cur.cp_time[state] / (time ? time : 1))); +#if defined(SOL_ON) + if (sol_format) { + SOL_MAP_KEYL(&sol_stream, "cpu"); + sol_array_start(&sol_stream); + for (state = 0; state < CPUSTATES; ++state) + sol_float(&sol_stream, + rint(100. * cur.cp_time[state] / (time ? time : 1))); + sol_array_end(&sol_stream); + } + else +#endif + for (state = 0; state < CPUSTATES; ++state) + printf(" %2.0f", + rint(100. * cur.cp_time[state] / (time ? time : 1))); } static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406300801.s5U814e8015046>