FreeBSD Bugzilla – Attachment 150324 Details for
Bug 195460
[patch] systat to display zfs arc cache status/info
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
This one contains new file, zarc.c, properly
systat-zarc.diff (text/plain), 10.11 KB, created by
ota
on 2014-12-07 21:42:02 UTC
(
hide
)
Description:
This one contains new file, zarc.c, properly
Filename:
MIME Type:
Creator:
ota
Created:
2014-12-07 21:42:02 UTC
Size:
10.11 KB
patch
obsolete
>Index: Makefile >=================================================================== >--- Makefile (revision 274372) >+++ Makefile (working copy) >@@ -6,7 +6,7 @@ > PROG= systat > SRCS= cmds.c cmdtab.c devs.c fetch.c iostat.c keyboard.c main.c \ > netcmds.c netstat.c pigs.c swap.c icmp.c \ >- mode.c ip.c tcp.c \ >+ mode.c ip.c tcp.c zarc.c \ > vmstat.c convtbl.c ifcmds.c ifstat.c > > .if ${MK_INET6_SUPPORT} != "no" >Index: cmdtab.c >=================================================================== >--- cmdtab.c (revision 274372) >+++ cmdtab.c (working copy) >@@ -75,6 +75,9 @@ > { "ifstat", showifstat, fetchifstat, labelifstat, > initifstat, openifstat, closeifstat, cmdifstat, > 0, CF_LOADAV }, >+ { "zarc", showzarc, fetchzarc, labelzarc, >+ initzarc, openzarc, closezarc, 0, >+ resetzarc, CF_ZFSARC }, > { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0 } > }; > struct cmdtab *curcmd = &cmdtab[0]; >Index: extern.h >=================================================================== >--- extern.h (revision 274372) >+++ extern.h (working copy) >@@ -163,3 +163,14 @@ > void status(void); > void suspend(int); > char *sysctl_dynread(const char *, size_t *); >+ >+#define SYSTAT_CMD(name) \ >+ void close ## name(WINDOW *); \ >+ void fetch ## name(void); \ >+ int init ## name(void); \ >+ void label ## name(void); \ >+ WINDOW *open ## name(void); \ >+ void reset ## name(void); \ >+ void show ## name(void) >+ >+SYSTAT_CMD( zarc ); >Index: main.c >=================================================================== >--- main.c (revision 274372) >+++ main.c (working copy) >@@ -188,6 +188,11 @@ > "/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10"); > mvaddstr(1, 5, "Load Average"); > } >+ if (curcmd->c_flags & CF_ZFSARC) { >+ mvaddstr(0, 20, >+ " Total MFU MRU Anon Hdr L2Hdr Other"); >+ mvaddstr(1, 5, "ZFS ARC "); >+ } > (*curcmd->c_label)(); > #ifdef notdef > mvprintw(21, 25, "CPU usage on %s", hostname); >@@ -221,8 +226,33 @@ > if (j > 50) > wprintw(wload, " %4.1f", avenrun[0]); > } >+ if (curcmd->c_flags & CF_ZFSARC) { >+ uint64_t arc[7] = {}; >+ size_t size = sizeof(arc[0]); >+ if (sysctlbyname("kstat.zfs.misc.arcstats.size", >+ &arc[0], &size, NULL, 0) == 0 ) { >+ GETSYSCTL("vfs.zfs.mfu_size", arc[1]); >+ GETSYSCTL("vfs.zfs.mru_size", arc[2]); >+ GETSYSCTL("vfs.zfs.anon_size", arc[3]); >+ GETSYSCTL("kstat.zfs.misc.arcstats.hdr_size", arc[4]); >+ GETSYSCTL("kstat.zfs.misc.arcstats.l2_hdr_size", arc[5]); >+ GETSYSCTL("kstat.zfs.misc.arcstats.other_size", arc[6]); >+ wmove(wload, 0, 0); wclrtoeol(wload); >+ for (i = 0 ; i < sizeof(arc) / sizeof(arc[0]) ; i++) { >+ if (arc[i] > 10llu * 1024 * 1024 * 1024 ) { >+ wprintw(wload, "%7lluG", arc[i] >> 30); >+ } >+ else if (arc[i] > 10 * 1024 * 1024 ) { >+ wprintw(wload, "%7lluM", arc[i] >> 20); >+ } >+ else { >+ wprintw(wload, "%7lluK", arc[i] >> 10); >+ } >+ } >+ } >+ } > (*curcmd->c_refresh)(); >- if (curcmd->c_flags & CF_LOADAV) >+ if (curcmd->c_flags & (CF_LOADAV |CF_ZFSARC)) > wrefresh(wload); > wrefresh(wnd); > move(CMDLINE, col); >Index: systat.h >=================================================================== >--- systat.h (revision 274372) >+++ systat.h (working copy) >@@ -54,6 +54,7 @@ > > #define CF_INIT 0x1 /* been initialized */ > #define CF_LOADAV 0x2 /* display w/ load average */ >+#define CF_ZFSARC 0x4 /* display w/ ZFS cache usage */ > > #define TCP 0x1 > #define UDP 0x2 >Index: zarc.c >=================================================================== >--- zarc.c (revision 0) >+++ zarc.c (working copy) >@@ -0,0 +1,221 @@ >+/*- >+ * Copyright (c) 2014 >+ * The Regents of the University of California. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * 4. Neither the name of the University nor the names of its contributors >+ * may be used to endorse or promote products derived from this software >+ * without specific prior written permission. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND >+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE >+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE >+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL >+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS >+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) >+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT >+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY >+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF >+ * SUCH DAMAGE. >+ */ >+ >+#include <sys/cdefs.h> >+__FBSDID("$FreeBSD$"); >+ >+#include <sys/types.h> >+#include <sys/sysctl.h> >+ >+#include <string.h> >+ >+#include "systat.h" >+#include "extern.h" >+ >+struct zfield{ >+ uint64_t arcstats; >+ uint64_t arcstats_demand_data; >+ uint64_t arcstats_demand_metadata; >+ uint64_t arcstats_prefetch_data; >+ uint64_t arcstats_prefetch_metadata; >+ uint64_t zfetchstats; >+ uint64_t arcstats_l2; >+ uint64_t vdev_cache_stats; >+}; >+ >+static struct zarcstats { >+ struct zfield hits; >+ struct zfield misses; >+} curstat, initstat, oldstat; >+ >+static void >+getinfo(struct zarcstats *ls); >+ >+WINDOW * >+openzarc(void) >+{ >+ return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0)); >+} >+ >+void >+closezarc(WINDOW *w) >+{ >+ if (w == NULL) >+ return; >+ wclear(w); >+ wrefresh(w); >+ delwin(w); >+} >+ >+void >+labelzarc(void) >+{ >+ wmove(wnd, 0, 0); wclrtoeol(wnd); >+ mvwprintw(wnd, 0, 31+1, "%4.4s %7.7s %7.7s %12.12s %12.12s", >+ "rate", "hits", "misses", "total hits", "total misses"); >+#define L(row, str) mvwprintw(wnd, row, 5, str); \ >+ mvwprintw(wnd, row, 31, ":"); \ >+ mvwprintw(wnd, row, 31+4, "%%") >+ L(1, "arcstats"); >+ L(2, "arcstats.demand_data"); >+ L(3, "arcstats.demand_metadata"); >+ L(4, "arcstats.prefetch_data"); >+ L(5, "arcstats.prefetch_metadata"); >+ L(6, "zfetchstats"); >+ L(7, "arcstats.l2"); >+ L(8, "vdev_cache_stats"); >+#undef L >+} >+ >+static int calc(uint64_t hits, uint64_t misses) >+{ >+ if( hits ) >+ return 100 * hits / ( hits + misses ); >+ else >+ return 0; >+} >+ >+static void >+domode(struct zarcstats *delta, struct zarcstats *rate) >+{ >+#define DO(stat) \ >+ delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ >+ delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ >+ rate->hits.stat = calc(delta->hits.stat, delta->misses.stat) >+ DO(arcstats); >+ DO(arcstats_demand_data); >+ DO(arcstats_demand_metadata); >+ DO(arcstats_prefetch_data); >+ DO(arcstats_prefetch_metadata); >+ DO(zfetchstats); >+ DO(arcstats_l2); >+ DO(vdev_cache_stats); >+ DO(arcstats); >+ DO(arcstats_demand_data); >+ DO(arcstats_demand_metadata); >+ DO(arcstats_prefetch_data); >+ DO(arcstats_prefetch_metadata); >+ DO(zfetchstats); >+ DO(arcstats_l2); >+ DO(vdev_cache_stats); >+#undef DO >+} >+ >+void >+showzarc(void) >+{ >+ struct zarcstats delta, rate; >+ >+ memset(&delta, 0, sizeof delta); >+ memset(&rate, 0, sizeof rate); >+ >+ domode(&delta, &rate); >+ >+#define DO(stat, row, col, fmt) \ >+ mvwprintw(wnd, row, col, fmt, stat) >+#define R(row, stat) DO(rate.hits.stat, row, 31+1, "%3lu") >+#define H(row, stat) DO(delta.hits.stat, row, 31+1+5, "%7lu"); \ >+ DO(curstat.hits.stat, row, 31+1+5+8+8, "%12lu") >+#define M(row, stat) DO(delta.misses.stat, row, 31+1+5+8, "%7lu"); \ >+ DO(curstat.misses.stat, row, 31+1+5+8+8+13, "%12lu") >+#define E(row, stat) R(row, stat); H(row, stat); M(row, stat); >+ E(1, arcstats); >+ E(2, arcstats_demand_data); >+ E(3, arcstats_demand_metadata); >+ E(4, arcstats_prefetch_data); >+ E(5, arcstats_prefetch_metadata); >+ E(6, zfetchstats); >+ E(7, arcstats_l2); >+ E(8, vdev_cache_stats); >+#undef DO >+#undef E >+#undef M >+#undef H >+#undef R >+} >+ >+int >+initzarc(void) >+{ >+ getinfo(&initstat); >+ curstat = oldstat = initstat; >+ return 1; >+} >+ >+void >+resetzarc(void) >+{ >+ initzarc(); >+} >+ >+static void >+getinfo(struct zarcstats *ls) >+{ >+ size_t size = sizeof( ls->hits.arcstats ); >+ if ( sysctlbyname("kstat.zfs.misc.arcstats.hits", >+ &ls->hits.arcstats, &size, NULL, 0 ) != 0 ) >+ return; >+ GETSYSCTL("kstat.zfs.misc.arcstats.misses", >+ ls->misses.arcstats); >+ GETSYSCTL("kstat.zfs.misc.arcstats.demand_data_hits", >+ ls->hits.arcstats_demand_data); >+ GETSYSCTL("kstat.zfs.misc.arcstats.demand_data_misses", >+ ls->misses.arcstats_demand_data); >+ GETSYSCTL("kstat.zfs.misc.arcstats.demand_metadata_hits", >+ ls->hits.arcstats_demand_metadata); >+ GETSYSCTL("kstat.zfs.misc.arcstats.demand_metadata_misses", >+ ls->misses.arcstats_demand_metadata); >+ GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_data_hits", >+ ls->hits.arcstats_prefetch_data); >+ GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_data_misses", >+ ls->misses.arcstats_prefetch_data); >+ GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_metadata_hits", >+ ls->hits.arcstats_prefetch_metadata); >+ GETSYSCTL("kstat.zfs.misc.arcstats.prefetch_metadata_misses", >+ ls->misses.arcstats_prefetch_metadata); >+ GETSYSCTL("kstat.zfs.misc.zfetchstats.hits", >+ ls->hits.zfetchstats); >+ GETSYSCTL("kstat.zfs.misc.zfetchstats.misses", >+ ls->misses.zfetchstats); >+ GETSYSCTL("kstat.zfs.misc.arcstats.l2_hits", >+ ls->hits.arcstats_l2); >+ GETSYSCTL("kstat.zfs.misc.arcstats.l2_misses", >+ ls->misses.arcstats_l2); >+ GETSYSCTL("kstat.zfs.misc.vdev_cache_stats.hits", >+ ls->hits.vdev_cache_stats); >+ GETSYSCTL("kstat.zfs.misc.vdev_cache_stats.misses", >+ ls->misses.vdev_cache_stats); >+} >+ >+void >+fetchzarc(void) >+{ >+ oldstat = curstat; >+ getinfo(&curstat); >+} > >Property changes on: zarc.c >___________________________________________________________________ >Added: svn:mime-type >## -0,0 +1 ## >+text/plain >\ No newline at end of property >Added: svn:keywords >## -0,0 +1 ## >+FreeBSD=%H >\ No newline at end of property >Added: svn:eol-style >## -0,0 +1 ## >+native >\ No newline at end of property
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 195460
:
149947
| 150324