@cryptotaxi247 / netdata-1 / commits / 27503400f

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