bin/73327: [PATCH] iostat - extended mode display

Peter Schuller peter.schuller at infidyne.com
Sat Oct 30 15:30:27 PDT 2004


The following reply was made to PR bin/73327; it has been noted by GNATS.

From: Peter Schuller <peter.schuller at infidyne.com>
To: FreeBSD-gnats-submit at freebsd.org, freebsd-bugs at freebsd.org
Cc:  
Subject: Re: bin/73327: [PATCH] iostat - extended mode display
Date: Sun, 31 Oct 2004 00:29:20 +0200

 Updated patches follow. I had neglected to supress -T and -C in the presence 
 of -X, aswell as updating a part of the man page.
 
 --- iostat_53.c Sat Oct 30 21:35:44 2004
 +++ iostat.c Sun Oct 31 00:19:53 2004
 @@ -136,7 +136,7 @@
  struct device_selection *dev_select;
  int maxshowdevs;
  volatile sig_atomic_t headercount;
 -int dflag = 0, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0;
 +int dflag = 0, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0, xflag = 
 0;
  
  /* local function declarations */
  static void usage(void);
 @@ -184,7 +184,7 @@
   matches = NULL;
   maxshowdevs = 3;
  
 - while ((c = getopt(argc, argv, "c:CdhIKM:n:N:ot:Tw:?")) != -1) {
 + while ((c = getopt(argc, argv, "c:CdhIKM:n:N:ot:Txw:?")) != -1) {
    switch(c) {
     case 'c':
      cflag++;
 @@ -232,6 +232,10 @@
     case 'T':
      Tflag++;
      break;
 +   case 'x':
 +    xflag++;
 +    dflag++;
 +    break;
     case 'w':
      wflag++;
      waittime = atoi(optarg);
 @@ -276,21 +280,33 @@
   }
  
   /*
 +  * Tflag/Cflag are not supported in extended output mode.
 +  */
 + if (xflag > 0) {
 +  Cflag = 0;
 +  Tflag = 0;
 + }
 +
 + /*
    * Figure out how many devices we should display.
    */
   if (nflag == 0) {
 -  if (oflag > 0) {
 -   if ((dflag > 0) && (Cflag == 0) && (Tflag == 0))
 -    maxshowdevs = 5;
 -   else if ((dflag > 0) && (Tflag > 0) && (Cflag == 0))
 -    maxshowdevs = 5;
 -   else
 -    maxshowdevs = 4;
 +  if (xflag > 0) {
 +   maxshowdevs = 20; /* Suitable for 25 line screens */
    } else {
 -   if ((dflag > 0) && (Cflag == 0))
 -    maxshowdevs = 4;  
 -   else
 -    maxshowdevs = 3;
 +   if (oflag > 0) {
 +    if ((dflag > 0) && (Cflag == 0) && (Tflag == 0))
 +     maxshowdevs = 5;
 +    else if ((dflag > 0) && (Tflag > 0) && (Cflag == 0))
 +     maxshowdevs = 5;
 +    else
 +     maxshowdevs = 4;
 +   } else {
 +    if ((dflag > 0) && (Cflag == 0))
 +     maxshowdevs = 4;  
 +    else
 +     maxshowdevs = 3;
 +   }
    }
   }
  
 @@ -441,7 +457,7 @@
     }
    }
  
 -  if (!--headercount) {
 +  if (!--headercount || xflag > 0) {
     phdr();
     headercount = 20;
    }
 @@ -587,20 +603,22 @@
  
   if (Tflag > 0)
    (void)printf("      tty");
 - for (i = 0, printed=0;(i < num_devices) && (printed < maxshowdevs);i++){
 -  int di;
 -  if ((dev_select[i].selected != 0)
 -   && (dev_select[i].selected <= maxshowdevs)) {
 -   di = dev_select[i].position;
 -   if (oflag > 0)
 -    (void)printf("%12.6s%d ", 
 -         cur.dinfo->devices[di].device_name,
 -         cur.dinfo->devices[di].unit_number);
 -   else
 -    printf("%15.6s%d ",
 -         cur.dinfo->devices[di].device_name,
 -         cur.dinfo->devices[di].unit_number);
 -   printed++;
 + if (xflag == 0) {
 +  for (i = 0, printed=0;(i < num_devices) && (printed < maxshowdevs);i++){
 +   int di;
 +   if ((dev_select[i].selected != 0)
 +    && (dev_select[i].selected <= maxshowdevs)) {
 +    di = dev_select[i].position;
 +    if (oflag > 0)
 +     (void)printf("%12.6s%d ", 
 +          cur.dinfo->devices[di].device_name,
 +          cur.dinfo->devices[di].unit_number);
 +    else
 +     printf("%15.6s%d ",
 +          cur.dinfo->devices[di].device_name,
 +          cur.dinfo->devices[di].unit_number);
 +    printed++;
 +   }
    }
   }
   if (Cflag > 0)
 @@ -611,21 +629,35 @@
   if (Tflag > 0)
    (void)printf(" tin tout");
  
 - for (i=0, printed = 0;(i < num_devices) && (printed < maxshowdevs);i++){
 -  if ((dev_select[i].selected != 0)
 -   && (dev_select[i].selected <= maxshowdevs)) {
 -   if (oflag > 0) {
 -    if (Iflag == 0)
 -     (void)printf(" sps tps msps ");
 -    else
 -     (void)printf(" blk xfr msps ");
 -   } else {
 -    if (Iflag == 0)
 -     printf("  KB/t tps  MB/s ");
 -    else
 -     printf("  KB/t xfrs   MB ");
 + if (xflag > 0) {
 +  if (oflag > 0) {
 +   if (Iflag == 0)
 +    printf("          dev  sps   r   w  tps msps");
 +   else
 +    printf("          dev  blk   r   w  xfr msps");
 +  } else {
 +   if (Iflag == 0)
 +    printf("          dev      KB/t      tps     MB/s    MBr/s    MRw/s");
 +   else
 +    printf("          dev      KB/t     xfrs       MB      MBr      MBw");
 +  }
 + } else {
 +  for (i=0, printed = 0;(i < num_devices) && (printed < maxshowdevs);i++){
 +   if ((dev_select[i].selected != 0)
 +    && (dev_select[i].selected <= maxshowdevs)) {
 +    if (oflag > 0) {
 +     if (Iflag == 0)
 +      (void)printf(" sps tps msps ");
 +     else
 +      (void)printf(" blk xfr msps ");
 +    } else {
 +     if (Iflag == 0)
 +      printf("  KB/t tps  MB/s ");
 +     else
 +      printf("  KB/t xfrs   MB ");
 +    }
 +    printed++;
     }
 -   printed++;
    }
   }
   if (Cflag > 0)
 @@ -641,10 +673,16 @@
   register int dn;
   long double transfers_per_second;
   long double kb_per_transfer, mb_per_second;
 + long double mb_per_second_read, mb_per_second_write;
   u_int64_t total_bytes, total_transfers, total_blocks;
 - long double total_mb;
 + u_int64_t total_bytes_read;
 + u_int64_t total_blocks_read;
 + u_int64_t total_bytes_write;
 + u_int64_t total_blocks_write;
 + long double total_mb, total_mb_read, total_mb_write;
   long double blocks_per_second, ms_per_transaction;
 - 
 + long double blocks_per_second_read, blocks_per_second_write;
 +
   for (dn = 0; dn < num_devices; dn++) {
    int di;
  
 @@ -657,12 +695,20 @@
    if (devstat_compute_statistics(&cur.dinfo->devices[di],
        havelast ? &last.dinfo->devices[di] : NULL, etime,
        DSM_TOTAL_BYTES, &total_bytes,
 +      DSM_TOTAL_BYTES_READ, &total_bytes_read,
 +      DSM_TOTAL_BYTES_WRITE, &total_bytes_write,
        DSM_TOTAL_TRANSFERS, &total_transfers,
        DSM_TOTAL_BLOCKS, &total_blocks,
 +      DSM_TOTAL_BLOCKS_READ, &total_blocks_read,
 +      DSM_TOTAL_BLOCKS_WRITE, &total_blocks_write,
        DSM_KB_PER_TRANSFER, &kb_per_transfer,
        DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
 -      DSM_MB_PER_SECOND, &mb_per_second, 
 +      DSM_MB_PER_SECOND, &mb_per_second,
 +      DSM_MB_PER_SECOND_READ, &mb_per_second_read,
 +      DSM_MB_PER_SECOND_WRITE, &mb_per_second_write,
        DSM_BLOCKS_PER_SECOND, &blocks_per_second,
 +      DSM_BLOCKS_PER_SECOND_READ, &blocks_per_second_read,
 +      DSM_BLOCKS_PER_SECOND_WRITE, &blocks_per_second_write,
        DSM_MS_PER_TRANSACTION, &ms_per_transaction,
        DSM_NONE) != 0)
     errx(1, "%s", devstat_errbuf);
 @@ -684,31 +730,82 @@
     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.1qu%4.1qu%5.*Lf ",
 -           total_blocks,
 -           total_transfers,
 -           msdig,
 -           ms_per_transaction);
 +    if (xflag == 0) {
 +     printf("%4.0Lf%4.0Lf%5.*Lf ",
 +            blocks_per_second,
 +            transfers_per_second,
 +            msdig,
 +            ms_per_transaction);
 +    } else {
 +     printf("%12.6s%d %8.0Lf%8.0Lf%8.0Lf%8.0Lf%8.*Lf\n",
 +            dev_select[dn].device_name,
 +            dev_select[dn].unit_number,
 +            blocks_per_second,
 +            blocks_per_second_read,
 +            blocks_per_second_write,
 +            transfers_per_second,
 +            msdig,
 +            ms_per_transaction);
 +    }
 +   else {
 +    if (xflag == 0) {
 +     printf("%4.1qu%4.1qu%5.*Lf ",
 +            total_blocks,
 +            total_transfers,
 +            msdig,
 +            ms_per_transaction);
 +    } else {
 +     printf("%12.6s%d %8.1qu%8.1qu%8.1qu%8.1qu%8.*Lf\n",
 +            dev_select[dn].device_name,
 +            dev_select[dn].unit_number,
 +            total_blocks,
 +            total_blocks_read,
 +            total_blocks_write,
 +            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);
 +    if (xflag == 0) {
 +     printf(" %5.2Lf %3.0Lf %5.2Lf ", 
 +            kb_per_transfer,
 +                  transfers_per_second,
 +                 mb_per_second);
 +    } else {
 +     printf("%12.6s%d  %8.2Lf %8.0Lf %8.2Lf %8.2Lf %8.2Lf\n",
 +            dev_select[dn].device_name,
 +            dev_select[dn].unit_number,
 +            kb_per_transfer,
 +            transfers_per_second,
 +            mb_per_second,
 +            mb_per_second_read,
 +            mb_per_second_write);
 +    }
     else {
      total_mb = total_bytes;
      total_mb /= 1024 * 1024;
 -
 -    printf(" %5.2Lf %3.1qu %5.2Lf ", 
 -           kb_per_transfer,
 -           total_transfers,
 -           total_mb);
 +    
 +    if (xflag == 0) {
 +     printf(" %5.2Lf %3.1qu %5.2Lf ", 
 +            kb_per_transfer,
 +            total_transfers,
 +            total_mb);
 +    } else {
 +     total_mb_read = total_bytes_read;
 +     total_mb_read /= 1024 * 1024;
 +     total_mb_write = total_bytes_write;
 +     total_mb_write /= 1024 * 1024;
 +     printf("%12.6s%d  %8.2Lf %8.1qu %8.2Lf %8.2Lf %8.2Lf\n",
 +            dev_select[dn].device_name,
 +            dev_select[dn].unit_number,
 +            kb_per_transfer,
 +            total_transfers,
 +            total_mb,
 +            total_mb_read,
 +            total_mb_write);
 +    }
     }
    }
   }
 
 
 --- iostat_53.8 Sat Oct 30 21:52:01 2004
 +++ iostat.8 Sun Oct 31 00:20:49 2004
 @@ -70,7 +70,7 @@
  statistics
  .Sh SYNOPSIS
  .Nm
 -.Op Fl CdhKIoT?\&
 +.Op Fl CdhKIoTx?\&
  .Op Fl c Ar count
  .Op Fl M Ar core
  .Op Fl n Ar devs
 @@ -107,10 +107,16 @@
  Display CPU statistics.
  This is on by default, unless
  .Fl d
 -is specified.
 +is specified. If
 +.Fl x
 +is specified, this option has no effect.
  .It Fl d
 -Display only device statistics.
 -If this flag is turned on, only device statistics will be displayed, unless
 +Display only device statistics. Default if
 +.Fl x
 +is specified.
 +If this flag is turned on, only device statistics will be displayed unless
 +.Fl x
 +is NOT specified and
  .Fl C
  or
  .Fl T
 @@ -231,7 +237,15 @@
  Display TTY statistics.
  This is on by default, unless
  .Fl d
 +or
 +.Fl x
  is specified.
 +.It Fl x
 +Show extended statistics. Implies -d. By default up to 20 devices
 +are shown. In this mode each device is displayed on a line of its
 +own and the header is printed at each update. The layout is also
 +slightly adjusted to accommodate larger values. Individual read
 +and write statistics are printed in addition to the totals.
  .It Fl w
  Pause
  .Ar wait
 


More information about the freebsd-bugs mailing list