Lines 1-5
Link Here
|
1 |
/*- |
1 |
/*- |
2 |
* Copyright (c) 2014 - 2017 Yoshihiro Ota |
2 |
* Copyright (c) 2014 - 2017, 2019 Yoshihiro Ota |
3 |
* |
3 |
* |
4 |
* Redistribution and use in source and binary forms, with or without |
4 |
* Redistribution and use in source and binary forms, with or without |
5 |
* modification, are permitted provided that the following conditions |
5 |
* modification, are permitted provided that the following conditions |
Lines 32-47
Link Here
|
32 |
#include <sys/types.h> |
32 |
#include <sys/types.h> |
33 |
#include <sys/sysctl.h> |
33 |
#include <sys/sysctl.h> |
34 |
|
34 |
|
35 |
/* #include <stdlib.h> */ |
|
|
36 |
#include <inttypes.h> |
35 |
#include <inttypes.h> |
37 |
#include <string.h> |
36 |
#include <string.h> |
38 |
#include <err.h> |
37 |
#include <err.h> |
|
|
38 |
#include <libutil.h> |
39 |
|
39 |
|
40 |
#include "systat.h" |
40 |
#include "systat.h" |
41 |
#include "extern.h" |
41 |
#include "extern.h" |
42 |
#include "devs.h" |
42 |
#include "devs.h" |
43 |
|
43 |
|
44 |
struct zfield{ |
44 |
struct zfield { |
45 |
uint64_t arcstats; |
45 |
uint64_t arcstats; |
46 |
uint64_t arcstats_demand_data; |
46 |
uint64_t arcstats_demand_data; |
47 |
uint64_t arcstats_demand_metadata; |
47 |
uint64_t arcstats_demand_metadata; |
Lines 57-62
Link Here
|
57 |
struct zfield misses; |
57 |
struct zfield misses; |
58 |
} curstat, initstat, oldstat; |
58 |
} curstat, initstat, oldstat; |
59 |
|
59 |
|
|
|
60 |
struct zarcrates { |
61 |
struct zfield current; |
62 |
struct zfield total; |
63 |
}; |
64 |
|
60 |
static void |
65 |
static void |
61 |
getinfo(struct zarcstats *ls); |
66 |
getinfo(struct zarcstats *ls); |
62 |
|
67 |
|
Lines 63-74
Link Here
|
63 |
WINDOW * |
68 |
WINDOW * |
64 |
openzarc(void) |
69 |
openzarc(void) |
65 |
{ |
70 |
{ |
66 |
return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0)); |
71 |
|
|
|
72 |
return (subwin(stdscr, LINES - 3 - 1, 0, MAINWIN_ROW, 0)); |
67 |
} |
73 |
} |
68 |
|
74 |
|
69 |
void |
75 |
void |
70 |
closezarc(WINDOW *w) |
76 |
closezarc(WINDOW *w) |
71 |
{ |
77 |
{ |
|
|
78 |
|
72 |
if (w == NULL) |
79 |
if (w == NULL) |
73 |
return; |
80 |
return; |
74 |
wclear(w); |
81 |
wclear(w); |
Lines 80-91
Link Here
|
80 |
labelzarc(void) |
87 |
labelzarc(void) |
81 |
{ |
88 |
{ |
82 |
int row = 1; |
89 |
int row = 1; |
|
|
90 |
|
83 |
wmove(wnd, 0, 0); wclrtoeol(wnd); |
91 |
wmove(wnd, 0, 0); wclrtoeol(wnd); |
84 |
mvwprintw(wnd, 0, 31+1, "%4.4s %7.7s %7.7s %12.12s %12.12s", |
92 |
mvwprintw(wnd, 0, 31+1, "%4.4s %6.6s %6.6s | Total %4.4s %6.6s %6.6s", |
85 |
"rate", "hits", "misses", "total hits", "total misses"); |
93 |
"Rate", "Hits", "Misses", "Rate", "Hits", "Misses"); |
86 |
#define L(str) mvwprintw(wnd, row, 5, #str); \ |
94 |
#define L(str) mvwprintw(wnd, row++, 5, \ |
87 |
mvwprintw(wnd, row, 31, ":"); \ |
95 |
"%-26.26s: %% | %%", #str) |
88 |
mvwprintw(wnd, row, 31+4, "%%"); ++row |
|
|
89 |
L(arcstats); |
96 |
L(arcstats); |
90 |
L(arcstats.demand_data); |
97 |
L(arcstats.demand_data); |
91 |
L(arcstats.demand_metadata); |
98 |
L(arcstats.demand_metadata); |
Lines 98-118
Link Here
|
98 |
dslabel(12, 0, 18); |
105 |
dslabel(12, 0, 18); |
99 |
} |
106 |
} |
100 |
|
107 |
|
101 |
static int calc(uint64_t hits, uint64_t misses) |
108 |
static int |
|
|
109 |
calc_rate(uint64_t hits, uint64_t misses) |
102 |
{ |
110 |
{ |
103 |
if( hits ) |
111 |
if(hits) |
104 |
return 100 * hits / ( hits + misses ); |
112 |
return 100 * hits / (hits + misses); |
105 |
else |
113 |
else |
106 |
return 0; |
114 |
return 0; |
107 |
} |
115 |
} |
108 |
|
116 |
|
109 |
static void |
117 |
static void |
110 |
domode(struct zarcstats *delta, struct zarcstats *rate) |
118 |
domode(struct zarcstats *delta, struct zarcrates *rate) |
111 |
{ |
119 |
{ |
112 |
#define DO(stat) \ |
120 |
#define DO(stat) \ |
113 |
delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ |
121 |
delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ |
114 |
delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ |
122 |
delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ |
115 |
rate->hits.stat = calc(delta->hits.stat, delta->misses.stat) |
123 |
rate->current.stat = calc_rate(delta->hits.stat, delta->misses.stat); \ |
|
|
124 |
rate->total.stat = calc_rate(curstat.hits.stat, curstat.misses.stat) |
116 |
DO(arcstats); |
125 |
DO(arcstats); |
117 |
DO(arcstats_demand_data); |
126 |
DO(arcstats_demand_data); |
118 |
DO(arcstats_demand_metadata); |
127 |
DO(arcstats_demand_metadata); |
Lines 136-156
Link Here
|
136 |
showzarc(void) |
145 |
showzarc(void) |
137 |
{ |
146 |
{ |
138 |
int row = 1; |
147 |
int row = 1; |
139 |
struct zarcstats delta, rate; |
148 |
struct zarcstats delta = {}; |
|
|
149 |
struct zarcrates rate = {}; |
140 |
|
150 |
|
141 |
memset(&delta, 0, sizeof delta); |
|
|
142 |
memset(&rate, 0, sizeof rate); |
143 |
|
144 |
domode(&delta, &rate); |
151 |
domode(&delta, &rate); |
145 |
|
152 |
|
146 |
#define DO(stat, col, fmt) \ |
153 |
#define DO(stat, col, width) \ |
147 |
mvwprintw(wnd, row, col, fmt, stat) |
154 |
sysputuint64(wnd, row, col, width, stat, HN_DIVISOR_1000) |
148 |
#define R(stat) DO(rate.hits.stat, 31+1, "%3"PRIu64) |
155 |
#define RATES(stat) mvwprintw(wnd, row, 31+1, "%3"PRIu64, rate.current.stat);\ |
149 |
#define H(stat) DO(delta.hits.stat, 31+1+5, "%7"PRIu64); \ |
156 |
mvwprintw(wnd, row, 31+1+5+7+7+8, "%3"PRIu64, rate.total.stat) |
150 |
DO(curstat.hits.stat, 31+1+5+8+8, "%12"PRIu64) |
157 |
#define HITS(stat) DO(delta.hits.stat, 31+1+5, 6); \ |
151 |
#define M(stat) DO(delta.misses.stat, 31+1+5+8, "%7"PRIu64); \ |
158 |
DO(curstat.hits.stat, 31+1+5+7+7+8+5, 6) |
152 |
DO(curstat.misses.stat, 31+1+5+8+8+13, "%12"PRIu64) |
159 |
#define MISSES(stat) DO(delta.misses.stat, 31+1+5+7, 6); \ |
153 |
#define E(stat) R(stat); H(stat); M(stat); ++row |
160 |
DO(curstat.misses.stat, 31+1+5+7+7+8+5+7, 6) |
|
|
161 |
#define E(stat) RATES(stat); HITS(stat); MISSES(stat); ++row |
154 |
E(arcstats); |
162 |
E(arcstats); |
155 |
E(arcstats_demand_data); |
163 |
E(arcstats_demand_data); |
156 |
E(arcstats_demand_metadata); |
164 |
E(arcstats_demand_metadata); |
Lines 161-169
Link Here
|
161 |
E(vdev_cache_stats); |
169 |
E(vdev_cache_stats); |
162 |
#undef DO |
170 |
#undef DO |
163 |
#undef E |
171 |
#undef E |
164 |
#undef M |
172 |
#undef MISSES |
165 |
#undef H |
173 |
#undef HITS |
166 |
#undef R |
174 |
#undef RATES |
167 |
dsshow(12, 0, 18, &cur_dev, &last_dev); |
175 |
dsshow(12, 0, 18, &cur_dev, &last_dev); |
168 |
} |
176 |
} |
169 |
|
177 |
|
Lines 180-185
Link Here
|
180 |
void |
188 |
void |
181 |
resetzarc(void) |
189 |
resetzarc(void) |
182 |
{ |
190 |
{ |
|
|
191 |
|
183 |
initzarc(); |
192 |
initzarc(); |
184 |
} |
193 |
} |
185 |
|
194 |
|
Lines 193-203
Link Here
|
193 |
cur_dev.dinfo = tmp_dinfo; |
202 |
cur_dev.dinfo = tmp_dinfo; |
194 |
|
203 |
|
195 |
last_dev.snap_time = cur_dev.snap_time; |
204 |
last_dev.snap_time = cur_dev.snap_time; |
196 |
dsgetinfo( &cur_dev ); |
205 |
dsgetinfo(&cur_dev); |
197 |
|
206 |
|
198 |
size_t size = sizeof( ls->hits.arcstats ); |
207 |
size_t size = sizeof(ls->hits.arcstats); |
199 |
if ( sysctlbyname("kstat.zfs.misc.arcstats.hits", |
208 |
if (sysctlbyname("kstat.zfs.misc.arcstats.hits", |
200 |
&ls->hits.arcstats, &size, NULL, 0 ) != 0 ) |
209 |
&ls->hits.arcstats, &size, NULL, 0) != 0) |
201 |
return; |
210 |
return; |
202 |
GETSYSCTL("kstat.zfs.misc.arcstats.misses", |
211 |
GETSYSCTL("kstat.zfs.misc.arcstats.misses", |
203 |
ls->misses.arcstats); |
212 |
ls->misses.arcstats); |
Lines 234-239
Link Here
|
234 |
void |
243 |
void |
235 |
fetchzarc(void) |
244 |
fetchzarc(void) |
236 |
{ |
245 |
{ |
|
|
246 |
|
237 |
oldstat = curstat; |
247 |
oldstat = curstat; |
238 |
getinfo(&curstat); |
248 |
getinfo(&curstat); |
239 |
} |
249 |
} |