zarc.c revision 302408
1263409Smarcel/*- 2263409Smarcel * Copyright (c) 2014 3263409Smarcel * The Regents of the University of California. All rights reserved. 4263409Smarcel * 5263409Smarcel * Redistribution and use in source and binary forms, with or without 6263409Smarcel * modification, are permitted provided that the following conditions 7263409Smarcel * are met: 8263409Smarcel * 1. Redistributions of source code must retain the above copyright 9263409Smarcel * notice, this list of conditions and the following disclaimer. 10263409Smarcel * 2. Redistributions in binary form must reproduce the above copyright 11263409Smarcel * notice, this list of conditions and the following disclaimer in the 12263409Smarcel * documentation and/or other materials provided with the distribution. 13263409Smarcel * 4. Neither the name of the University nor the names of its contributors 14263409Smarcel * may be used to endorse or promote products derived from this software 15263409Smarcel * without specific prior written permission. 16263409Smarcel * 17263409Smarcel * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18263409Smarcel * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19263409Smarcel * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20263409Smarcel * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21263409Smarcel * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22263409Smarcel * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23263409Smarcel * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24263409Smarcel * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25263409Smarcel * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26263409Smarcel * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27263409Smarcel * SUCH DAMAGE. 28263409Smarcel */ 29263409Smarcel 30263409Smarcel#include <sys/cdefs.h> 31263409Smarcel__FBSDID("$FreeBSD: stable/11/usr.bin/systat/zarc.c 288306 2015-09-27 09:15:54Z mr $"); 32263656Smarcel 33263442Smarcel#include <sys/types.h> 34263409Smarcel#include <sys/sysctl.h> 35263656Smarcel 36263656Smarcel#include <string.h> 37263409Smarcel 38268161Smarcel#include "systat.h" 39263409Smarcel#include "extern.h" 40263409Smarcel 41263409Smarcelstruct zfield{ 42269177Smarcel uint64_t arcstats; 43269177Smarcel uint64_t arcstats_demand_data; 44269177Smarcel uint64_t arcstats_demand_metadata; 45268161Smarcel uint64_t arcstats_prefetch_data; 46268161Smarcel uint64_t arcstats_prefetch_metadata; 47268161Smarcel uint64_t zfetchstats; 48268161Smarcel uint64_t arcstats_l2; 49263409Smarcel uint64_t vdev_cache_stats; 50263656Smarcel}; 51268161Smarcel 52263656Smarcelstatic struct zarcstats { 53263656Smarcel struct zfield hits; 54263656Smarcel struct zfield misses; 55263656Smarcel} curstat, initstat, oldstat; 56263656Smarcel 57263487Smarcelstatic void 58263409Smarcelgetinfo(struct zarcstats *ls); 59263409Smarcel 60272030SmarcelWINDOW * 61272030Smarcelopenzarc(void) 62263409Smarcel{ 63263409Smarcel return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0)); 64272030Smarcel} 65272030Smarcel 66263409Smarcelvoid 67263409Smarcelclosezarc(WINDOW *w) 68263442Smarcel{ 69268161Smarcel if (w == NULL) 70263442Smarcel return; 71263656Smarcel wclear(w); 72263656Smarcel wrefresh(w); 73263656Smarcel delwin(w); 74263656Smarcel} 75263656Smarcel 76263656Smarcelvoid 77263656Smarcellabelzarc(void) 78263656Smarcel{ 79263656Smarcel wmove(wnd, 0, 0); wclrtoeol(wnd); 80263656Smarcel mvwprintw(wnd, 0, 31+1, "%4.4s %7.7s %7.7s %12.12s %12.12s", 81263656Smarcel "rate", "hits", "misses", "total hits", "total misses"); 82263656Smarcel#define L(row, str) mvwprintw(wnd, row, 5, str); \ 83263656Smarcel mvwprintw(wnd, row, 31, ":"); \ 84263656Smarcel mvwprintw(wnd, row, 31+4, "%%") 85263656Smarcel L(1, "arcstats"); 86263656Smarcel L(2, "arcstats.demand_data"); 87263656Smarcel L(3, "arcstats.demand_metadata"); 88263656Smarcel L(4, "arcstats.prefetch_data"); 89263656Smarcel L(5, "arcstats.prefetch_metadata"); 90263656Smarcel L(6, "zfetchstats"); 91268161Smarcel L(7, "arcstats.l2"); 92268161Smarcel L(8, "vdev_cache_stats"); 93263656Smarcel#undef L 94263656Smarcel} 95263656Smarcel 96263656Smarcelstatic int calc(uint64_t hits, uint64_t misses) 97263656Smarcel{ 98263656Smarcel if( hits ) 99263656Smarcel return 100 * hits / ( hits + misses ); 100268161Smarcel else 101268161Smarcel return 0; 102263656Smarcel} 103268161Smarcel 104268161Smarcelstatic void 105263656Smarceldomode(struct zarcstats *delta, struct zarcstats *rate) 106263656Smarcel{ 107268161Smarcel#define DO(stat) \ 108263656Smarcel delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ 109263656Smarcel delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ 110263442Smarcel rate->hits.stat = calc(delta->hits.stat, delta->misses.stat) 111263442Smarcel DO(arcstats); 112263409Smarcel DO(arcstats_demand_data); 113263409Smarcel DO(arcstats_demand_metadata); 114263409Smarcel DO(arcstats_prefetch_data); 115263409Smarcel DO(arcstats_prefetch_metadata); 116263440Smarcel DO(zfetchstats); 117263442Smarcel DO(arcstats_l2); 118263656Smarcel DO(vdev_cache_stats); 119263700Smarcel DO(arcstats); 120263700Smarcel DO(arcstats_demand_data); 121263409Smarcel DO(arcstats_demand_metadata); 122263409Smarcel DO(arcstats_prefetch_data); 123263409Smarcel DO(arcstats_prefetch_metadata); 124 DO(zfetchstats); 125 DO(arcstats_l2); 126 DO(vdev_cache_stats); 127#undef DO 128} 129 130void 131showzarc(void) 132{ 133 struct zarcstats delta, rate; 134 135 memset(&delta, 0, sizeof delta); 136 memset(&rate, 0, sizeof rate); 137 138 domode(&delta, &rate); 139 140#define DO(stat, row, col, fmt) \ 141 mvwprintw(wnd, row, col, fmt, stat) 142#define R(row, stat) DO(rate.hits.stat, row, 31+1, "%3lu") 143#define H(row, stat) DO(delta.hits.stat, row, 31+1+5, "%7lu"); \ 144 DO(curstat.hits.stat, row, 31+1+5+8+8, "%12lu") 145#define M(row, stat) DO(delta.misses.stat, row, 31+1+5+8, "%7lu"); \ 146 DO(curstat.misses.stat, row, 31+1+5+8+8+13, "%12lu") 147#define E(row, stat) R(row, stat); H(row, stat); M(row, stat); 148 E(1, arcstats); 149 E(2, arcstats_demand_data); 150 E(3, arcstats_demand_metadata); 151 E(4, arcstats_prefetch_data); 152 E(5, arcstats_prefetch_metadata); 153 E(6, zfetchstats); 154 E(7, arcstats_l2); 155 E(8, vdev_cache_stats); 156#undef DO 157#undef E 158#undef M 159#undef H 160#undef R 161} 162 163int 164initzarc(void) 165{ 166 getinfo(&initstat); 167 curstat = oldstat = initstat; 168 return 1; 169} 170 171void 172resetzarc(void) 173{ 174 initzarc(); 175} 176 177static void 178getinfo(struct zarcstats *ls) 179{ 180 size_t size = sizeof( ls->hits.arcstats ); 181 if ( sysctlbyname("kstat.zfs.misc.arcstats.hits", 182 &ls->hits.arcstats, &size, NULL, 0 ) != 0 ) 183 return; 184 GETSYSCTL("kstat.zfs.misc.arcstats.misses", 185 ls->misses.arcstats); 186 GETSYSCTL("kstat.zfs.misc.arcstats.demand_data_hits", 187 ls->hits.arcstats_demand_data); 188 GETSYSCTL("kstat.zfs.misc.arcstats.demand_data_misses", 189 ls->misses.arcstats_demand_data); 190 GETSYSCTL("kstat.zfs.misc.arcstats.demand_metadata_hits", 191 ls->hits.arcstats_demand_metadata); 192 GETSYSCTL("kstat.zfs.misc.arcstats.demand_metadata_misses", 193 ls->misses.arcstats_demand_metadata); 194 GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_data_hits", 195 ls->hits.arcstats_prefetch_data); 196 GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_data_misses", 197 ls->misses.arcstats_prefetch_data); 198 GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_metadata_hits", 199 ls->hits.arcstats_prefetch_metadata); 200 GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_metadata_misses", 201 ls->misses.arcstats_prefetch_metadata); 202 GETSYSCTL("kstat.zfs.misc.zfetchstats.hits", 203 ls->hits.zfetchstats); 204 GETSYSCTL("kstat.zfs.misc.zfetchstats.misses", 205 ls->misses.zfetchstats); 206 GETSYSCTL("kstat.zfs.misc.arcstats.l2_hits", 207 ls->hits.arcstats_l2); 208 GETSYSCTL("kstat.zfs.misc.arcstats.l2_misses", 209 ls->misses.arcstats_l2); 210 GETSYSCTL("kstat.zfs.misc.vdev_cache_stats.hits", 211 ls->hits.vdev_cache_stats); 212 GETSYSCTL("kstat.zfs.misc.vdev_cache_stats.misses", 213 ls->misses.vdev_cache_stats); 214} 215 216void 217fetchzarc(void) 218{ 219 oldstat = curstat; 220 getinfo(&curstat); 221} 222