This is long and potentially boring.

However I will share my adventure which may reveal some of the working of
vmstat.

I was throwing some heavy load at my snv_134 server and watching "vmstat
5" run. I saw this sort of output :

 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr cd -- -- --   in   sy   cs us
sy id
 3 0 0 765028 56244 608 151  6  0  0  0  0 115 0  0  0  677 6018  392 70
29  2
 4 1 0 778740 56260 643 175 35  0  0  0  0 241 0  0  0  919 6639  541 73
27  0
 4 0 0 779056 56492 692 329 10  1  1  0  0 14  0  0  0  464 6896  444 73
27  0
 4 0 0 778784 56320 709 350  6 12 12  0  0 20  0  0  0  460 6649  363 73
27  0
 3 0 0 764988 56248 698 354  7  6  6  0  0 16  0  0  0  467 6845  410 73
27  0
 3 0 0 765068 56380 656 198  5  3  3  0  0  4  0  0  0  447 6672  399 76
24  0
 4 0 0 764960 56256 654 203  3  0  0  0  0 21  0  0  0  477 6764  448 71
29  0
 2 0 0 792428 56460 677 277  9  4  4  0  0 279 0  0  0 1009 8772  960 59
38  3
 4 0 0 779012 56556 543 277 21  1  1  0  0 38  0  0  0  505 6263  579 69
31  0
 3 0 0 765028 56324 707 284  7  0  0  0  0 57  0  0  0  528 7098  457 73
27  0
 4 0 0 778888 56488 792 287  7  6  6  0  0 10  0  0  0  447 7699  402 74
26  0
 3 0 0 778756 56400 680 284  6  0  0  0  0 10  0  0  0  449 6667  389 75
25  0
 3 0 0 779072 56608 404 279  6  0  0  0  0 102 0  0  0  667 4399  481 69
30  1
 4 0 0 765036 56248 278  35 56  1  1  0  0 217 0  0  0  992 4356  884 76
24  0
 5 0 0 778848 55800 671 330 325 0  0  0  0 65  0  0  0  592 7698  740 67
33  0
 6 1 0 776456 52040 347 1084 781 6 6  0  0 104 0  0  0  609 4536  735 61
39  0
 3 0 0 770644 45548 469 227  6  2  2  0  0 20  0  0  0  513 5370  553 75
25  0
 3 0 0 770364 45416 669 249  7  2  2  0  0 11  0  0  0  460 6909  419 74
26  0
 3 0 0 756460 45292 621  97  2  2  2  0  0 82  0  0  0  615 6473  444 71
29  0

Let me repaste that with the double spaces squeezed out :

kthr   memory      page      disk     faults   cpu
r b w  swap free re mf pi po fr de sr cd -- -- --  in  sy  cs us sy id
3 0 0 765028 56244 608 151 6 0 0 0 0 115 0 0 0 677 6018 392 70 29 2
4 1 0 778740 56260 643 175 35 0 0 0 0 241 0 0 0 919 6639 541 73 27 0
4 0 0 779056 56492 692 329 10 1 1 0 0 14 0 0 0 464 6896 444 73 27 0
4 0 0 778784 56320 709 350 6 12 12 0 0 20 0 0 0 460 6649 363 73 27 0
3 0 0 764988 56248 698 354 7 6 6 0 0 16 0 0 0 467 6845 410 73 27 0
3 0 0 765068 56380 656 198 5 3 3 0 0 4 0 0 0 447 6672 399 76 24 0
4 0 0 764960 56256 654 203 3 0 0 0 0 21 0 0 0 477 6764 448 71 29 0
2 0 0 792428 56460 677 277 9 4 4 0 0 279 0 0 0 1009 8772 960 59 38 3
4 0 0 779012 56556 543 277 21 1 1 0 0 38 0 0 0 505 6263 579 69 31 0
3 0 0 765028 56324 707 284 7 0 0 0 0 57 0 0 0 528 7098 457 73 27 0
4 0 0 778888 56488 792 287 7 6 6 0 0 10 0 0 0 447 7699 402 74 26 0
3 0 0 778756 56400 680 284 6 0 0 0 0 10 0 0 0 449 6667 389 75 25 0
3 0 0 779072 56608 404 279 6 0 0 0 0 102 0 0 0 667 4399 481 69 30 1
4 0 0 765036 56248 278 35 56 1 1 0 0 217 0 0 0 992 4356 884 76 24 0
5 0 0 778848 55800 671 330 325 0 0 0 0 65 0 0 0 592 7698 740 67 33 0
6 1 0 776456 52040 347 1084 781 6 6 0 0 104 0 0 0 609 4536 735 61 39 0
3 0 0 770644 45548 469 227 6 2 2 0 0 20 0 0 0 513 5370 553 75 25 0
3 0 0 770364 45416 669 249 7 2 2 0 0 11 0 0 0 460 6909 419 74 26 0
3 0 0 756460 45292 621 97 2 2 2 0 0 82 0 0 0 615 6473 444 71 29 0

So we agree that the machine is busy. That is fine.

What is very odd is that I see under the "disk" columns this :

   disk
 cd -- -- --
 115 0  0  0
 241 0  0  0
 14  0  0  0
 20  0  0  0
 16  0  0  0
  4  0  0  0
 21  0  0  0
 279 0  0  0
 38  0  0  0
 57  0  0  0
 10  0  0  0
 10  0  0  0
 102 0  0  0
 217 0  0  0
 65  0  0  0
 104 0  0  0
 20  0  0  0
 11  0  0  0
 82  0  0  0

The problem is that this machine does not have a cd or dvd. It says "cd"
there but I can not figure why.

I think that the issue is with the kstat data and not vmstat because in
usr/src/cmd/stat/vmstat/vmstat.c I see this :

static void
print_disk(void *v, void *v2, void *d)
{
        struct iodev_snapshot *iodev = (struct iodev_snapshot *)v2;

        if (iodev == NULL)
                return;

        (void) printf("%c%c ", iodev->is_name[0], iodev->is_name[2]);
}

The struct iodev_snapshot is in /usr/src/cmd/stat/common/statcommon.h thus

struct iodev_snapshot {
        /* original kstat name */
        char is_name[KSTAT_STRLEN];
        /* type of kstat */
        enum iodev_type is_type;
        /* ID if meaningful */
        struct iodev_id is_id;
        /* parent ID if meaningful */
        struct iodev_id is_parent_id;
        /* user-friendly name if found */
        char *is_pretty;
        /* device ID if applicable */
        char *is_devid;
        /* mount-point if applicable */
        char *is_dname;
        /* number of direct children */
        int is_nr_children;
        /* children of this I/O device */
        struct iodev_snapshot *is_children;
        /* standard I/O stats */
        kstat_io_t is_stats;
        /* iodev error stats */
        kstat_t is_errors;
        /* creation time of the stats */
        hrtime_t is_crtime;
        /* time at which iodev snapshot was taken */
        hrtime_t is_snaptime;
        /* kstat module */
        char is_module[KSTAT_STRLEN];
        /* kstat instance */
        int is_instance;
        /* kstat (only used temporarily) */
        kstat_t *is_ksp;
        struct iodev_snapshot *is_prev;
        struct iodev_snapshot *is_next;
        /* AVL structures to speedup insertion */
        avl_tree_t *avl_list;   /* list this element belongs to */
        avl_node_t avl_link;
};

It looks like vmstat is just printing out data from the char is_name[] and
that is where "cd" is coming from.

I compiled my own vmstat with full symbols and debug data in it :

$ ls -l *.o vmstat
-rw-r--r--   1 dclarke  csw        27852 Mar  7 02:59 acquire.o
-rw-r--r--   1 dclarke  csw        41856 Mar  7 02:59 acquire_iodevs.o
-rw-r--r--   1 dclarke  csw         7088 Mar  7 02:59 common.o
-rw-r--r--   1 dclarke  csw        29348 Mar  7 02:59 dsr.o
-rw-r--r--   1 dclarke  csw        10864 Mar  7 02:59 mnt.o
-rw-r--r--   1 dclarke  csw         4844 Mar  7 02:59 timestamp.o
-rwxr-xr-x   1 dclarke  csw       165492 Mar  7 02:59 vmstat
-rw-r--r--   1 dclarke  csw        46872 Mar  7 02:59 vmstat.o
-rw-r--r--   1 dclarke  csw        21856 Mar  7 02:59 walkers.o

I then stuffed this in :

static void
print_disk(void *v, void *v2, void *d)
{
        struct iodev_snapshot *iodev = (struct iodev_snapshot *)v2;

        if (iodev == NULL)
                return;

        (void) printf("%c%c ", iodev->is_name[0], iodev->is_name[2]);

        /* very hacky but this should work */
        (void) fprintf ( stderr, "\n%s\n", iodev->is_name );

}

recompile and run and le voilĂ  :

$ ./vmstat 5
 kthr      memory            page            disk          faults      cpu

cmdk0
 r b w   swap  free  re  mf pi po fr de sr cd -- -- --   in   sy   cs us
sy id
 0 0 0 918908 128920 21  30  7  3  3  0  1  5  0  0  0  627  909  520 28
12 60
 0 0 0 852296 74920   3   7  0  0  0  0  0  0  0  0  0  628  725  469 22 
8 71
 0 0 0 852296 75444   0   0  0  0  0  0  0  0  0  0  0  638  698  471 21 
8 72

I guess I could have found that out with iostat :

$ iostat -xtc 5
                 extended device statistics                    tty        
cpu
device    r/s    w/s   kr/s   kw/s wait actv  svc_t  %w  %b  tin tout  us
sy wt id
cmdk0     1.1    3.7    7.5   24.7  0.0  0.0   12.5   0   1    1   89  28
12  0 60
                 extended device statistics                    tty        
cpu
device    r/s    w/s   kr/s   kw/s wait actv  svc_t  %w  %b  tin tout  us
sy wt id
cmdk0     0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0    0   65  21 
8  0 71

So why does vmstat use, for totally obscure reasons, char[0] and char[2]
of iodev->is_name and not something else ?

Also .. just a note, the libavl symlinks are missing in /usr/lib and I had
to mess around a bit to compile vmstat.

Also some headers are missing on snv_134 and I have to go into the
onnv-gate to get these :

#include <sys/scsi/adapters/mpapi_impl.h>
#include <sys/scsi/adapters/mpapi_scsi_vhci.h>

So anyways .. why iodev->is_name[0] and iodev->is_name[2] which looks a
lot like "cd" on a machine with no CD/DVD ??

-- 
Dennis Clarke
dcla...@opensolaris.ca  <- Email related to the open source Solaris
dcla...@blastwave.org   <- Email related to open source for Solaris


_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to