zarc.c revision 288306
1288306Smr/*- 2288306Smr * Copyright (c) 2014 3288306Smr * The Regents of the University of California. All rights reserved. 4288306Smr * 5288306Smr * Redistribution and use in source and binary forms, with or without 6288306Smr * modification, are permitted provided that the following conditions 7288306Smr * are met: 8288306Smr * 1. Redistributions of source code must retain the above copyright 9288306Smr * notice, this list of conditions and the following disclaimer. 10288306Smr * 2. Redistributions in binary form must reproduce the above copyright 11288306Smr * notice, this list of conditions and the following disclaimer in the 12288306Smr * documentation and/or other materials provided with the distribution. 13288306Smr * 4. Neither the name of the University nor the names of its contributors 14288306Smr * may be used to endorse or promote products derived from this software 15288306Smr * without specific prior written permission. 16288306Smr * 17288306Smr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18288306Smr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19288306Smr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20288306Smr * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21288306Smr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22288306Smr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23288306Smr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24288306Smr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25288306Smr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26288306Smr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27288306Smr * SUCH DAMAGE. 28288306Smr */ 29288306Smr 30288306Smr#include <sys/cdefs.h> 31288306Smr__FBSDID("$FreeBSD: head/usr.bin/systat/zarc.c 288306 2015-09-27 09:15:54Z mr $"); 32288306Smr 33288306Smr#include <sys/types.h> 34288306Smr#include <sys/sysctl.h> 35288306Smr 36288306Smr#include <string.h> 37288306Smr 38288306Smr#include "systat.h" 39288306Smr#include "extern.h" 40288306Smr 41288306Smrstruct zfield{ 42288306Smr uint64_t arcstats; 43288306Smr uint64_t arcstats_demand_data; 44288306Smr uint64_t arcstats_demand_metadata; 45288306Smr uint64_t arcstats_prefetch_data; 46288306Smr uint64_t arcstats_prefetch_metadata; 47288306Smr uint64_t zfetchstats; 48288306Smr uint64_t arcstats_l2; 49288306Smr uint64_t vdev_cache_stats; 50288306Smr}; 51288306Smr 52288306Smrstatic struct zarcstats { 53288306Smr struct zfield hits; 54288306Smr struct zfield misses; 55288306Smr} curstat, initstat, oldstat; 56288306Smr 57288306Smrstatic void 58288306Smrgetinfo(struct zarcstats *ls); 59288306Smr 60288306SmrWINDOW * 61288306Smropenzarc(void) 62288306Smr{ 63288306Smr return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0)); 64288306Smr} 65288306Smr 66288306Smrvoid 67288306Smrclosezarc(WINDOW *w) 68288306Smr{ 69288306Smr if (w == NULL) 70288306Smr return; 71288306Smr wclear(w); 72288306Smr wrefresh(w); 73288306Smr delwin(w); 74288306Smr} 75288306Smr 76288306Smrvoid 77288306Smrlabelzarc(void) 78288306Smr{ 79288306Smr wmove(wnd, 0, 0); wclrtoeol(wnd); 80288306Smr mvwprintw(wnd, 0, 31+1, "%4.4s %7.7s %7.7s %12.12s %12.12s", 81288306Smr "rate", "hits", "misses", "total hits", "total misses"); 82288306Smr#define L(row, str) mvwprintw(wnd, row, 5, str); \ 83288306Smr mvwprintw(wnd, row, 31, ":"); \ 84288306Smr mvwprintw(wnd, row, 31+4, "%%") 85288306Smr L(1, "arcstats"); 86288306Smr L(2, "arcstats.demand_data"); 87288306Smr L(3, "arcstats.demand_metadata"); 88288306Smr L(4, "arcstats.prefetch_data"); 89288306Smr L(5, "arcstats.prefetch_metadata"); 90288306Smr L(6, "zfetchstats"); 91288306Smr L(7, "arcstats.l2"); 92288306Smr L(8, "vdev_cache_stats"); 93288306Smr#undef L 94288306Smr} 95288306Smr 96288306Smrstatic int calc(uint64_t hits, uint64_t misses) 97288306Smr{ 98288306Smr if( hits ) 99288306Smr return 100 * hits / ( hits + misses ); 100288306Smr else 101288306Smr return 0; 102288306Smr} 103288306Smr 104288306Smrstatic void 105288306Smrdomode(struct zarcstats *delta, struct zarcstats *rate) 106288306Smr{ 107288306Smr#define DO(stat) \ 108288306Smr delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ 109288306Smr delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ 110288306Smr rate->hits.stat = calc(delta->hits.stat, delta->misses.stat) 111288306Smr DO(arcstats); 112288306Smr DO(arcstats_demand_data); 113288306Smr DO(arcstats_demand_metadata); 114288306Smr DO(arcstats_prefetch_data); 115288306Smr DO(arcstats_prefetch_metadata); 116288306Smr DO(zfetchstats); 117288306Smr DO(arcstats_l2); 118288306Smr DO(vdev_cache_stats); 119288306Smr DO(arcstats); 120288306Smr DO(arcstats_demand_data); 121288306Smr DO(arcstats_demand_metadata); 122288306Smr DO(arcstats_prefetch_data); 123288306Smr DO(arcstats_prefetch_metadata); 124288306Smr DO(zfetchstats); 125288306Smr DO(arcstats_l2); 126288306Smr DO(vdev_cache_stats); 127288306Smr#undef DO 128288306Smr} 129288306Smr 130288306Smrvoid 131288306Smrshowzarc(void) 132288306Smr{ 133288306Smr struct zarcstats delta, rate; 134288306Smr 135288306Smr memset(&delta, 0, sizeof delta); 136288306Smr memset(&rate, 0, sizeof rate); 137288306Smr 138288306Smr domode(&delta, &rate); 139288306Smr 140288306Smr#define DO(stat, row, col, fmt) \ 141288306Smr mvwprintw(wnd, row, col, fmt, stat) 142288306Smr#define R(row, stat) DO(rate.hits.stat, row, 31+1, "%3lu") 143288306Smr#define H(row, stat) DO(delta.hits.stat, row, 31+1+5, "%7lu"); \ 144288306Smr DO(curstat.hits.stat, row, 31+1+5+8+8, "%12lu") 145288306Smr#define M(row, stat) DO(delta.misses.stat, row, 31+1+5+8, "%7lu"); \ 146288306Smr DO(curstat.misses.stat, row, 31+1+5+8+8+13, "%12lu") 147288306Smr#define E(row, stat) R(row, stat); H(row, stat); M(row, stat); 148288306Smr E(1, arcstats); 149288306Smr E(2, arcstats_demand_data); 150288306Smr E(3, arcstats_demand_metadata); 151288306Smr E(4, arcstats_prefetch_data); 152288306Smr E(5, arcstats_prefetch_metadata); 153288306Smr E(6, zfetchstats); 154288306Smr E(7, arcstats_l2); 155288306Smr E(8, vdev_cache_stats); 156288306Smr#undef DO 157288306Smr#undef E 158288306Smr#undef M 159288306Smr#undef H 160288306Smr#undef R 161288306Smr} 162288306Smr 163288306Smrint 164288306Smrinitzarc(void) 165288306Smr{ 166288306Smr getinfo(&initstat); 167288306Smr curstat = oldstat = initstat; 168288306Smr return 1; 169288306Smr} 170288306Smr 171288306Smrvoid 172288306Smrresetzarc(void) 173288306Smr{ 174288306Smr initzarc(); 175288306Smr} 176288306Smr 177288306Smrstatic void 178288306Smrgetinfo(struct zarcstats *ls) 179288306Smr{ 180288306Smr size_t size = sizeof( ls->hits.arcstats ); 181288306Smr if ( sysctlbyname("kstat.zfs.misc.arcstats.hits", 182288306Smr &ls->hits.arcstats, &size, NULL, 0 ) != 0 ) 183288306Smr return; 184288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.misses", 185288306Smr ls->misses.arcstats); 186288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.demand_data_hits", 187288306Smr ls->hits.arcstats_demand_data); 188288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.demand_data_misses", 189288306Smr ls->misses.arcstats_demand_data); 190288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.demand_metadata_hits", 191288306Smr ls->hits.arcstats_demand_metadata); 192288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.demand_metadata_misses", 193288306Smr ls->misses.arcstats_demand_metadata); 194288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_data_hits", 195288306Smr ls->hits.arcstats_prefetch_data); 196288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_data_misses", 197288306Smr ls->misses.arcstats_prefetch_data); 198288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_metadata_hits", 199288306Smr ls->hits.arcstats_prefetch_metadata); 200288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_metadata_misses", 201288306Smr ls->misses.arcstats_prefetch_metadata); 202288306Smr GETSYSCTL("kstat.zfs.misc.zfetchstats.hits", 203288306Smr ls->hits.zfetchstats); 204288306Smr GETSYSCTL("kstat.zfs.misc.zfetchstats.misses", 205288306Smr ls->misses.zfetchstats); 206288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.l2_hits", 207288306Smr ls->hits.arcstats_l2); 208288306Smr GETSYSCTL("kstat.zfs.misc.arcstats.l2_misses", 209288306Smr ls->misses.arcstats_l2); 210288306Smr GETSYSCTL("kstat.zfs.misc.vdev_cache_stats.hits", 211288306Smr ls->hits.vdev_cache_stats); 212288306Smr GETSYSCTL("kstat.zfs.misc.vdev_cache_stats.misses", 213288306Smr ls->misses.vdev_cache_stats); 214288306Smr} 215288306Smr 216288306Smrvoid 217288306Smrfetchzarc(void) 218288306Smr{ 219288306Smr oldstat = curstat; 220288306Smr getinfo(&curstat); 221288306Smr} 222