systat: update vmstat & improve man page
authorThomas Nikolajsen <thomas@dragonflybsd.org>
Mon, 29 Mar 2010 23:28:19 +0000 (01:28 +0200)
committerSascha Wildner <saw@online.de>
Tue, 30 Mar 2010 20:37:45 +0000 (22:37 +0200)
 * vmstat display:
 *   change disk stat legend to use `/s' for (r)ead & (w)rite
 *   adjust `%slo-z' to show advertized value; was inverse
 *   rename `ofod' to `ozfod' to follow sysctl
 * man page:
 *   include legend for more fields: easier to follow & search
 *   include description for extended VM stat

usr.bin/systat/systat.1
usr.bin/systat/vmstat.c

index bb0e2d2..f79d79b 100644 (file)
@@ -53,7 +53,7 @@ using the curses screen display library,
 While
 .Nm
 is running the screen is usually divided into two windows (an exception
-is the vmstat display which uses the entire screen).
+is the vmstat and pvmmeter displays which uses the entire screen).
 The upper window depicts the current system load average.
 The information displayed in the lower window may vary, depending on
 user commands.
@@ -138,10 +138,7 @@ Print the names of the available displays on the command line.
 Print the load average over the past 1, 5, and 15 minutes on the command line.
 .It Ic stop
 Stop refreshing the screen.
-.It Xo
-.Op Ic start
-.Op Ar number
-.Xc
+.It Oo Ic start Oc Op Ar number
 Start (continue) refreshing the screen.
 If a second, numeric, argument is provided it is interpreted as a
 refresh interval (in seconds).
@@ -178,6 +175,7 @@ and
 The
 .Ic mode
 command is used to select one of four display modes, given as its argument:
+.Pp
 .Bl -tag -width absoluteXX -compact
 .It Ic rate
 Show the rate of change of each value in packets per second (the default).
@@ -200,7 +198,8 @@ command with no argument will display the current mode in the command line.
 .It Ic icmp6
 This display is like the
 .Ic icmp
-display, but displays statistics for IPv6 ICMP.
+display, but displays statistics for
+.Tn IPv6 ICMP .
 .It Ic ip
 Otherwise identical to the
 .Ic icmp
@@ -229,10 +228,10 @@ a per-interface basis.
 Display, in the lower window, statistics about processor use
 and disk throughput.
 Statistics on processor use appear as
-bar graphs of the amount of time executing in user mode (``user''),
-in user mode running low priority processes (``nice''), in
-system mode (``system''), in interrupt mode (``interrupt''),
-and idle (``idle'').
+bar graphs of the amount of time executing in user mode (`user'),
+in user mode running low priority processes (`nice'), in
+system mode (`system'), in interrupt mode (`interrupt'),
+and idle (`idle').
 Statistics on disk throughput show, for each drive, megabytes per second,
 average number of disk transactions per second, and
 average kilobytes of data per transaction.
@@ -286,17 +285,21 @@ etc.
 The upper left quadrant of the screen shows the number
 of users logged in and the load average over the last one, five,
 and fifteen minute intervals.
+.Pp
 Below this line are statistics on memory utilization.
-The first row of the table reports memory usage only among active processes,
+The first row (`Act') reports memory usage only among active processes,
 that is processes that have run in the previous twenty seconds.
-The second row reports on memory usage of all processes.
-The first column reports on the number of physical pages claimed by processes.
-The second column reports the number of physical pages that
-are devoted to read only text pages.
+The second row (`All') reports on memory usage of all processes.
+Two groups of columns are shown, `REAL' and `VIRTUAL'.
+The first column (`Tot') reports on the number of
+physical pages claimed by processes.
+The second column (`Share') reports the number of
+physical pages that are devoted to read only text pages.
 The third and fourth columns report the same two figures for
 virtual pages, that is the number of pages that would be
 needed if all processes had all of their pages.
-Finally the last column shows the number of physical pages on the free list.
+Finally the last column (`Free') shows the number of
+physical pages on the free list.
 .Pp
 Below the memory display is a list of the
 average number of processes (over the last refresh interval)
@@ -307,22 +310,28 @@ The row also shows the average number of context switches (`Csw'),
 traps (`Trp'; includes page faults), system calls (`Sys'), interrupts (`Int'),
 network software interrupts (`Sof'), and page faults (`Flt').
 .Pp
-Below the process queue length listing is a numerical listing and
-a bar graph showing the amount of
-system (shown as `='), interrupt (shown as `+'), user (shown as `>'),
-nice (shown as `-'), and idle time (shown as ` ').
+Below the process queue length listing is a listing of
+.Tn CPU
+usage, a numerical listing and a bar graph showing the amount of
+system (`='), interrupt (`+'), user (`>'), nice (`-'), and idle time (` ').
 .Pp
-Below the process display are statistics on name translations.
-It lists the number of names translated in the previous interval,
-the number and percentage of the translations that were
-handled by the system wide name translation cache, and
-the number and percentage of the translations that were
-handled by the per process name translation cache.
+Below the
+.Tn CPU
+usage display are statistics on name translations.
+It lists the number of path names translated
+in the previous interval (`Path-lookups'),
+the number and percentage of the path lookups that were
+handled by the name translation cache, and
+the average number of path components in path lookups (`Components').
 .Pp
 At the bottom left is the disk usage display.
 It reports the number of
-kilobytes per transaction, transactions per second, megabytes
-per second and the percentage of the time the disk was busy averaged
+kilobytes per transaction (`KB/t'),
+read transactions per second (`tpr/s'),
+megabytes per second in read transaction (`MBr/s'),
+write transactions per second (`tpw/s'),
+megabytes per second in write transaction (`MBw/s') and
+the percentage of the time the disk was busy (`% busy') averaged
 over the refresh period of the display (by default, five seconds).
 The system keeps statistics on most every storage device.
 In general, up to seven devices are displayed.
@@ -334,24 +343,31 @@ and
 .Xr devstat 9
 for details on the devstat system.
 .Pp
+If at most 4 disk devices are shown,
+extended virtual memory statistics are shown right to disk usage:
+pages zero filled on demand (`zfod'),
+pages optimized zero filled on demand (`ozfod'),
+slow (i.e.\& non-optimized) zero fills percentage (`%slo-z'),
+total pages freed (`tfree').
+.Pp
 Under the date in the upper right hand quadrant are statistics
 on paging and swapping activity.
-The first two columns report the average number of pages
+The first two columns (`VN PAGER') report the average number of pages
 brought in and out per second over the last refresh interval
 due to page faults and the paging daemon.
-The third and fourth columns report the average number of pages
+The third and fourth columns (`SWAP PAGER') report the average number of pages
 brought in and out per second over the last refresh interval
 due to swap requests initiated by the scheduler.
-The first row of the display shows the average
+The first row (`count') of the display shows the average
 number of disk transfers per second over the last refresh interval;
-the second row of the display shows the average
+the second row (`pages') of the display shows the average
 number of pages transferred per second over the last refresh interval.
 .Pp
 Below the paging statistics is a column of lines regarding the virtual
 memory system which list the average number of
+pages zero filled on demand (`zfod')
+(shown with extended virtual memory statistics if screen space permits),
 pages copied on write (`cow'),
-pages zero filled on demand (`zfod'),
-slow (on-the-fly) zero fills percentage (`%slo-z'),
 pages wired down (`wire'),
 active pages (`act'),
 inactive pages (`inact'),
@@ -376,9 +392,9 @@ and
 number of allocated vnodes that are free (`freevnodes').
 .Pp
 Running down the right hand side of the display is a breakdown
-of the interrupts being handled by the system.
+of the interrupts being handled by the system (`Interrupts').
 At the top of the list is the total interrupts per second
-over the time interval.
+over the time interval (`total').
 The rest of the column breaks down the total on a device by device basis.
 Only devices that have interrupted at least once since boot time are shown.
 .Pp
@@ -399,9 +415,16 @@ Toggle the display of fd devices in the disk usage display.
 Reset running statistics to zero.
 .El
 .It Ic pvmmeter
-Display per-CPU statistics, including LAPIC timer interrupts,
-IPI interrupts, CPU times (sys, user, idle), niceness, and
-interrupt rate in percent.
+Display per
+.Tn CPU
+statistics, including
+.Tn LAPIC
+timer interrupts (`timer'),
+.Tn IPIs
+(Inter-Processor Interrupts) (`ipi'),
+external interrupts (i.e.\& not timer or ipi) (`extint'), and
+.Tn CPU
+time breakdown (`user%', `nice%', `sys%', `intr%', and `idle%').
 .It Ic netstat
 Display, in the lower window, network connections.
 By default, network servers awaiting requests are not displayed.
@@ -489,10 +512,7 @@ Display only the specified drives.
 Multiple drives may be specified, separated by spaces.
 .It Ic drives
 Display a list of available devices.
-.It Ic match Xo
-.Ar type , Ns Ar if , Ns Ar pass
-.Op | Ar ...
-.Xc
+.It Ic match Ar type , Ns Ar if , Ns Ar pass Op | Ar ...
 Display devices matching the given pattern.
 The basic matching expressions are the same as those used in
 .Xr iostat 8
@@ -511,12 +531,18 @@ For example:
 .Pp
 .Dl match da,scsi | cd,ide
 .Pp
-This will display all SCSI Direct Access devices and all IDE CDROM devices.
+This will display all
+.Tn SCSI
+Direct Access devices and all
+.Tn IDE CDROM
+devices.
 .Pp
 .Dl match da | sa | cd,pass
 .Pp
 This will display all Direct Access devices, all Sequential Access devices,
-and all passthrough devices that provide access to CDROM drives.
+and all passthrough devices that provide access to
+.Tn CDROM
+drives.
 .El
 .Sh FILES
 .Bl -tag -width /etc/networks -compact
index 1a414a3..b5870d0 100644 (file)
@@ -226,22 +226,22 @@ initkre(void)
        if (nintr == 0) {
                if (sysctlbyname("hw.intrnames", NULL, &bytes, NULL, 0) == 0) {
                        intrnamebuf = malloc(bytes);
-                       sysctlbyname("hw.intrnames", intrnamebuf, &bytes, 
+                       sysctlbyname("hw.intrnames", intrnamebuf, &bytes,
                                        NULL, 0);
                        for (i = 0; i < bytes; ++i) {
-                           if (intrnamebuf[i] == 0)
-                               ++nintr;
+                               if (intrnamebuf[i] == 0)
+                                       ++nintr;
                        }
                        intrname = malloc(nintr * sizeof(char *));
                        intrloc = malloc(nintr * sizeof(*intrloc));
                        nintr = 0;
                        for (b = i = 0; i < bytes; ++i) {
-                           if (intrnamebuf[i] == 0) {
-                               intrname[nintr] = intrnamebuf + b;
-                               intrloc[nintr] = 0;
-                               b = i + 1;
-                               ++nintr;
-                           }
+                               if (intrnamebuf[i] == 0) {
+                                       intrname[nintr] = intrnamebuf + b;
+                                       intrloc[nintr] = 0;
+                                       b = i + 1;
+                                       ++nintr;
+                               }
                        }
                }
                nextintsrow = INTSROW + 2;
@@ -324,10 +324,10 @@ labelkre(void)
        mvprintw(NAMEIROW, NAMEICOL, "Path-lookups   hits   %%    Components");
        mvprintw(DISKROW, DISKCOL, "Disks");
        mvprintw(DISKROW + 1, DISKCOL, "KB/t");
-       mvprintw(DISKROW + 2, DISKCOL, "tps/r");
-       mvprintw(DISKROW + 3, DISKCOL, "MBs/r");
-       mvprintw(DISKROW + 4, DISKCOL, "tps/w");
-       mvprintw(DISKROW + 5, DISKCOL, "MBs/w");
+       mvprintw(DISKROW + 2, DISKCOL, "tpr/s");
+       mvprintw(DISKROW + 3, DISKCOL, "MBr/s");
+       mvprintw(DISKROW + 4, DISKCOL, "tpw/s");
+       mvprintw(DISKROW + 5, DISKCOL, "MBw/s");
        mvprintw(DISKROW + 6, DISKCOL, "%% busy");
        /*
         * For now, we don't support a fourth disk statistic.  So there's
@@ -350,7 +350,7 @@ labelkre(void)
                 * room for extended VM stats
                 */
                mvprintw(VMSTATROW + 11, VMSTATCOL - 6, "zfod");
-               mvprintw(VMSTATROW + 12, VMSTATCOL - 6, "ofod");
+               mvprintw(VMSTATROW + 12, VMSTATCOL - 6, "ozfod");
                mvprintw(VMSTATROW + 13, VMSTATCOL - 6, "%%slo-z");
                mvprintw(VMSTATROW + 14, VMSTATCOL - 6, "tfree");
                extended_vm_stats = 1;
@@ -517,19 +517,13 @@ showkre(void)
        PUTRATE(Vmm.v_intrans, VMSTATROW + 12, VMSTATCOL, 9);
 
        if (extended_vm_stats) {
-           PUTRATE(Vmm.v_zfod, VMSTATROW + 11, VMSTATCOL - 16, 9);
-           PUTRATE(Vmm.v_ozfod, VMSTATROW + 12, VMSTATCOL - 16, 9);
-           putint(
-               ((s.Vmm.v_ozfod < s.Vmm.v_zfod) ?
-                   s.Vmm.v_ozfod * 100 / s.Vmm.v_zfod : 
-                   0
-               ),
-               VMSTATROW + 13, 
-               VMSTATCOL - 16,
-               9,
-               'D'
-           );
-           PUTRATE(Vmm.v_tfree, VMSTATROW + 14, VMSTATCOL - 16, 9);
+               PUTRATE(Vmm.v_zfod, VMSTATROW + 11, VMSTATCOL - 16, 9);
+               PUTRATE(Vmm.v_ozfod, VMSTATROW + 12, VMSTATCOL - 16, 9);
+#define nz(x)  ((x) ? (x) : 1)
+               putint((s.Vmm.v_zfod - s.Vmm.v_ozfod) * 100 / nz(s.Vmm.v_zfod),
+                   VMSTATROW + 13, VMSTATCOL - 16, 9, 'D');
+#undef nz
+               PUTRATE(Vmm.v_tfree, VMSTATROW + 14, VMSTATCOL - 16, 9);
        }
 
        putint(s.bufspace/1024, VMSTATROW + 13, VMSTATCOL, 9, 'K');
@@ -576,10 +570,10 @@ showkre(void)
 
        putint(nchtotal.ncs_longhits, NAMEIROW + 1, NAMEICOL + 12, 7, 'D');
        putfloat(nchtotal.ncs_longhits * 100.0 / nz(s.nchpathcount),
-          NAMEIROW + 1, NAMEICOL + 19, 4, 0, 0);
+           NAMEIROW + 1, NAMEICOL + 19, 4, 0, 0);
 
        putfloat((double)s.nchcount / nz(s.nchpathcount),
-               NAMEIROW + 1, NAMEICOL + 27, 5, 2, 1);
+           NAMEIROW + 1, NAMEICOL + 27, 5, 2, 1);
 #undef nz
 }
 
@@ -799,7 +793,7 @@ getinfo(struct Info *ls)
                error("Can't get kernel info: %s\n", strerror(errno));
                bzero(&ls->Total, sizeof(ls->Total));
        }
-       
+
        if ((nch_tmp = malloc(nch_size)) == NULL) {
                perror("malloc");
                exit(1);