Annotation of 41BSD/cmd/iostat.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)iostat.c    4.2 (Berkeley) 10/19/80";
        !             2: /*
        !             3:  * iostat
        !             4:  */
        !             5: #include <nlist.h>
        !             6: #include <sys/dk.h>
        !             7: 
        !             8: struct nlist nl[] = {
        !             9:        { "_dk_busy" },
        !            10: #define        X_DK_BUSY       0
        !            11:        { "_dk_time" },
        !            12: #define        X_DK_TIME       1
        !            13:        { "_dk_xfer" },
        !            14: #define        X_DK_XFER       2
        !            15:        { "_dk_wds" },
        !            16: #define        X_DK_WDS        3
        !            17:        { "_tk_nin" },
        !            18: #define        X_TK_NIN        4
        !            19:        { "_tk_nout" },
        !            20: #define        X_TK_NOUT       5
        !            21:        { "_dk_seek" },
        !            22: #define        X_DK_SEEK       6
        !            23:        { "_cp_time" },
        !            24: #define        X_CP_TIME       7
        !            25:        { "_dk_mspw" },
        !            26: #define        X_DK_MSPW       8
        !            27:        { 0 },
        !            28: };
        !            29: struct
        !            30: {
        !            31:        int     dk_busy;
        !            32:        long    cp_time[CPUSTATES];
        !            33:        long    dk_time[DK_NDRIVE];
        !            34:        long    dk_wds[DK_NDRIVE];
        !            35:        long    dk_seek[DK_NDRIVE];
        !            36:        long    dk_xfer[DK_NDRIVE];
        !            37:        float   dk_mspw[DK_NDRIVE];
        !            38:        long    tk_nin;
        !            39:        long    tk_nout;
        !            40: } s, s1;
        !            41: 
        !            42: int    mf;
        !            43: double etime;
        !            44: 
        !            45: main(argc, argv)
        !            46: char *argv[];
        !            47: {
        !            48:        extern char *ctime();
        !            49:        register  i;
        !            50:        int iter;
        !            51:        double f1, f2;
        !            52:        long t;
        !            53:        int tohdr = 1;
        !            54: 
        !            55:        nlist("/vmunix", nl);
        !            56:        if(nl[X_DK_BUSY].n_type == 0) {
        !            57:                printf("dk_busy not found in /vmunix namelist\n");
        !            58:                exit(1);
        !            59:        }
        !            60:        mf = open("/dev/kmem", 0);
        !            61:        if(mf < 0) {
        !            62:                printf("cannot open /dev/kmem\n");
        !            63:                exit(1);
        !            64:        }
        !            65:        iter = 0;
        !            66:        while (argc>1&&argv[1][0]=='-') {
        !            67:                argc--;
        !            68:                argv++;
        !            69:        }
        !            70:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
        !            71:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
        !            72:        if(argc > 2)
        !            73:                iter = atoi(argv[2]);
        !            74: loop:
        !            75:        if (--tohdr == 0) {
        !            76:                printf("      TTY");
        !            77:                for (i = 0; i < DK_NDRIVE; i++)
        !            78:                        if (s.dk_mspw[i] != 0.0)
        !            79:                                printf("           D%d ", i);
        !            80:                printf("         CPU\n");
        !            81:                printf(" tin tout");
        !            82:                for (i = 0; i < DK_NDRIVE; i++)
        !            83:                        if (s.dk_mspw[i] != 0.0)
        !            84:                                printf(" sps tps msps ");
        !            85:                printf(" us ni sy id\n");
        !            86:                tohdr = 19;
        !            87:        }
        !            88:        lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
        !            89:        read(mf, &s.dk_busy, sizeof s.dk_busy);
        !            90:        lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
        !            91:        read(mf, s.dk_time, sizeof s.dk_time);
        !            92:        lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
        !            93:        read(mf, s.dk_xfer, sizeof s.dk_xfer);
        !            94:        lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
        !            95:        read(mf, s.dk_wds, sizeof s.dk_wds);
        !            96:        lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
        !            97:        read(mf, &s.tk_nin, sizeof s.tk_nin);
        !            98:        lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
        !            99:        read(mf, &s.tk_nout, sizeof s.tk_nout);
        !           100:        lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
        !           101:        read(mf, s.dk_seek, sizeof s.dk_seek);
        !           102:        lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
        !           103:        read(mf, s.cp_time, sizeof s.cp_time);
        !           104:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
        !           105:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
        !           106:        for (i = 0; i < DK_NDRIVE; i++) {
        !           107: #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
        !           108:                X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
        !           109:        }
        !           110:        t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
        !           111:        t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
        !           112:        etime = 0;
        !           113:        for(i=0; i<CPUSTATES; i++) {
        !           114:                X(cp_time);
        !           115:                etime += s.cp_time[i];
        !           116:        }
        !           117:        if (etime == 0.0)
        !           118:                etime = 1.0;
        !           119:        etime /= 60.0;
        !           120:        printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
        !           121:        for (i=0; i<DK_NDRIVE; i++)
        !           122:                if (s.dk_mspw[i] != 0.0)
        !           123:                        stats(i);
        !           124:        for (i=0; i<CPUSTATES; i++)
        !           125:                stat1(i);
        !           126:        printf("\n");
        !           127: contin:
        !           128:        --iter;
        !           129:        if(iter)
        !           130:        if(argc > 1) {
        !           131:                sleep(atoi(argv[1]));
        !           132:                goto loop;
        !           133:        }
        !           134: }
        !           135: 
        !           136: stats(dn)
        !           137: {
        !           138:        register i;
        !           139:        double atime, words, xtime, itime;
        !           140: 
        !           141:        if (s.dk_mspw[dn] == 0.0) {
        !           142:                printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
        !           143:                return;
        !           144:        }
        !           145:        atime = s.dk_time[dn];
        !           146:        atime /= 60.0;
        !           147:        words = s.dk_wds[dn]*32.0;      /* number of words transferred */
        !           148:        xtime = s.dk_mspw[dn]*words;    /* transfer time */
        !           149:        itime = atime - xtime;          /* time not transferring */
        !           150: /*
        !           151:        printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
        !           152:            dn, words, atime, xtime, itime);
        !           153: */
        !           154:        if (xtime < 0)
        !           155:                itime += xtime, xtime = 0;
        !           156:        if (itime < 0)
        !           157:                xtime += itime, itime = 0;
        !           158:        printf("%4.0f", s.dk_seek[dn]/etime);
        !           159:        printf("%4.0f", s.dk_xfer[dn]/etime);
        !           160:        printf("%5.1f ",
        !           161:            s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
        !           162: /*
        !           163:        printf("%4.1f",
        !           164:            s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
        !           165: */
        !           166: }
        !           167: 
        !           168: stat1(o)
        !           169: {
        !           170:        register i;
        !           171:        double time;
        !           172: 
        !           173:        time = 0;
        !           174:        for(i=0; i<CPUSTATES; i++)
        !           175:                time += s.cp_time[i];
        !           176:        if (time == 0.0)
        !           177:                time = 1.0;
        !           178:        printf("%3.0f", 100*s.cp_time[o]/time);
        !           179: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.