I'm pleased to sponsor the following fast-track for Chad Mynhier. Chad is enhancing some of the various "stat" commands to support a time stamp option in keeping with a similar option provided by iostat(1m). This case also defines a uniform specification for this option which future cases can reference in order to add timestamp options to other "stat" commands.
For those who use the *stat commands to do monitoring over long periods of time, this will be a welcome addition. Please ensure that you CC Chad on all correspondance. -dp --------------------------------------------------------------------------- Time stamp option for xxstat commands Chad Mynhier <cmynhier at gmail.com> SUMMARY This fast-track enhances the mpstat(1M), vmstat(1M), and prstat(1M) commands to address an existing RFE[1] requesting an option for each of these commands to emit a time stamp. In addition, this fast-track enhances the existing time stamp functionality in iostat(1M) to print a locale-specific time stamp, if the standard date format is requested. This fast-track also sets a precedent that all "*stat" commands that print statistics at a regular interval should implement a timestamp feature similar to the one described here. DETAILS Overview Currently, the iostat(1M) and fsstat(1M) commands provide an option to print a time stamp in either standard date format or traditional Unix time for each set of data. For example: # iostat -T d 1 Sat Jan 24 12:34:34 2009 tty sd0 sd1 sd2 cpu tin tout kps tps serv kps tps serv kps tps serv us sy wt id 0 8 39 1 24 39 1 22 0 0 0 1 1 0 98 Sat Jan 24 12:34:35 2009 0 220 0 0 0 0 0 0 0 0 0 0 1 0 99 Sat Jan 24 12:34:36 2009 0 92 0 0 0 0 0 0 0 0 0 0 1 0 99 ^C# # # fsstat -T u tmpfs 1 new name name attr attr lookup rddir read read write write file remov chng get set ops ops ops bytes ops bytes 2.57M 1.63M 25.9K 36.3M 70.8K 26.1M 4.67K 118M 464G 65.8M 253G tmpfs 1232818548 0 0 0 0 0 0 0 0 0 0 0 tmpfs 1232818549 0 0 0 0 0 0 0 0 0 0 0 tmpfs 1232818550 0 0 0 0 0 0 0 0 0 0 0 tmpfs ^C# The mpstat(1M), vmstat(1M), and prstat(1M) commands do not provide such an option. This option is useful when gathering data to correlate with a transient system or application problem whose time is known after the fact. While this problem can be worked around by wrapping the command in a script that adds a time stamp to the output, it would be better to provide consistency with iostat(1M) and fsstat(1M). Additionally, the time stamp currently emitted by iostat(1M) is printed unconditionally in the format specified by the C locale. For example: # locale LANG= LC_CTYPE="C" LC_NUMERIC="C" LC_TIME=fr LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGES="C" LC_ALL= # iostat -T d 3 Mon Jan 26 12:03:42 2009 tty sd0 sd1 sd2 cpu tin tout kps tps serv kps tps serv kps tps serv us sy wt id 0 8 43 1 24 43 1 22 0 0 0 1 1 0 98 Mon Jan 26 12:03:45 2009 0 73 0 0 0 0 0 0 0 0 0 0 0 0 99 ^C# We plan to address these issues as follows: 1. We will add the "[-T d | u]" option to vmstat(1M) and mpstat(1M) to mirror that option in iostat(1M) and fsstat(1M). 2. We will add the the "[-d d | u]" option to prstat(1M) to print a time stamp. 3. We will modify iostat(1M) to print the time stamp in a locale-specific format (i.e., printing local time using strftime(3C) with the correct format string for the locale.) There are two possible options for the placement of the time stamp in the output. The first option is to emit the time stamp on a separate line prior to each set of data. The second option is to print the time stamp as an additional column in the output. We choose the first option for two reasons. The first of these is that there is a precedent in how iostat(1M) and fsstat(1M) output the time stamp, as shown above. The second is that the time stamp would consume a large number of columns, and these utilities are designed (for the most part) to fit in 80 columns. Because the output of mpstat(1M) and prstat(1M) typically includes multiple rows, we also have the option of printing one time stamp per row. We choose instead to print one time stamp per sampling period. This follows the precedent set by iostat(1M), and it allows the most data to be printed on a single screen. Note that this also applies to those modes of prstat(1M) that involve printing two separate sets of data, such as per-process and per-zone statistics. Only one time stamp is shown in these cases. It could be argued that the time stamp option only makes sense in conjunction with the "-c" option of prstat(1M), given that otherwise the time stamp is overwritten with each sample. For the sake of completeness, however, we propose implementing the time stamp option as an independent option that can be used in either mode. EXAMPLE This example shows mpstat(1M) output using a standard date format time stamp: # ./mpstat -T d 1 Sat Jan 24 13:14:59 2009 CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 201 0 77 2219 127 87 3 2 14 1 241 1 1 0 98 1 209 0 73 173 26 92 3 2 15 1 246 1 1 0 98 2 203 0 105 165 24 94 2 2 14 1 240 1 1 0 98 3 207 0 73 177 25 97 3 2 14 1 243 1 1 0 98 Sat Jan 24 13:15:00 2009 CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 18387 0 3246 10899 111 455 222 82 518 79 17262 71 29 0 0 1 24517 0 3635 8790 9 482 210 66 624 86 22727 63 37 0 0 2 20614 0 8964 7016 75 460 189 68 573 83 17889 61 39 0 0 3 23650 0 13319 5535 21 442 186 69 546 75 17211 64 36 0 0 Sat Jan 24 13:15:01 2009 CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 21763 0 4950 13096 130 491 187 89 521 46 15574 62 38 0 0 1 19702 0 12835 8601 48 478 219 86 482 76 16697 64 36 0 0 2 16842 0 11385 9045 62 396 195 69 418 62 14106 74 26 0 0 3 29149 0 8459 10058 18 538 216 85 665 103 24843 55 45 0 0 Sat Jan 24 13:15:02 2009 CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 27958 0 10245 21765 125 657 212 127 817 144 21165 46 52 0 3 1 26394 0 8131 20657 28 703 196 118 847 142 19734 45 52 0 3 2 26998 0 44518 8242 114 478 174 106 778 100 17544 38 61 0 1 3 16175 0 4904 20502 33 553 140 115 506 55 14710 54 38 0 8 ^C# This example shows vmstat(1M) output using a traditional Unix time stamp: # ./vmstat -T u 1 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr f0 s0 s1 s2 in sy cs us sy id 1232820946 0 0 0 3666444 2642924 59 824 0 0 0 0 4 0 1 1 -1 2735 974 370 1 1 98 1232820947 5 0 0 2521192 1540320 5071 92284 0 0 0 0 0 0 22 20 0 54794 83465 1661 63 37 0 1232820948 4 0 0 2495436 1511176 5642 87339 0 0 0 0 0 0 28 28 0 39021 59198 1570 67 33 0 1232820949 3 0 0 2525936 1545120 5767 81687 0 0 0 0 0 0 20 20 0 31799 60757 1697 69 31 0 ^C# This example shows prstat(1M) output using a standard date format time stamp (with the -c option): # amd64/prstat -c -d d -n 5 1 Sat Jan 24 13:17:42 2009 PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 6920 mynhier 5760K 4664K sleep 0 4 0:00:00 0.5% dmake/1 13928 mynhier 25M 24M sleep 0 4 0:00:00 0.3% dmake/1 9229 mynhier 21M 17M cpu3 0 4 0:00:00 0.3% dmake/1 1504 noaccess 101M 76M sleep 59 0 0:43:09 0.0% java/18 9315 root 3772K 2568K cpu1 39 0 0:00:00 0.0% prstat/1 Total: 95 processes, 256 lwps, load averages: 6.93, 4.99, 2.46 Sat Jan 24 13:17:43 2009 PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 6920 mynhier 5840K 4748K sleep 0 4 0:00:00 0.5% dmake/1 9229 mynhier 22M 21M sleep 38 4 0:00:00 0.4% dmake/1 9528 mynhier 15M 12M run 0 4 0:00:00 0.4% acomp/1 9430 mynhier 10M 9628K sleep 0 4 0:00:00 0.4% dmake/1 13928 mynhier 25M 24M sleep 38 4 0:00:00 0.3% dmake/1 Total: 114 processes, 274 lwps, load averages: 6.91, 4.99, 2.47 # This example shows a screenshot of the above command without the -c option. (There's little difference to be seen between the previous example and this one, but this one is included in order to explicitly show the placement of the time stamp in this mode.): Sat Jan 24 13:20:25 2009 PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 4992 mynhier 29M 26M cpu2 0 4 0:00:00 1.1% ube/1 537 mynhier 13M 12M sleep 39 4 0:00:01 1.1% dmake/1 5045 mynhier 45M 41M run 0 4 0:00:00 0.4% ube/1 5145 mynhier 21M 12M run 0 4 0:00:00 0.1% iropt/1 386 mynhier 30M 29M sleep 47 4 0:00:00 0.1% dmake/1 Total: 144 processes, 302 lwps, load averages: 6.76, 5.72, 3.17 This example shows iostat(1M) output using the French locale: # ./iostat -T d 3 lundi 26 janvier 2009 12 h 08 EST tty sd0 sd1 sd2 cpu tin tout kps tps serv kps tps serv kps tps serv us sy wt id 0 8 43 1 24 43 1 22 0 0 0 1 1 0 98 lundi 26 janvier 2009 12 h 08 EST 0 76 0 0 0 0 0 0 0 0 0 0 0 0 100 ^C# DOCUMENTATION This fast-track proposes adding the following text to the man pages for mpstat(1M), vmstat(1M), and prstat(1M), with the exception that the prstat(1M) shall be listed as "-d": -T u | d Emit a time stamp. Specify u for a printed representation of the internal representation of time. See time(2). Specify d for standard date format. See date(1). Additionally, the option should be added to the SYNOPSIS section of the man pages for each of these. (The iostat(1M) man page should be changed to read, "See date(1)." rather than "See ctime(3C)." to reflect the localization change.) REFERENCES [1] would like a timestamp option like iostat has added to mpstat, vmstat and prstat (http://bugs.opensolaris.org/view_bug.do?bug_id=4775687) --------------------------------------------------------------------------- -- Daniel Price, Solaris Kernel Engineering http://blogs.sun.com/dp