?? vmstat.c
字號:
////////////////////////////////////////////////////////////////////////////static void diskformat(void){ FILE *fDiskstat; struct disk_stat *disks; struct partition_stat *partitions; unsigned long ndisks,i,j,k; const char format[]="%-5s %6u %6u %7llu %7u %6u %6u %7llu %7u %6u %6u\n"; if ((fDiskstat=fopen("/proc/diskstats", "rb"))){ fclose(fDiskstat); ndisks=getdiskstat(&disks,&partitions); for(k=0; k<ndisks; k++){ if (moreheaders && ((k%height)==0)) diskheader(); printf(format, disks[k].disk_name, disks[k].reads, disks[k].merged_reads, disks[k].reads_sectors, disks[k].milli_reading, disks[k].writes, disks[k].merged_writes, disks[k].written_sectors, disks[k].milli_writing, disks[k].inprogress_IO?disks[k].inprogress_IO/1000:0, disks[k].milli_spent_IO?disks[k].milli_spent_IO/1000:0/*, disks[i].weighted_milli_spent_IO/1000*/ ); fflush(stdout); } free(disks); free(partitions); for(j=1; j<num_updates; j++){ sleep(sleep_time); ndisks=getdiskstat(&disks,&partitions); for(i=0; i<ndisks; i++,k++){ if (moreheaders && ((k%height)==0)) diskheader(); printf(format, disks[i].disk_name, disks[i].reads, disks[i].merged_reads, disks[i].reads_sectors, disks[i].milli_reading, disks[i].writes, disks[i].merged_writes, disks[i].written_sectors, disks[i].milli_writing, disks[i].inprogress_IO?disks[i].inprogress_IO/1000:0, disks[i].milli_spent_IO?disks[i].milli_spent_IO/1000:0/*, disks[i].weighted_milli_spent_IO/1000*/ ); fflush(stdout); } free(disks); free(partitions); } }else{ fprintf(stderr, "Your kernel doesn't support diskstat (2.5.70 or above required)\n"); exit(0); } }////////////////////////////////////////////////////////////////////////////static void slabheader(void){ printf("%-24s %6s %6s %6s %6s\n","Cache","Num", "Total", "Size", "Pages");}////////////////////////////////////////////////////////////////////////////static void slabformat (void){ FILE *fSlab; struct slab_cache *slabs; unsigned long nSlab,i,j,k; const char format[]="%-24s %6u %6u %6u %6u\n"; fSlab=fopen("/proc/slabinfo", "rb"); if(!fSlab){ fprintf(stderr, "Your kernel doesn't support slabinfo.\n"); return; } nSlab = getslabinfo(&slabs); for(k=0; k<nSlab; k++){ if (moreheaders && ((k%height)==0)) slabheader(); printf(format, slabs[k].name, slabs[k].active_objs, slabs[k].num_objs, slabs[k].objsize, slabs[k].objperslab ); } free(slabs); for(j=1,k=1; j<num_updates; j++) { sleep(sleep_time); nSlab = getslabinfo(&slabs); for(i=0; i<nSlab; i++,k++){ if (moreheaders && ((k%height)==0)) slabheader(); printf(format, slabs[i].name, slabs[i].active_objs, slabs[i].num_objs, slabs[i].objsize, slabs[i].objperslab ); } }}////////////////////////////////////////////////////////////////////////////static void disksum_format(void) { FILE *fDiskstat; struct disk_stat *disks; struct partition_stat *partitions; int ndisks, i; unsigned long reads, merged_reads, read_sectors, milli_reading, writes, merged_writes, written_sectors, milli_writing, inprogress_IO, milli_spent_IO, weighted_milli_spent_IO; reads=merged_reads=read_sectors=milli_reading=writes=merged_writes= \ written_sectors=milli_writing=inprogress_IO=milli_spent_IO= \ weighted_milli_spent_IO=0; if ((fDiskstat=fopen("/proc/diskstats", "rb"))){ fclose(fDiskstat); ndisks=getdiskstat(&disks, &partitions); printf("%13d disks \n", ndisks); printf("%13d partitions \n", getpartitions_num(disks, ndisks)); for(i=0; i<ndisks; i++){ reads+=disks[i].reads; merged_reads+=disks[i].merged_reads; read_sectors+=disks[i].reads_sectors; milli_reading+=disks[i].milli_reading; writes+=disks[i].writes; merged_writes+=disks[i].merged_writes; written_sectors+=disks[i].written_sectors; milli_writing+=disks[i].milli_writing; inprogress_IO+=disks[i].inprogress_IO?disks[i].inprogress_IO/1000:0; milli_spent_IO+=disks[i].milli_spent_IO?disks[i].milli_spent_IO/1000:0; } printf("%13lu total reads\n",reads); printf("%13lu merged reads\n",merged_reads); printf("%13lu read sectors\n",read_sectors); printf("%13lu milli reading\n",milli_reading); printf("%13lu writes\n",writes); printf("%13lu merged writes\n",merged_writes); printf("%13lu written sectors\n",written_sectors); printf("%13lu milli writing\n",milli_writing); printf("%13lu inprogress IO\n",inprogress_IO); printf("%13lu milli spent IO\n",milli_spent_IO); free(disks); free(partitions); }}////////////////////////////////////////////////////////////////////////////static void sum_format(void) { unsigned int running, blocked, btime, processes; jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz; unsigned long pgpgin, pgpgout, pswpin, pswpout; unsigned int intr, ctxt; meminfo(); getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl, &cpu_iow, &cpu_xxx, &cpu_yyy, &cpu_zzz, &pgpgin, &pgpgout, &pswpin, &pswpout, &intr, &ctxt, &running, &blocked, &btime, &processes); printf("%13lu %s total memory\n", unitConvert(kb_main_total),szDataUnit); printf("%13lu %s used memory\n", unitConvert(kb_main_used),szDataUnit); printf("%13lu %s active memory\n", unitConvert(kb_active),szDataUnit); printf("%13lu %s inactive memory\n", unitConvert(kb_inactive),szDataUnit); printf("%13lu %s free memory\n", unitConvert(kb_main_free),szDataUnit); printf("%13lu %s buffer memory\n", unitConvert(kb_main_buffers),szDataUnit); printf("%13lu %s swap cache\n", unitConvert(kb_main_cached),szDataUnit); printf("%13lu %s total swap\n", unitConvert(kb_swap_total),szDataUnit); printf("%13lu %s used swap\n", unitConvert(kb_swap_used),szDataUnit); printf("%13lu %s free swap\n", unitConvert(kb_swap_free),szDataUnit); printf("%13Lu non-nice user cpu ticks\n", cpu_use); printf("%13Lu nice user cpu ticks\n", cpu_nic); printf("%13Lu system cpu ticks\n", cpu_sys); printf("%13Lu idle cpu ticks\n", cpu_idl); printf("%13Lu IO-wait cpu ticks\n", cpu_iow); printf("%13Lu IRQ cpu ticks\n", cpu_xxx); printf("%13Lu softirq cpu ticks\n", cpu_yyy); printf("%13Lu stolen cpu ticks\n", cpu_zzz); printf("%13lu pages paged in\n", pgpgin); printf("%13lu pages paged out\n", pgpgout); printf("%13lu pages swapped in\n", pswpin); printf("%13lu pages swapped out\n", pswpout); printf("%13u interrupts\n", intr); printf("%13u CPU context switches\n", ctxt); printf("%13u boot time\n", btime); printf("%13u forks\n", processes);}////////////////////////////////////////////////////////////////////////////static void fork_format(void) { unsigned int running, blocked, btime, processes; jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz; unsigned long pgpgin, pgpgout, pswpin, pswpout; unsigned int intr, ctxt; getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl, &cpu_iow, &cpu_xxx, &cpu_yyy, &cpu_zzz, &pgpgin, &pgpgout, &pswpin, &pswpout, &intr, &ctxt, &running, &blocked, &btime, &processes); printf("%13u forks\n", processes);}////////////////////////////////////////////////////////////////////////////static int winhi(void) { struct winsize win; int rows = 24; if (ioctl(1, TIOCGWINSZ, &win) != -1 && win.ws_row > 0) rows = win.ws_row; return rows;}////////////////////////////////////////////////////////////////////////////int main(int argc, char *argv[]) { char partition[16]; argc=0; /* redefined as number of integer arguments */ for (argv++;*argv;argv++) { if ('-' ==(**argv)) { switch (*(++(*argv))) { case 'V': display_version(); exit(0); case 'd': statMode |= DISKSTAT; break; case 'a': /* active/inactive mode */ a_option=1; break; case 'f': // FIXME: check for conflicting args fork_format(); exit(0); case 'm': statMode |= SLABSTAT; break; case 'D': statMode |= DISKSUMSTAT; break; case 'n': /* print only one header */ moreheaders=FALSE; break; case 'p': statMode |= PARTITIONSTAT; if (argv[1]){ char *cp = *++argv; if(!memcmp(cp,"/dev/",5)) cp += 5; snprintf(partition, sizeof partition, "%s", cp); }else{ fprintf(stderr, "-p requires an argument\n"); exit(EXIT_FAILURE); } break; case 'S': if (argv[1]){ ++argv; if (!strcmp(*argv, "k")) dataUnit=UNIT_k; else if (!strcmp(*argv, "K")) dataUnit=UNIT_K; else if (!strcmp(*argv, "m")) dataUnit=UNIT_m; else if (!strcmp(*argv, "M")) dataUnit=UNIT_M; else {fprintf(stderr, "-S requires k, K, m or M (default is kb)\n"); exit(EXIT_FAILURE); } strcpy(szDataUnit, *argv); }else {fprintf(stderr, "-S requires an argument\n"); exit(EXIT_FAILURE); } break; case 's': statMode |= VMSUMSTAT; break; default: /* no other aguments defined yet. */ usage(); } }else{ argc++; switch (argc) { case 1: if ((sleep_time = atoi(*argv)) == 0) usage(); num_updates = ULONG_MAX; break; case 2: num_updates = atol(*argv); break; default: usage(); } /* switch */ }} if (moreheaders) { int tmp=winhi()-3; height=((tmp>0)?tmp:22); } setlinebuf(stdout); switch(statMode){ case(VMSTAT): new_format(); break; case(VMSUMSTAT): sum_format(); break; case(DISKSTAT): diskformat(); break; case(PARTITIONSTAT): if(diskpartition_format(partition)==-1) printf("Partition was not found\n"); break; case(SLABSTAT): slabformat(); break; case(DISKSUMSTAT): disksum_format(); break; default: usage(); break; } return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -