Home | History | Annotate | Line # | Download | only in Bin
      1 #!/usr/sbin/dtrace -s
      2 /*
      3  * vmstat-p.d - vmstat -p demo in DTrace.
      4  *              Written using DTrace (Solaris 10 3/05).
      5  *
      6  * This has been written to demonstrate fetching similar data as vmstat
      7  * from DTrace. This program is intended as a starting point for other
      8  * DTrace scripts, by beginning with familiar statistics.
      9  *
     10  * $Id: vmstat-p.d,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $
     11  *
     12  * USAGE:	vmstat-p.d
     13  *
     14  * FIELDS:
     15  *		swap	virtual memory free	Kbytes
     16  *		free	free RAM		Kbytes
     17  *		re	page reclaims		Kbytes
     18  *		mf	minor faults		Kbytes
     19  *		sr	scan rate		pages
     20  *		epi	executable page ins	Kbytes
     21  *		epo	executable page outs	Kbytes
     22  *		epf	executable frees	Kbytes
     23  *		api	anonymous page ins	Kbytes
     24  *		apo	anonymous page outs	Kbytes
     25  *		apf	anonymous frees		Kbytes
     26  *		fpi	filesystem page ins	Kbytes
     27  *		fpo	filesystem page outs	Kbytes
     28  *		fpf	filesystem frees	Kbytes
     29  *
     30  * NOTES:
     31  *	Most of the statistics are in units of kilobytes, unlike the
     32  *	original vmstat command which sometimes uses page counts.
     33  *	As this program does not use Kstat, there is no summary since
     34  *	boot line. Free RAM is both free free + cache free.
     35  *
     36  * SEE ALSO:	vmstat(1M)
     37  *
     38  * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
     39  *
     40  * CDDL HEADER START
     41  *
     42  *  The contents of this file are subject to the terms of the
     43  *  Common Development and Distribution License, Version 1.0 only
     44  *  (the "License").  You may not use this file except in compliance
     45  *  with the License.
     46  *
     47  *  You can obtain a copy of the license at Docs/cddl1.txt
     48  *  or http://www.opensolaris.org/os/licensing.
     49  *  See the License for the specific language governing permissions
     50  *  and limitations under the License.
     51  *
     52  * CDDL HEADER END
     53  *
     54  * 11-Jun-2005  Brendan Gregg   Created this.
     55  * 08-Jan-2006	   "      "	Last update.
     56  */
     57 
     58 #pragma D option quiet
     59 
     60 inline int SCREEN = 21;
     61 
     62 /*
     63  * Initialise variables
     64  */
     65 dtrace:::BEGIN
     66 {
     67 	pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0;
     68 	sy = 0; in = 0; cs = 0; maj = 0; cow = 0; pro = 0;
     69 	epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0;
     70 	fpi = 0; fpo = 0; fpf = 0;
     71 	lines = SCREEN + 1;
     72 }
     73 
     74 /*
     75  * Print header
     76  */
     77 dtrace:::BEGIN,
     78 tick-1sec
     79 /lines++ > SCREEN/
     80 {
     81 	printf("%14s %13s %16s %14s %13s\n",
     82 	    "memory", "page", "executable", "anonymous", "filesystem");
     83 	printf("%9s %7s %5s %4s %3s ",
     84 	    "swap", "free", "re", "mf", "sr");
     85 	printf("%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",
     86 	    "epi", "epo", "epf", "api", "apo", "apf", "fpi", "fpo", "fpf");
     87 	lines = 0;
     88 }
     89 
     90 /*
     91  * Probe events
     92  */
     93 vminfo:::pgrec	   { re += arg0; }
     94 vminfo:::scan	   { sr += arg0; }
     95 vminfo:::as_fault  { mf += arg0; }
     96 vminfo:::execpgin  { epi += arg0; }
     97 vminfo:::execpgout { epo += arg0; }
     98 vminfo:::execfree  { epf += arg0; }
     99 vminfo:::anonpgin  { api += arg0; }
    100 vminfo:::anonpgout { apo += arg0; }
    101 vminfo:::anonfree  { apf += arg0; }
    102 vminfo:::fspgin    { fpi += arg0; }
    103 vminfo:::fspgout   { fpo += arg0; }
    104 vminfo:::fsfree    { fpf += arg0; }
    105 
    106 /*
    107  * Print output line
    108  */
    109 profile:::tick-1sec
    110 {
    111 	/* fetch free mem */
    112 	this->free = `freemem;
    113 
    114 	/*
    115 	 * fetch free swap
    116 	 *
    117 	 * free swap is described in /usr/include/vm/anon.h as,
    118 	 * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree)
    119 	 */
    120 	this->ani_max = `k_anoninfo.ani_max;
    121 	this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv;
    122 	this->swap = (this->ani_max - this->ani_resv > 0 ?
    123 	    this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree;
    124 
    125 	/* fetch w */
    126 	this->w = `nswapped;
    127 
    128 	/* convert to Kbytes */
    129 	epi *= `_pagesize / 1024;
    130 	epo *= `_pagesize / 1024;
    131 	epf *= `_pagesize / 1024;
    132 	api *= `_pagesize / 1024;
    133 	apo *= `_pagesize / 1024;
    134 	apf *= `_pagesize / 1024;
    135 	fpi *= `_pagesize / 1024;
    136 	fpo *= `_pagesize / 1024;
    137 	fpf *= `_pagesize / 1024;
    138 	re  *= `_pagesize / 1024;
    139 	sr  *= `_pagesize / 1024;
    140 	mf  *= `_pagesize / 1024;
    141 	this->swap *= `_pagesize / 1024;
    142 	this->free *= `_pagesize / 1024;
    143 
    144 	/* print line */
    145 	printf("%9d %7d %5d %4d %3d ",
    146 	    this->swap, this->free, re, mf, sr);
    147 	printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d\n",
    148 	    epi, epo, epf, api, apo, apf, fpi, fpo, fpf);
    149 
    150 	/* clear counters */
    151 	pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0;
    152 	sy = 0; in = 0; cs = 0; maj = 0; cow = 0; pro = 0;
    153 	epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0;
    154 	fpi = 0; fpo = 0; fpf = 0;
    155 }
    156