1 1.1 christos #!/usr/bin/sh 2 1.1 christos # 3 1.1 christos # xvmstat - extended vmstat demo in DTrace. 4 1.1 christos # Written using DTrace (Solaris 10 3/05). 5 1.1 christos # 6 1.1 christos # This has been written to demonstrate fetching similar data as vmstat 7 1.1 christos # from DTrace, with a few extra fields. 8 1.1 christos # 9 1.1 christos # $Id: xvmstat,v 1.1.1.1 2015/09/30 22:01:09 christos Exp $ 10 1.1 christos # 11 1.1 christos # USAGE: xvmstat [interval [count]] 12 1.1 christos # 13 1.1 christos # FIELDS: 14 1.1 christos # w swapped out LWPs number 15 1.1 christos # swap virtual memory free Mbytes 16 1.1 christos # free free RAM Mbytes 17 1.1 christos # re page reclaims pages/sec 18 1.1 christos # maj major faults pages/sec 19 1.1 christos # mf minor faults pages/sec 20 1.1 christos # cow copy-on-write faults pages/sec 21 1.1 christos # pro protection faults pages/sec 22 1.1 christos # sr scan rate pages/sec 23 1.1 christos # epi executable page ins pages/sec 24 1.1 christos # epo executable page outs pages/sec 25 1.1 christos # epf executable frees pages/sec 26 1.1 christos # api anonymous page ins pages/sec 27 1.1 christos # apo anonymous page outs pages/sec 28 1.1 christos # apf anonymous frees pages/sec 29 1.1 christos # fpi filesystem page ins pages/sec 30 1.1 christos # fpo filesystem page outs pages/sec 31 1.1 christos # fpf filesystem frees pages/sec 32 1.1 christos # 33 1.1 christos # NOTES: 34 1.1 christos # - Most of the statistics are in units of pages, unlike the 35 1.1 christos # original vmstat command which sometimes uses kilobytes. 36 1.1 christos # - As this program does not use Kstat, there is no summary since boot line. 37 1.1 christos # - Free RAM is both free free + cache free. 38 1.1 christos # 39 1.1 christos # SEE ALSO: vmstat(1M) 40 1.1 christos # 41 1.1 christos # COPYRIGHT: Copyright (c) 2005 Brendan Gregg. 42 1.1 christos # 43 1.1 christos # CDDL HEADER START 44 1.1 christos # 45 1.1 christos # The contents of this file are subject to the terms of the 46 1.1 christos # Common Development and Distribution License, Version 1.0 only 47 1.1 christos # (the "License"). You may not use this file except in compliance 48 1.1 christos # with the License. 49 1.1 christos # 50 1.1 christos # You can obtain a copy of the license at Docs/cddl1.txt 51 1.1 christos # or http://www.opensolaris.org/os/licensing. 52 1.1 christos # See the License for the specific language governing permissions 53 1.1 christos # and limitations under the License. 54 1.1 christos # 55 1.1 christos # CDDL HEADER END 56 1.1 christos # 57 1.1 christos # 12-Jun-2005 Brendan Gregg Created this. 58 1.1 christos # 01-Mar-2006 " " Last update. 59 1.1 christos # 60 1.1 christos 61 1.1 christos ############################## 62 1.1 christos # --- Process Arguments --- 63 1.1 christos # 64 1.1 christos 65 1.1 christos ### default values 66 1.1 christos interval=1; count=-1 67 1.1 christos 68 1.1 christos ### check arguments 69 1.1 christos if [ "$1" = "-h" -o "$1" = "--help" ]; then 70 1.1 christos cat <<-END >&2 71 1.1 christos USAGE: xvmstat [interval [count]] 72 1.1 christos xvmstat # 1 second samples, infinite 73 1.1 christos eg, 74 1.1 christos xvmstat 1 # print every 1 second 75 1.1 christos xvmstat 5 6 # print every 5 seconds, 6 times 76 1.1 christos END 77 1.1 christos exit 1 78 1.1 christos fi 79 1.1 christos 80 1.1 christos ### argument logic 81 1.1 christos if [ "$1" -gt 0 ]; then 82 1.1 christos interval=$1; count=-1; shift 83 1.1 christos fi 84 1.1 christos if [ "$1" -gt 0 ]; then 85 1.1 christos count=$1; shift 86 1.1 christos fi 87 1.1 christos if [ $interval -eq 0 ]; then 88 1.1 christos interval=1 89 1.1 christos fi 90 1.1 christos 91 1.1 christos 92 1.1 christos ################################# 93 1.1 christos # --- Main Program, DTrace --- 94 1.1 christos # 95 1.1 christos /usr/sbin/dtrace -n ' 96 1.1 christos #pragma D option quiet 97 1.1 christos 98 1.1 christos /* 99 1.1 christos * Command line arguments 100 1.1 christos */ 101 1.1 christos inline int INTERVAL = '$interval'; 102 1.1 christos inline int COUNTER = '$count'; 103 1.1 christos inline int SCREEN = 21; 104 1.1 christos 105 1.1 christos /* 106 1.1 christos * Initialise variables 107 1.1 christos */ 108 1.1 christos dtrace:::BEGIN 109 1.1 christos { 110 1.1 christos re = 0; sr = 0; mf = 0; maj = 0; cow = 0; pro = 0; 111 1.1 christos epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0; 112 1.1 christos fpi = 0; fpo = 0; fpf = 0; 113 1.1 christos lines = SCREEN + 1; 114 1.1 christos counts = COUNTER; 115 1.1 christos secs = INTERVAL; 116 1.1 christos first = 1; 117 1.1 christos } 118 1.1 christos 119 1.1 christos profile:::tick-1sec 120 1.1 christos { 121 1.1 christos secs--; 122 1.1 christos } 123 1.1 christos 124 1.1 christos /* 125 1.1 christos * Print header 126 1.1 christos */ 127 1.1 christos dtrace:::BEGIN, 128 1.1 christos profile:::tick-1sec 129 1.1 christos /first || (secs == 0 && lines > SCREEN)/ 130 1.1 christos { 131 1.1 christos printf("%2s %6s %5s %5s %3s %4s %3s %3s %3s ", 132 1.1 christos "w", "swap", "free", "re", "maj", "mf", "cow", "pro", "sr"); 133 1.1 christos printf("%3s %3s %3s %3s %3s %3s %3s %3s %3s\n", 134 1.1 christos "epi", "epo", "epf", "api", "apo", "apf", "fpi", "fpo", "fpf"); 135 1.1 christos lines = 0; 136 1.1 christos first = 0; 137 1.1 christos } 138 1.1 christos 139 1.1 christos /* 140 1.1 christos * Probe events 141 1.1 christos */ 142 1.1 christos vminfo:::pgrec { re += arg0; } 143 1.1 christos vminfo:::scan { sr += arg0; } 144 1.1 christos vminfo:::as_fault { mf += arg0; } 145 1.1 christos vminfo:::execpgin { epi += arg0; } 146 1.1 christos vminfo:::execpgout { epo += arg0; } 147 1.1 christos vminfo:::execfree { epf += arg0; } 148 1.1 christos vminfo:::anonpgin { api += arg0; } 149 1.1 christos vminfo:::anonpgout { apo += arg0; } 150 1.1 christos vminfo:::anonfree { apf += arg0; } 151 1.1 christos vminfo:::fspgin { fpi += arg0; } 152 1.1 christos vminfo:::fspgout { fpo += arg0; } 153 1.1 christos vminfo:::fsfree { fpf += arg0; } 154 1.1 christos vminfo:::maj_fault { maj += arg0; } 155 1.1 christos vminfo:::cow_fault { cow += arg0; } 156 1.1 christos vminfo:::prot_fault { pro += arg0; } 157 1.1 christos 158 1.1 christos /* 159 1.1 christos * Print output line 160 1.1 christos */ 161 1.1 christos profile:::tick-1sec 162 1.1 christos /secs == 0/ 163 1.1 christos { 164 1.1 christos /* fetch free mem */ 165 1.1 christos this->free = `freemem; 166 1.1 christos 167 1.1 christos /* 168 1.1 christos * fetch free swap 169 1.1 christos * 170 1.1 christos * free swap is described in /usr/include/vm/anon.h as, 171 1.1 christos * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree) 172 1.1 christos */ 173 1.1 christos this->ani_max = `k_anoninfo.ani_max; 174 1.1 christos this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv; 175 1.1 christos this->swap = (this->ani_max - this->ani_resv > 0 ? 176 1.1 christos this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree; 177 1.1 christos 178 1.1 christos /* fetch w */ 179 1.1 christos this->w = `nswapped; 180 1.1 christos 181 1.1 christos /* convert to Mbytes */ 182 1.1 christos this->swap *= `_pagesize; this->swap /= 1048576; 183 1.1 christos this->free *= `_pagesize; this->free /= 1048576; 184 1.1 christos 185 1.1 christos /* convert to per second values */ 186 1.1 christos re /= INTERVAL; maj /= INTERVAL; mf /= INTERVAL; 187 1.1 christos cow /= INTERVAL; pro /= INTERVAL; sr /= INTERVAL; 188 1.1 christos epi /= INTERVAL; epo /= INTERVAL; epf /= INTERVAL; 189 1.1 christos api /= INTERVAL; apo /= INTERVAL; apf /= INTERVAL; 190 1.1 christos fpi /= INTERVAL; fpo /= INTERVAL; fpf /= INTERVAL; 191 1.1 christos 192 1.1 christos /* print line */ 193 1.1 christos printf("%2d %6d %5d %5d %3d %4d %3d %3d %3d ", 194 1.1 christos this->w, this->swap, this->free, re, maj, mf, cow, pro, sr); 195 1.1 christos printf("%3d %3d %3d %3d %3d %3d %3d %3d %3d\n", 196 1.1 christos epi, epo, epf, api, apo, apf, fpi, fpo, fpf); 197 1.1 christos 198 1.1 christos /* clear counters */ 199 1.1 christos re = 0; sr = 0; mf = 0; maj = 0; cow = 0; pro = 0; 200 1.1 christos epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0; 201 1.1 christos fpi = 0; fpo = 0; fpf = 0; 202 1.1 christos 203 1.1 christos /* process counts */ 204 1.1 christos secs = INTERVAL; 205 1.1 christos counts--; 206 1.1 christos lines++; 207 1.1 christos } 208 1.1 christos 209 1.1 christos /* 210 1.1 christos * End 211 1.1 christos */ 212 1.1 christos profile:::tick-1sec 213 1.1 christos /counts == 0/ 214 1.1 christos { 215 1.1 christos exit(0); 216 1.1 christos } 217 1.1 christos ' 218