do not stop collecting remounted read-only filesystems; fixes #1606; other diskspace optimizations
Costa Tsaousis (ktsaou) committed
Jan 22, 2017 at 14:51 UTC
27503400f0dee07880acf6ae5d7337e328e0f1d6
1 file changed
+80
-37
src/plugin_proc_diskspace.c
+80
-37
@@ -25,6 +25,18 @@ static inline void mountinfo_reload(int force) {
25
struct mount_point_metadata {
26
int do_space;
27
int do_inodes;
28
+
29
+ size_t collected; // the number of times this has been collected
30
+
31
+ RRDSET *st_space;
32
+ RRDDIM *rd_space_used;
33
+ RRDDIM *rd_space_avail;
34
+ RRDDIM *rd_space_reserved;
35
+
36
+ RRDSET *st_inodes;
37
+ RRDDIM *rd_inodes_used;
38
+ RRDDIM *rd_inodes_avail;
39
+ RRDDIM *rd_inodes_reserved;
40
};
41
42
static inline void do_disk_space_stats(struct mountinfo *mi, int update_every) {
@@ -69,7 +81,19 @@ static inline void do_disk_space_stats(struct mountinfo *mi, int update_every) {
81
82
struct mount_point_metadata mp = {
83
.do_space = do_space,
72
- .do_inodes = do_inodes
84
+ .do_inodes = do_inodes,
85
+
86
+ .collected = 0,
87
+
88
+ .st_space = NULL,
89
+ .rd_space_avail = NULL,
90
+ .rd_space_used = NULL,
91
+ .rd_space_reserved = NULL,
92
+
93
+ .st_inodes = NULL,
94
+ .rd_inodes_avail = NULL,
95
+ .rd_inodes_used = NULL,
96
+ .rd_inodes_reserved = NULL
97
};
98
99
dictionary_set(mount_points, mi->mount_point, &mp, sizeof(struct mount_point_metadata));
@@ -82,13 +106,16 @@ static inline void do_disk_space_stats(struct mountinfo *mi, int update_every) {
106
if(unlikely(do_space == CONFIG_ONDEMAND_NO && do_inodes == CONFIG_ONDEMAND_NO))
107
return;
108
109
+ if(unlikely(mi->flags & MOUNTINFO_READONLY && !m->collected))
110
+ return;
111
+
112
struct statvfs buff_statvfs;
113
if (statvfs(mi->mount_point, &buff_statvfs) < 0) {
114
error("Failed statvfs() for '%s' (disk '%s')", mi->mount_point, disk);
115
return;
116
}
117
91
- // taken from get_fs_usage() found in coreutils
118
+ // logic found at get_fs_usage() in coreutils
119
unsigned long bsize = (buff_statvfs.f_frsize) ? buff_statvfs.f_frsize : buff_statvfs.f_bsize;
120
121
fsblkcnt_t bavail = buff_statvfs.f_bavail;
@@ -121,47 +148,64 @@ static inline void do_disk_space_stats(struct mountinfo *mi, int update_every) {
148
149
// --------------------------------------------------------------------------
150
124
- RRDSET *st;
151
+ int rendered = 0;
152
153
if(do_space == CONFIG_ONDEMAND_YES || (do_space == CONFIG_ONDEMAND_ONDEMAND && (bavail || breserved_root || bused))) {
127
- st = rrdset_find_bytype("disk_space", disk);
128
- if(unlikely(!st)) {
129
- char title[4096 + 1];
130
- snprintfz(title, 4096, "Disk Space Usage for %s [%s]", family, mi->mount_source);
131
- st = rrdset_create("disk_space", disk, NULL, family, "disk.space", title, "GB", 2023, update_every, RRDSET_TYPE_STACKED);
132
-
133
- rrddim_add(st, "avail", NULL, bsize, 1024*1024*1024, RRDDIM_ABSOLUTE);
134
- rrddim_add(st, "used" , NULL, bsize, 1024*1024*1024, RRDDIM_ABSOLUTE);
135
- rrddim_add(st, "reserved_for_root", "reserved for root", bsize, 1024*1024*1024, RRDDIM_ABSOLUTE);
154
+ if(unlikely(!m->st_space)) {
155
+ m->do_space = CONFIG_ONDEMAND_YES;
156
+ m->st_space = rrdset_find_bytype("disk_space", disk);
157
+ if(unlikely(!m->st_space)) {
158
+ char title[4096 + 1];
159
+ snprintfz(title, 4096, "Disk Space Usage for %s [%s]", family, mi->mount_source);
160
+ m->st_space = rrdset_create("disk_space", disk, NULL, family, "disk.space", title, "GB", 2023, update_every, RRDSET_TYPE_STACKED);
161
+ }
162
+
163
+ m->rd_space_avail = rrddim_add(m->st_space, "avail", NULL, bsize, 1024 * 1024 * 1024, RRDDIM_ABSOLUTE);
164
+ m->rd_space_used = rrddim_add(m->st_space, "used", NULL, bsize, 1024 * 1024 * 1024, RRDDIM_ABSOLUTE);
165
+ m->rd_space_reserved = rrddim_add(m->st_space, "reserved_for_root", "reserved for root", bsize, 1024 * 1024 * 1024, RRDDIM_ABSOLUTE);
166
}
137
- else rrdset_next(st);
167
+ else
168
+ rrdset_next(m->st_space);
169
+
170
+ rrddim_set_by_pointer(m->st_space, m->rd_space_avail, (collected_number)bavail);
171
+ rrddim_set_by_pointer(m->st_space, m->rd_space_used, (collected_number)bused);
172
+ rrddim_set_by_pointer(m->st_space, m->rd_space_reserved, (collected_number)breserved_root);
173
+ rrdset_done(m->st_space);
174
139
- rrddim_set(st, "avail", (collected_number)bavail);
140
- rrddim_set(st, "used", (collected_number)bused);
141
- rrddim_set(st, "reserved_for_root", (collected_number)breserved_root);
142
- rrdset_done(st);
175
+ rendered++;
176
}
177
178
// --------------------------------------------------------------------------
179
180
if(do_inodes == CONFIG_ONDEMAND_YES || (do_inodes == CONFIG_ONDEMAND_ONDEMAND && (favail || freserved_root || fused))) {
148
- st = rrdset_find_bytype("disk_inodes", disk);
149
- if(unlikely(!st)) {
150
- char title[4096 + 1];
151
- snprintfz(title, 4096, "Disk Files (inodes) Usage for %s [%s]", family, mi->mount_source);
152
- st = rrdset_create("disk_inodes", disk, NULL, family, "disk.inodes", title, "Inodes", 2024, update_every, RRDSET_TYPE_STACKED);
153
-
154
- rrddim_add(st, "avail", NULL, 1, 1, RRDDIM_ABSOLUTE);
155
- rrddim_add(st, "used" , NULL, 1, 1, RRDDIM_ABSOLUTE);
156
- rrddim_add(st, "reserved_for_root", "reserved for root", 1, 1, RRDDIM_ABSOLUTE);
181
+ if(unlikely(!m->st_inodes)) {
182
+ m->do_inodes = CONFIG_ONDEMAND_YES;
183
+ m->st_inodes = rrdset_find_bytype("disk_inodes", disk);
184
+ if(unlikely(!m->st_inodes)) {
185
+ char title[4096 + 1];
186
+ snprintfz(title, 4096, "Disk Files (inodes) Usage for %s [%s]", family, mi->mount_source);
187
+ m->st_inodes = rrdset_create("disk_inodes", disk, NULL, family, "disk.inodes", title, "Inodes", 2024, update_every, RRDSET_TYPE_STACKED);
188
+ }
189
+
190
+ m->rd_inodes_avail = rrddim_add(m->st_inodes, "avail", NULL, 1, 1, RRDDIM_ABSOLUTE);
191
+ m->rd_inodes_used = rrddim_add(m->st_inodes, "used", NULL, 1, 1, RRDDIM_ABSOLUTE);
192
+ m->rd_inodes_reserved = rrddim_add(m->st_inodes, "reserved_for_root", "reserved for root", 1, 1, RRDDIM_ABSOLUTE);
193
}
158
- else rrdset_next(st);
194
+ else
195
+ rrdset_next(m->st_inodes);
196
160
- rrddim_set(st, "avail", (collected_number)favail);
161
- rrddim_set(st, "used", (collected_number)fused);
162
- rrddim_set(st, "reserved_for_root", (collected_number)freserved_root);
163
- rrdset_done(st);
197
+ rrddim_set_by_pointer(m->st_inodes, m->rd_inodes_avail, (collected_number)favail);
198
+ rrddim_set_by_pointer(m->st_inodes, m->rd_inodes_used, (collected_number)fused);
199
+ rrddim_set_by_pointer(m->st_inodes, m->rd_inodes_reserved, (collected_number)freserved_root);
200
+ rrdset_done(m->st_inodes);
201
+
202
+ rendered++;
203
}
204
+
205
+ // --------------------------------------------------------------------------
206
+
207
+ if(likely(rendered))
208
+ m->collected++;
209
}
210
211
void *proc_diskspace_main(void *ptr) {
@@ -185,8 +229,6 @@ void *proc_diskspace_main(void *ptr) {
229
if(check_for_new_mountpoints_every < update_every)
230
check_for_new_mountpoints_every = update_every;
231
188
- RRDSET *stcpu_thread = NULL, *st_duration = NULL;
189
- RRDDIM *rd_user = NULL, *rd_system = NULL, *rd_duration = NULL;
232
struct rusage thread;
233
234
usec_t last = 0, dt = 0;
@@ -219,9 +261,7 @@ void *proc_diskspace_main(void *ptr) {
261
struct mountinfo *mi;
262
for(mi = disk_mountinfo_root; mi; mi = mi->next) {
263
222
- if(unlikely(mi->flags &
223
- (MOUNTINFO_IS_DUMMY | MOUNTINFO_IS_BIND | MOUNTINFO_IS_SAME_DEV | MOUNTINFO_NO_STAT |
224
- MOUNTINFO_NO_SIZE | MOUNTINFO_READONLY)))
264
+ if(unlikely(mi->flags & (MOUNTINFO_IS_DUMMY | MOUNTINFO_IS_BIND | MOUNTINFO_IS_SAME_DEV | MOUNTINFO_NO_STAT | MOUNTINFO_NO_SIZE)))
265
continue;
266
267
do_disk_space_stats(mi, update_every);
@@ -231,6 +271,9 @@ void *proc_diskspace_main(void *ptr) {
271
if(unlikely(netdata_exit)) break;
272
273
if(vdo_cpu_netdata) {
274
+ static RRDSET *stcpu_thread = NULL, *st_duration = NULL;
275
+ static RRDDIM *rd_user = NULL, *rd_system = NULL, *rd_duration = NULL;
276
+
277
// ----------------------------------------------------------------
278
279
getrusage(RUSAGE_THREAD, &thread);
@@ -241,7 +284,7 @@ void *proc_diskspace_main(void *ptr) {
284
, "NetData Disk Space Plugin CPU usage", "milliseconds/s", 132020
285
, update_every, RRDSET_TYPE_STACKED);
286
244
- rd_user = rrddim_add(stcpu_thread, "user", NULL, 1, 1000, RRDDIM_INCREMENTAL);
287
+ rd_user = rrddim_add(stcpu_thread, "user", NULL, 1, 1000, RRDDIM_INCREMENTAL);
288
rd_system = rrddim_add(stcpu_thread, "system", NULL, 1, 1000, RRDDIM_INCREMENTAL);
289
}
290
else