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 81-91
Link Here
|
81 |
{ |
86 |
{ |
82 |
int row = 1; |
87 |
int row = 1; |
83 |
wmove(wnd, 0, 0); wclrtoeol(wnd); |
88 |
wmove(wnd, 0, 0); wclrtoeol(wnd); |
84 |
mvwprintw(wnd, 0, 31+1, "%4.4s %7.7s %7.7s %12.12s %12.12s", |
89 |
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"); |
90 |
"Rate", "Hits", "Misses", "Rate", "Hits", "Misses"); |
86 |
#define L(str) mvwprintw(wnd, row, 5, #str); \ |
91 |
#define L(str) mvwprintw(wnd, row++, 5, \ |
87 |
mvwprintw(wnd, row, 31, ":"); \ |
92 |
"%-26.26s: %% | %%", #str) |
88 |
mvwprintw(wnd, row, 31+4, "%%"); ++row |
|
|
89 |
L(arcstats); |
93 |
L(arcstats); |
90 |
L(arcstats.demand_data); |
94 |
L(arcstats.demand_data); |
91 |
L(arcstats.demand_metadata); |
95 |
L(arcstats.demand_metadata); |
Lines 98-104
Link Here
|
98 |
dslabel(12, 0, 18); |
102 |
dslabel(12, 0, 18); |
99 |
} |
103 |
} |
100 |
|
104 |
|
101 |
static int calc(uint64_t hits, uint64_t misses) |
105 |
static int |
|
|
106 |
calc_rate(uint64_t hits, uint64_t misses) |
102 |
{ |
107 |
{ |
103 |
if( hits ) |
108 |
if( hits ) |
104 |
return 100 * hits / ( hits + misses ); |
109 |
return 100 * hits / ( hits + misses ); |
Lines 107-118
Link Here
|
107 |
} |
112 |
} |
108 |
|
113 |
|
109 |
static void |
114 |
static void |
110 |
domode(struct zarcstats *delta, struct zarcstats *rate) |
115 |
domode(struct zarcstats *delta, struct zarcrates *rate) |
111 |
{ |
116 |
{ |
112 |
#define DO(stat) \ |
117 |
#define DO(stat) \ |
113 |
delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ |
118 |
delta->hits.stat = (curstat.hits.stat - oldstat.hits.stat); \ |
114 |
delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ |
119 |
delta->misses.stat = (curstat.misses.stat - oldstat.misses.stat); \ |
115 |
rate->hits.stat = calc(delta->hits.stat, delta->misses.stat) |
120 |
rate->current.stat = calc_rate(delta->hits.stat, delta->misses.stat); \ |
|
|
121 |
rate->total.stat = calc_rate(curstat.hits.stat, curstat.misses.stat) |
116 |
DO(arcstats); |
122 |
DO(arcstats); |
117 |
DO(arcstats_demand_data); |
123 |
DO(arcstats_demand_data); |
118 |
DO(arcstats_demand_metadata); |
124 |
DO(arcstats_demand_metadata); |
Lines 136-156
Link Here
|
136 |
showzarc(void) |
142 |
showzarc(void) |
137 |
{ |
143 |
{ |
138 |
int row = 1; |
144 |
int row = 1; |
139 |
struct zarcstats delta, rate; |
145 |
struct zarcstats delta = {}; |
|
|
146 |
struct zarcrates rate = {}; |
140 |
|
147 |
|
141 |
memset(&delta, 0, sizeof delta); |
|
|
142 |
memset(&rate, 0, sizeof rate); |
143 |
|
144 |
domode(&delta, &rate); |
148 |
domode(&delta, &rate); |
145 |
|
149 |
|
146 |
#define DO(stat, col, fmt) \ |
150 |
#define DO(stat, col, width) \ |
147 |
mvwprintw(wnd, row, col, fmt, stat) |
151 |
sysputuint64(wnd, row, col, width, stat, HN_DIVISOR_1000 ) |
148 |
#define R(stat) DO(rate.hits.stat, 31+1, "%3"PRIu64) |
152 |
#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); \ |
153 |
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) |
154 |
#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); \ |
155 |
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) |
156 |
#define MISSES(stat) DO(delta.misses.stat, 31+1+5+7, 6); \ |
153 |
#define E(stat) R(stat); H(stat); M(stat); ++row |
157 |
DO(curstat.misses.stat, 31+1+5+7+7+8+5+7, 6) |
|
|
158 |
#define E(stat) RATES(stat); HITS(stat); MISSES(stat); ++row |
154 |
E(arcstats); |
159 |
E(arcstats); |
155 |
E(arcstats_demand_data); |
160 |
E(arcstats_demand_data); |
156 |
E(arcstats_demand_metadata); |
161 |
E(arcstats_demand_metadata); |
Lines 161-169
Link Here
|
161 |
E(vdev_cache_stats); |
166 |
E(vdev_cache_stats); |
162 |
#undef DO |
167 |
#undef DO |
163 |
#undef E |
168 |
#undef E |
164 |
#undef M |
169 |
#undef MISSES |
165 |
#undef H |
170 |
#undef HITS |
166 |
#undef R |
171 |
#undef RATES |
167 |
dsshow(12, 0, 18, &cur_dev, &last_dev); |
172 |
dsshow(12, 0, 18, &cur_dev, &last_dev); |
168 |
} |
173 |
} |
169 |
|
174 |
|