1/*- 2 * Copyright (c) 1998 Andrzej Bialecki 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29#include <stdio.h> 30#include <sys/types.h> 31#include <sys/sysctl.h> 32#include <sys/vmmeter.h> 33#include <vm/vm_param.h> 34 35#define pgtok(a) ((a) * (u_int) pagesize >> 10) 36 37int 38vm_i() 39{ 40#define CNT 49 41 int cnt[CNT]; 42 char names[CNT*16]; 43 char *a, *namep[CNT*16]; 44 int i,len; 45 long long inttotal=0; 46 long uptime=1; 47 48 len=sizeof(cnt); 49 i = sysctlbyname("hw.intrcnt", &cnt, &len, NULL, 0); 50 if (i != 0) 51 return i ; 52 len=sizeof(names); 53 i = sysctlbyname("hw.intrnames", &names, &len, NULL, 0); 54 if (i != 0) 55 return i ; 56 57 for( i=0, a = names ; i < CNT && a < names+sizeof(names) ; ) { 58 namep[i++] = a++; 59 while (a < names+sizeof(names) && *a) 60 a++ ; 61 a++ ; /* skip \0 */ 62 } 63 printf("interrupt total rate\n"); 64 inttotal = 0; 65 for (i=0; i< CNT ; i++) 66 if (cnt[i] >0) { 67 printf("%-12s %20lu %10lu\n", namep[i], cnt[i], cnt[i]/uptime); 68 inttotal += cnt[i]; 69 } 70 printf("Total %20llu %10llu\n", inttotal, 71 inttotal / (u_int64_t) uptime); 72 return 0; 73} 74int 75main(int argc, char *argv[]) 76{ 77 int mib[2],i=0,len; 78 int pagesize, pagesize_len; 79 struct vmtotal v; 80 81 if (argc > 1 && !strcmp(argv[1], "-i")) { 82 if (vm_i()) 83 fprintf(stderr, "vm -i stats not available via sysctl\n"); 84 return 0 ; 85 } 86 pagesize_len = sizeof(int); 87 sysctlbyname("vm.stats.vm.v_page_size",&pagesize,&pagesize_len,NULL,0); 88 89 len=sizeof(struct vmtotal); 90 mib[0]=CTL_VM; 91 mib[1]=VM_METER; 92 for(;;) { 93 sysctl(mib,2,&v,&len,NULL,0); 94 if(i==0) { 95 printf(" procs kB virt mem real mem shared vm shared real free\n"); 96 printf(" r w l s tot act tot act tot act tot act\n"); 97 } 98 printf("%2hd%2hd%2hd%2hd",v.t_rq-1,v.t_dw+v.t_pw,v.t_sl,v.t_sw); 99 printf("%7d %7d %7d%7d", 100 pgtok(v.t_vm),pgtok(v.t_avm), 101 pgtok(v.t_rm),pgtok(v.t_arm)); 102 printf("%7d%7d%7d%7d%7d\n", 103 pgtok(v.t_vmshr),pgtok(v.t_avmshr), 104 pgtok(v.t_rmshr),pgtok(v.t_armshr), 105 pgtok(v.t_free)); 106 sleep(5); 107 i++; 108 if(i>22) i=0; 109 } 110 exit(0); 111 112} 113