finer control of cgroups aspects
Costa Tsaousis (ktsaou) committed
Jan 17, 2017 at 02:23 UTC
3acf4090cea246a810622425ce6bef77a929b888
1 file changed
+290
-187
src/sys_fs_cgroup.c
+290
-187
@@ -6,14 +6,26 @@
6
static int cgroup_enable_cpuacct_stat = CONFIG_ONDEMAND_ONDEMAND;
7
static int cgroup_enable_cpuacct_usage = CONFIG_ONDEMAND_ONDEMAND;
8
static int cgroup_enable_memory = CONFIG_ONDEMAND_ONDEMAND;
9
-static int cgroup_enable_devices = CONFIG_ONDEMAND_ONDEMAND;
10
-static int cgroup_enable_blkio = CONFIG_ONDEMAND_ONDEMAND;
9
+static int cgroup_enable_detailed_memory = CONFIG_ONDEMAND_ONDEMAND;
10
+static int cgroup_enable_memory_failcnt = CONFIG_ONDEMAND_ONDEMAND;
11
+static int cgroup_enable_swap = CONFIG_ONDEMAND_ONDEMAND;
12
+static int cgroup_enable_blkio_io = CONFIG_ONDEMAND_ONDEMAND;
13
+static int cgroup_enable_blkio_ops = CONFIG_ONDEMAND_ONDEMAND;
14
+static int cgroup_enable_blkio_throttle_io = CONFIG_ONDEMAND_ONDEMAND;
15
+static int cgroup_enable_blkio_throttle_ops = CONFIG_ONDEMAND_ONDEMAND;
16
+static int cgroup_enable_blkio_merged_ops = CONFIG_ONDEMAND_ONDEMAND;
17
+static int cgroup_enable_blkio_queued_ops = CONFIG_ONDEMAND_ONDEMAND;
18
static int cgroup_enable_systemd_services = CONFIG_ONDEMAND_YES;
19
+
20
+static int cgroup_search_in_devices = 1;
21
+
22
static int cgroup_enable_new_cgroups_detected_at_runtime = 1;
23
static int cgroup_check_for_new_every = 10;
24
static int cgroup_update_every = 1;
25
+
26
static int cgroup_recheck_zero_blkio_every_iterations = 10;
27
static int cgroup_recheck_zero_mem_failcnt_every_iterations = 10;
28
+static int cgroup_recheck_zero_mem_detailed_every_iterations = 10;
29
30
static char *cgroup_cpuacct_base = NULL;
31
static char *cgroup_blkio_base = NULL;
@@ -122,15 +134,26 @@ void read_cgroup_plugin_configuration() {
134
if(cgroup_check_for_new_every < cgroup_update_every)
135
cgroup_check_for_new_every = cgroup_update_every;
136
125
- cgroup_enable_cpuacct_stat = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct stat", cgroup_enable_cpuacct_stat);
126
- cgroup_enable_cpuacct_usage = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct usage", cgroup_enable_cpuacct_usage);
127
- cgroup_enable_memory = config_get_boolean_ondemand("plugin:cgroups", "enable memory", cgroup_enable_memory);
128
- cgroup_enable_blkio = config_get_boolean_ondemand("plugin:cgroups", "enable blkio", cgroup_enable_blkio);
137
+ cgroup_enable_cpuacct_stat = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct stat (total CPU)", cgroup_enable_cpuacct_stat);
138
+ cgroup_enable_cpuacct_usage = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct usage (per core CPU)", cgroup_enable_cpuacct_usage);
139
+
140
+ cgroup_enable_memory = config_get_boolean_ondemand("plugin:cgroups", "enable memory (used mem including cache)", cgroup_enable_memory);
141
+ cgroup_enable_detailed_memory = config_get_boolean_ondemand("plugin:cgroups", "enable detailed memory", cgroup_enable_detailed_memory);
142
+ cgroup_enable_memory_failcnt = config_get_boolean_ondemand("plugin:cgroups", "enable memory limits fail count", cgroup_enable_memory_failcnt);
143
+ cgroup_enable_swap = config_get_boolean_ondemand("plugin:cgroups", "enable swap memory", cgroup_enable_swap);
144
130
- cgroup_enable_systemd_services = config_get_boolean_ondemand("plugin:cgroups", "enable systemd services", cgroup_enable_systemd_services);
145
+ cgroup_enable_blkio_io = config_get_boolean_ondemand("plugin:cgroups", "enable blkio bandwidth", cgroup_enable_blkio_io);
146
+ cgroup_enable_blkio_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio operations", cgroup_enable_blkio_ops);
147
+ cgroup_enable_blkio_throttle_io = config_get_boolean_ondemand("plugin:cgroups", "enable blkio throttle bandwidth", cgroup_enable_blkio_throttle_io);
148
+ cgroup_enable_blkio_throttle_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio throttle operations", cgroup_enable_blkio_throttle_ops);
149
+ cgroup_enable_blkio_queued_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio queued operations", cgroup_enable_blkio_queued_ops);
150
+ cgroup_enable_blkio_merged_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio merged operations", cgroup_enable_blkio_merged_ops);
151
152
cgroup_recheck_zero_blkio_every_iterations = (int)config_get_number("plugin:cgroups", "recheck zero blkio every iterations", cgroup_recheck_zero_blkio_every_iterations);
153
cgroup_recheck_zero_mem_failcnt_every_iterations = (int)config_get_number("plugin:cgroups", "recheck zero memory failcnt every iterations", cgroup_recheck_zero_mem_failcnt_every_iterations);
154
+ cgroup_recheck_zero_mem_detailed_every_iterations = (int)config_get_number("plugin:cgroups", "recheck zero detailed memory every iterations", cgroup_recheck_zero_mem_detailed_every_iterations);
155
+
156
+ cgroup_enable_systemd_services = config_get_boolean("plugin:cgroups", "enable systemd services", cgroup_enable_systemd_services);
157
158
char filename[FILENAME_MAX + 1], *s;
159
struct mountinfo *mi, *root = mountinfo_read(0);
@@ -240,6 +263,7 @@ void read_cgroup_plugin_configuration() {
263
264
struct blkio {
265
int updated;
266
+ int enabled; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
267
int delay_counter;
268
269
char *filename;
@@ -256,6 +280,12 @@ struct blkio {
280
// https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
281
struct memory {
282
int updated;
283
+ int enabled_usage; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
284
+ int enabled_detailed; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
285
+ int enabled_swap; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
286
+ int enabled_failcnt; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
287
+
288
+ int delay_counter;
289
290
char *filename;
291
@@ -314,6 +344,7 @@ struct memory {
344
// https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
345
struct cpuacct_stat {
346
int updated;
347
+ int enabled; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
348
349
char *filename;
350
@@ -324,6 +355,7 @@ struct cpuacct_stat {
355
// https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
356
struct cpuacct_usage {
357
int updated;
358
+ int enabled; // CONFIG_ONDEMAND_YES or CONFIG_ONDEMAND_ONDEMAND
359
360
char *filename;
361
@@ -445,6 +477,9 @@ static inline void cgroup_read_cpuacct_stat(struct cpuacct_stat *cp) {
477
}
478
479
cp->updated = 1;
480
+
481
+ if(unlikely(cp->enabled == CONFIG_ONDEMAND_ONDEMAND && (cp->user || cp->system)))
482
+ cp->enabled = CONFIG_ONDEMAND_YES;
483
}
484
}
485
@@ -489,17 +524,24 @@ static inline void cgroup_read_cpuacct_usage(struct cpuacct_usage *ca) {
524
ca->cpus = (unsigned int)i;
525
}
526
492
- for(i = 0; i < ca->cpus ;i++)
493
- ca->cpu_percpu[i] = strtoull(procfile_lineword(ff, 0, i), NULL, 10);
527
+ unsigned long long total = 0;
528
+ for(i = 0; i < ca->cpus ;i++) {
529
+ unsigned long long n = strtoull(procfile_lineword(ff, 0, i), NULL, 10);
530
+ ca->cpu_percpu[i] = n;
531
+ total += n;
532
+ }
533
534
ca->updated = 1;
535
+
536
+ if(unlikely(ca->enabled == CONFIG_ONDEMAND_ONDEMAND && total))
537
+ ca->enabled = CONFIG_ONDEMAND_YES;
538
}
539
}
540
541
static inline void cgroup_read_blkio(struct blkio *io) {
542
static procfile *ff = NULL;
543
502
- if(unlikely(io->delay_counter > 0)) {
544
+ if(unlikely(io->enabled == CONFIG_ONDEMAND_ONDEMAND && io->delay_counter > 0)) {
545
io->delay_counter--;
546
return;
547
}
@@ -567,15 +609,25 @@ static inline void cgroup_read_blkio(struct blkio *io) {
609
610
io->updated = 1;
611
570
- if(unlikely(!io->Read && !io->Write))
571
- io->delay_counter = cgroup_recheck_zero_blkio_every_iterations;
612
+ if(unlikely(io->enabled == CONFIG_ONDEMAND_ONDEMAND)) {
613
+ if(unlikely(io->Read || io->Write))
614
+ io->enabled = CONFIG_ONDEMAND_YES;
615
+ else
616
+ io->delay_counter = cgroup_recheck_zero_blkio_every_iterations;
617
+ }
618
}
619
}
620
621
static inline void cgroup_read_memory(struct memory *mem) {
622
static procfile *ff = NULL;
623
624
+ // read detailed ram usage
625
if(likely(mem->filename)) {
626
+ if(unlikely(mem->enabled_detailed == CONFIG_ONDEMAND_ONDEMAND && mem->delay_counter > 0)) {
627
+ mem->delay_counter--;
628
+ goto memory_next;
629
+ }
630
+
631
ff = procfile_reopen(ff, mem->filename, NULL, PROCFILE_FLAG_DEFAULT);
632
if(unlikely(!ff)) {
633
mem->updated = 0;
@@ -773,33 +825,56 @@ static inline void cgroup_read_memory(struct memory *mem) {
825
// fprintf(stderr, "READ: '%s', cache: %llu, rss: %llu, rss_huge: %llu, mapped_file: %llu, writeback: %llu, dirty: %llu, swap: %llu, pgpgin: %llu, pgpgout: %llu, pgfault: %llu, pgmajfault: %llu, inactive_anon: %llu, active_anon: %llu, inactive_file: %llu, active_file: %llu, unevictable: %llu, hierarchical_memory_limit: %llu, total_cache: %llu, total_rss: %llu, total_rss_huge: %llu, total_mapped_file: %llu, total_writeback: %llu, total_dirty: %llu, total_swap: %llu, total_pgpgin: %llu, total_pgpgout: %llu, total_pgfault: %llu, total_pgmajfault: %llu, total_inactive_anon: %llu, total_active_anon: %llu, total_inactive_file: %llu, total_active_file: %llu, total_unevictable: %llu\n", mem->filename, mem->cache, mem->rss, mem->rss_huge, mem->mapped_file, mem->writeback, mem->dirty, mem->swap, mem->pgpgin, mem->pgpgout, mem->pgfault, mem->pgmajfault, mem->inactive_anon, mem->active_anon, mem->inactive_file, mem->active_file, mem->unevictable, mem->hierarchical_memory_limit, mem->total_cache, mem->total_rss, mem->total_rss_huge, mem->total_mapped_file, mem->total_writeback, mem->total_dirty, mem->total_swap, mem->total_pgpgin, mem->total_pgpgout, mem->total_pgfault, mem->total_pgmajfault, mem->total_inactive_anon, mem->total_active_anon, mem->total_inactive_file, mem->total_active_file, mem->total_unevictable);
826
827
mem->updated = 1;
828
+
829
+ if(unlikely(mem->enabled_detailed == CONFIG_ONDEMAND_ONDEMAND)) {
830
+ if(mem->cache || mem->dirty || mem->rss || mem->rss_huge || mem->mapped_file || mem->writeback || mem->swap || mem->pgpgin || mem->pgpgout || mem->pgfault || mem->pgmajfault)
831
+ mem->enabled_detailed = CONFIG_ONDEMAND_YES;
832
+ else
833
+ mem->delay_counter = cgroup_recheck_zero_mem_detailed_every_iterations;
834
+ }
835
}
836
837
memory_next:
838
+
839
+ // read usage_in_bytes
840
if(likely(mem->filename_usage_in_bytes)) {
780
- if(likely(!read_single_number_file(mem->filename_usage_in_bytes, &mem->usage_in_bytes)))
841
+ if(likely(!read_single_number_file(mem->filename_usage_in_bytes, &mem->usage_in_bytes))) {
842
mem->usage_in_bytes_updated = 1;
843
+
844
+ if(unlikely(mem->enabled_usage == CONFIG_ONDEMAND_ONDEMAND && mem->usage_in_bytes))
845
+ mem->enabled_usage = CONFIG_ONDEMAND_YES;
846
+ }
847
else
848
mem->usage_in_bytes_updated = 0;
849
}
850
851
+ // read msw_usage_in_bytes
852
if(likely(mem->filename_msw_usage_in_bytes)) {
787
- if(likely(!read_single_number_file(mem->filename_msw_usage_in_bytes, &mem->msw_usage_in_bytes)))
853
+ if(likely(!read_single_number_file(mem->filename_msw_usage_in_bytes, &mem->msw_usage_in_bytes))) {
854
mem->msw_usage_in_bytes_updated = 1;
855
+
856
+ if(unlikely(mem->enabled_swap == CONFIG_ONDEMAND_ONDEMAND && mem->msw_usage_in_bytes))
857
+ mem->enabled_swap = CONFIG_ONDEMAND_YES;
858
+ }
859
else
860
mem->msw_usage_in_bytes_updated = 0;
861
}
862
863
+ // read failcnt
864
if(likely(mem->filename_failcnt)) {
794
- if(unlikely(mem->failcnt_delay_counter > 0)) {
865
+ if(unlikely(mem->enabled_failcnt == CONFIG_ONDEMAND_ONDEMAND && mem->failcnt_delay_counter > 0)) {
866
mem->failcnt_updated = 0;
867
mem->failcnt_delay_counter--;
868
}
869
else if(likely(!read_single_number_file(mem->filename_failcnt, &mem->failcnt))) {
870
mem->failcnt_updated = 1;
871
801
- if(unlikely(!mem->failcnt))
802
- mem->failcnt_delay_counter = cgroup_recheck_zero_mem_failcnt_every_iterations;
872
+ if(unlikely(mem->enabled_failcnt == CONFIG_ONDEMAND_ONDEMAND)) {
873
+ if(unlikely(!mem->failcnt))
874
+ mem->failcnt_delay_counter = cgroup_recheck_zero_mem_failcnt_every_iterations;
875
+ else
876
+ mem->enabled_failcnt = CONFIG_ONDEMAND_YES;
877
+ }
878
}
879
}
880
}
@@ -1205,30 +1280,39 @@ static inline void find_all_cgroups() {
1280
mark_all_cgroups_as_not_available();
1281
1282
if(cgroup_enable_cpuacct_stat || cgroup_enable_cpuacct_usage) {
1208
- if (find_dir_in_subdirs(cgroup_cpuacct_base, NULL, found_subdir_in_dir) == -1) {
1209
- cgroup_enable_cpuacct_stat = cgroup_enable_cpuacct_usage = 0;
1210
- error("disabled cgroup cpu statistics.");
1283
+ if(find_dir_in_subdirs(cgroup_cpuacct_base, NULL, found_subdir_in_dir) == -1) {
1284
+ cgroup_enable_cpuacct_stat =
1285
+ cgroup_enable_cpuacct_usage = CONFIG_ONDEMAND_NO;
1286
+ error("disabled CGROUP cpu statistics.");
1287
}
1288
}
1289
1214
- if(cgroup_enable_blkio) {
1215
- if (find_dir_in_subdirs(cgroup_blkio_base, NULL, found_subdir_in_dir) == -1) {
1216
- cgroup_enable_blkio = 0;
1217
- error("disabled cgroup blkio statistics.");
1290
+ if(cgroup_enable_blkio_io || cgroup_enable_blkio_ops || cgroup_enable_blkio_throttle_io || cgroup_enable_blkio_throttle_ops || cgroup_enable_blkio_merged_ops || cgroup_enable_blkio_queued_ops) {
1291
+ if(find_dir_in_subdirs(cgroup_blkio_base, NULL, found_subdir_in_dir) == -1) {
1292
+ cgroup_enable_blkio_io =
1293
+ cgroup_enable_blkio_ops =
1294
+ cgroup_enable_blkio_throttle_io =
1295
+ cgroup_enable_blkio_throttle_ops =
1296
+ cgroup_enable_blkio_merged_ops =
1297
+ cgroup_enable_blkio_queued_ops = CONFIG_ONDEMAND_NO;
1298
+ error("disabled CGROUP blkio statistics.");
1299
}
1300
}
1301
1221
- if(cgroup_enable_memory) {
1302
+ if(cgroup_enable_memory || cgroup_enable_detailed_memory || cgroup_enable_swap || cgroup_enable_memory_failcnt) {
1303
if(find_dir_in_subdirs(cgroup_memory_base, NULL, found_subdir_in_dir) == -1) {
1223
- cgroup_enable_memory = 0;
1224
- error("disabled cgroup memory statistics.");
1304
+ cgroup_enable_memory =
1305
+ cgroup_enable_detailed_memory =
1306
+ cgroup_enable_swap =
1307
+ cgroup_enable_memory_failcnt = CONFIG_ONDEMAND_NO;
1308
+ error("disabled CGROUP memory statistics.");
1309
}
1310
}
1311
1228
- if(cgroup_enable_devices) {
1312
+ if(cgroup_search_in_devices) {
1313
if(find_dir_in_subdirs(cgroup_devices_base, NULL, found_subdir_in_dir) == -1) {
1230
- cgroup_enable_devices = 0;
1231
- error("disabled cgroup devices statistics.");
1314
+ cgroup_search_in_devices = 0;
1315
+ error("disabled CGROUP devices statistics.");
1316
}
1317
}
1318
@@ -1252,119 +1336,132 @@ static inline void find_all_cgroups() {
1336
snprintfz(filename, FILENAME_MAX, "%s%s/cpuacct.stat", cgroup_cpuacct_base, cg->id);
1337
if(likely(stat(filename, &buf) != -1)) {
1338
cg->cpuacct_stat.filename = strdupz(filename);
1339
+ cg->cpuacct_stat.enabled = cgroup_enable_cpuacct_stat;
1340
debug(D_CGROUP, "cpuacct.stat filename for cgroup '%s': '%s'", cg->id, cg->cpuacct_stat.filename);
1341
}
1257
- else debug(D_CGROUP, "cpuacct.stat file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1342
+ else
1343
+ debug(D_CGROUP, "cpuacct.stat file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1344
}
1345
1346
if(unlikely(cgroup_enable_cpuacct_usage && !cg->cpuacct_usage.filename && !(cg->options & CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE))) {
1347
snprintfz(filename, FILENAME_MAX, "%s%s/cpuacct.usage_percpu", cgroup_cpuacct_base, cg->id);
1348
if(likely(stat(filename, &buf) != -1)) {
1349
cg->cpuacct_usage.filename = strdupz(filename);
1350
+ cg->cpuacct_usage.enabled = cgroup_enable_cpuacct_usage;
1351
debug(D_CGROUP, "cpuacct.usage_percpu filename for cgroup '%s': '%s'", cg->id, cg->cpuacct_usage.filename);
1352
}
1266
- else debug(D_CGROUP, "cpuacct.usage_percpu file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1353
+ else
1354
+ debug(D_CGROUP, "cpuacct.usage_percpu file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1355
}
1356
1269
- if(unlikely(cgroup_enable_memory)) {
1270
- if(unlikely(!cg->memory.filename) && !(cg->options & CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE)) {
1271
- snprintfz(filename, FILENAME_MAX, "%s%s/memory.stat", cgroup_memory_base, cg->id);
1272
- if(likely(stat(filename, &buf) != -1)) {
1273
- cg->memory.filename = strdupz(filename);
1274
- debug(D_CGROUP, "memory.stat filename for cgroup '%s': '%s'", cg->id, cg->memory.filename);
1275
- }
1276
- else
1277
- debug(D_CGROUP, "memory.stat file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1357
+ if(unlikely(cgroup_enable_detailed_memory && !cg->memory.filename && !(cg->options & CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE))) {
1358
+ snprintfz(filename, FILENAME_MAX, "%s%s/memory.stat", cgroup_memory_base, cg->id);
1359
+ if(likely(stat(filename, &buf) != -1)) {
1360
+ cg->memory.filename = strdupz(filename);
1361
+ cg->memory.enabled_detailed = cgroup_enable_detailed_memory;
1362
+ debug(D_CGROUP, "memory.stat filename for cgroup '%s': '%s'", cg->id, cg->memory.filename);
1363
}
1279
- if(unlikely(!cg->memory.filename_usage_in_bytes)) {
1280
- snprintfz(filename, FILENAME_MAX, "%s%s/memory.usage_in_bytes", cgroup_memory_base, cg->id);
1281
- if(likely(stat(filename, &buf) != -1)) {
1282
- cg->memory.filename_usage_in_bytes = strdupz(filename);
1283
- debug(D_CGROUP, "memory.usage_in_bytes filename for cgroup '%s': '%s'", cg->id, cg->memory.filename_usage_in_bytes);
1284
- }
1285
- else
1286
- debug(D_CGROUP, "memory.usage_in_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1364
+ else
1365
+ debug(D_CGROUP, "memory.stat file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1366
+ }
1367
+
1368
+ if(unlikely(cgroup_enable_memory && !cg->memory.filename_usage_in_bytes)) {
1369
+ snprintfz(filename, FILENAME_MAX, "%s%s/memory.usage_in_bytes", cgroup_memory_base, cg->id);
1370
+ if(likely(stat(filename, &buf) != -1)) {
1371
+ cg->memory.filename_usage_in_bytes = strdupz(filename);
1372
+ cg->memory.enabled_usage = cgroup_enable_memory;
1373
+ debug(D_CGROUP, "memory.usage_in_bytes filename for cgroup '%s': '%s'", cg->id, cg->memory.filename_usage_in_bytes);
1374
}
1288
- if(unlikely(!cg->memory.filename_msw_usage_in_bytes)) {
1289
- snprintfz(filename, FILENAME_MAX, "%s%s/memory.msw_usage_in_bytes", cgroup_memory_base, cg->id);
1290
- if(likely(stat(filename, &buf) != -1)) {
1291
- cg->memory.filename_msw_usage_in_bytes = strdupz(filename);
1292
- debug(D_CGROUP, "memory.msw_usage_in_bytes filename for cgroup '%s': '%s'", cg->id, cg->memory.filename_msw_usage_in_bytes);
1293
- }
1294
- else
1295
- debug(D_CGROUP, "memory.msw_usage_in_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1375
+ else
1376
+ debug(D_CGROUP, "memory.usage_in_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1377
+ }
1378
+
1379
+ if(unlikely(cgroup_enable_swap && !cg->memory.filename_msw_usage_in_bytes)) {
1380
+ snprintfz(filename, FILENAME_MAX, "%s%s/memory.msw_usage_in_bytes", cgroup_memory_base, cg->id);
1381
+ if(likely(stat(filename, &buf) != -1)) {
1382
+ cg->memory.filename_msw_usage_in_bytes = strdupz(filename);
1383
+ cg->memory.enabled_swap = cgroup_enable_swap;
1384
+ debug(D_CGROUP, "memory.msw_usage_in_bytes filename for cgroup '%s': '%s'", cg->id, cg->memory.filename_msw_usage_in_bytes);
1385
}
1297
- if(unlikely(!cg->memory.filename_failcnt)) {
1298
- snprintfz(filename, FILENAME_MAX, "%s%s/memory.failcnt", cgroup_memory_base, cg->id);
1299
- if(likely(stat(filename, &buf) != -1)) {
1300
- cg->memory.filename_failcnt = strdupz(filename);
1301
- debug(D_CGROUP, "memory.failcnt filename for cgroup '%s': '%s'", cg->id, cg->memory.filename_failcnt);
1302
- }
1303
- else
1304
- debug(D_CGROUP, "memory.failcnt file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1386
+ else
1387
+ debug(D_CGROUP, "memory.msw_usage_in_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1388
+ }
1389
+
1390
+ if(unlikely(cgroup_enable_memory_failcnt && !cg->memory.filename_failcnt)) {
1391
+ snprintfz(filename, FILENAME_MAX, "%s%s/memory.failcnt", cgroup_memory_base, cg->id);
1392
+ if(likely(stat(filename, &buf) != -1)) {
1393
+ cg->memory.filename_failcnt = strdupz(filename);
1394
+ cg->memory.enabled_failcnt = cgroup_enable_memory_failcnt;
1395
+ debug(D_CGROUP, "memory.failcnt filename for cgroup '%s': '%s'", cg->id, cg->memory.filename_failcnt);
1396
}
1397
+ else
1398
+ debug(D_CGROUP, "memory.failcnt file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1399
}
1400
1308
- if(unlikely(cgroup_enable_blkio)) {
1309
- if(unlikely(!cg->io_service_bytes.filename)) {
1310
- snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_service_bytes", cgroup_blkio_base, cg->id);
1311
- if(likely(stat(filename, &buf) != -1)) {
1312
- cg->io_service_bytes.filename = strdupz(filename);
1313
- debug(D_CGROUP, "io_service_bytes filename for cgroup '%s': '%s'", cg->id, cg->io_service_bytes.filename);
1314
- }
1315
- else
1316
- debug(D_CGROUP, "io_service_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1401
+ if(unlikely(cgroup_enable_blkio_io && !cg->io_service_bytes.filename)) {
1402
+ snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_service_bytes", cgroup_blkio_base, cg->id);
1403
+ if(likely(stat(filename, &buf) != -1)) {
1404
+ cg->io_service_bytes.filename = strdupz(filename);
1405
+ cg->io_service_bytes.enabled = cgroup_enable_blkio_io;
1406
+ debug(D_CGROUP, "io_service_bytes filename for cgroup '%s': '%s'", cg->id, cg->io_service_bytes.filename);
1407
}
1408
+ else
1409
+ debug(D_CGROUP, "io_service_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1410
+ }
1411
1319
- if(unlikely(!cg->io_serviced.filename)) {
1320
- snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_serviced", cgroup_blkio_base, cg->id);
1321
- if(likely(stat(filename, &buf) != -1)) {
1322
- cg->io_serviced.filename = strdupz(filename);
1323
- debug(D_CGROUP, "io_serviced filename for cgroup '%s': '%s'", cg->id, cg->io_serviced.filename);
1324
- }
1325
- else
1326
- debug(D_CGROUP, "io_serviced file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1412
+ if(unlikely(cgroup_enable_blkio_ops && !cg->io_serviced.filename)) {
1413
+ snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_serviced", cgroup_blkio_base, cg->id);
1414
+ if(likely(stat(filename, &buf) != -1)) {
1415
+ cg->io_serviced.filename = strdupz(filename);
1416
+ cg->io_serviced.enabled = cgroup_enable_blkio_ops;
1417
+ debug(D_CGROUP, "io_serviced filename for cgroup '%s': '%s'", cg->id, cg->io_serviced.filename);
1418
}
1419
+ else
1420
+ debug(D_CGROUP, "io_serviced file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1421
+ }
1422
1329
- if(unlikely(!cg->throttle_io_service_bytes.filename)) {
1330
- snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_service_bytes", cgroup_blkio_base, cg->id);
1331
- if(likely(stat(filename, &buf) != -1)) {
1332
- cg->throttle_io_service_bytes.filename = strdupz(filename);
1333
- debug(D_CGROUP, "throttle_io_service_bytes filename for cgroup '%s': '%s'", cg->id, cg->throttle_io_service_bytes.filename);
1334
- }
1335
- else
1336
- debug(D_CGROUP, "throttle_io_service_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1423
+ if(unlikely(cgroup_enable_blkio_throttle_io && !cg->throttle_io_service_bytes.filename)) {
1424
+ snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_service_bytes", cgroup_blkio_base, cg->id);
1425
+ if(likely(stat(filename, &buf) != -1)) {
1426
+ cg->throttle_io_service_bytes.filename = strdupz(filename);
1427
+ cg->throttle_io_service_bytes.enabled = cgroup_enable_blkio_throttle_io;
1428
+ debug(D_CGROUP, "throttle_io_service_bytes filename for cgroup '%s': '%s'", cg->id, cg->throttle_io_service_bytes.filename);
1429
}
1430
+ else
1431
+ debug(D_CGROUP, "throttle_io_service_bytes file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1432
+ }
1433
1339
- if(unlikely(!cg->throttle_io_serviced.filename)) {
1340
- snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_serviced", cgroup_blkio_base, cg->id);
1341
- if(likely(stat(filename, &buf) != -1)) {
1342
- cg->throttle_io_serviced.filename = strdupz(filename);
1343
- debug(D_CGROUP, "throttle_io_serviced filename for cgroup '%s': '%s'", cg->id, cg->throttle_io_serviced.filename);
1344
- }
1345
- else
1346
- debug(D_CGROUP, "throttle_io_serviced file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1434
+ if(unlikely(cgroup_enable_blkio_throttle_ops && !cg->throttle_io_serviced.filename)) {
1435
+ snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_serviced", cgroup_blkio_base, cg->id);
1436
+ if(likely(stat(filename, &buf) != -1)) {
1437
+ cg->throttle_io_serviced.filename = strdupz(filename);
1438
+ cg->throttle_io_serviced.enabled = cgroup_enable_blkio_throttle_ops;
1439
+ debug(D_CGROUP, "throttle_io_serviced filename for cgroup '%s': '%s'", cg->id, cg->throttle_io_serviced.filename);
1440
}
1441
+ else
1442
+ debug(D_CGROUP, "throttle_io_serviced file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1443
+ }
1444
1349
- if(unlikely(!cg->io_merged.filename)) {
1350
- snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_merged", cgroup_blkio_base, cg->id);
1351
- if(likely(stat(filename, &buf) != -1)) {
1352
- cg->io_merged.filename = strdupz(filename);
1353
- debug(D_CGROUP, "io_merged filename for cgroup '%s': '%s'", cg->id, cg->io_merged.filename);
1354
- }
1355
- else
1356
- debug(D_CGROUP, "io_merged file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1445
+ if(unlikely(cgroup_enable_blkio_merged_ops && !cg->io_merged.filename)) {
1446
+ snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_merged", cgroup_blkio_base, cg->id);
1447
+ if(likely(stat(filename, &buf) != -1)) {
1448
+ cg->io_merged.filename = strdupz(filename);
1449
+ cg->io_merged.enabled = cgroup_enable_blkio_merged_ops;
1450
+ debug(D_CGROUP, "io_merged filename for cgroup '%s': '%s'", cg->id, cg->io_merged.filename);
1451
}
1452
+ else
1453
+ debug(D_CGROUP, "io_merged file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1454
+ }
1455
1359
- if(unlikely(!cg->io_queued.filename)) {
1360
- snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_queued", cgroup_blkio_base, cg->id);
1361
- if(likely(stat(filename, &buf) != -1)) {
1362
- cg->io_queued.filename = strdupz(filename);
1363
- debug(D_CGROUP, "io_queued filename for cgroup '%s': '%s'", cg->id, cg->io_queued.filename);
1364
- }
1365
- else
1366
- debug(D_CGROUP, "io_queued file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1456
+ if(unlikely(cgroup_enable_blkio_queued_ops && !cg->io_queued.filename)) {
1457
+ snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_queued", cgroup_blkio_base, cg->id);
1458
+ if(likely(stat(filename, &buf) != -1)) {
1459
+ cg->io_queued.filename = strdupz(filename);
1460
+ cg->io_queued.enabled = cgroup_enable_blkio_queued_ops;
1461
+ debug(D_CGROUP, "io_queued filename for cgroup '%s': '%s'", cg->id, cg->io_queued.filename);
1462
}
1463
+ else
1464
+ debug(D_CGROUP, "io_queued file for cgroup '%s': '%s' does not exist.", cg->id, filename);
1465
}
1466
}
1467
@@ -1702,6 +1799,16 @@ void update_services_charts(int update_every,
1799
rrdset_done(st_throttle_ops_read);
1800
rrdset_done(st_throttle_ops_write);
1801
}
1802
+
1803
+ if(likely(do_queued_ops)) {
1804
+ rrdset_done(st_queued_ops_read);
1805
+ rrdset_done(st_queued_ops_write);
1806
+ }
1807
+
1808
+ if(likely(do_merged_ops)) {
1809
+ rrdset_done(st_merged_ops_read);
1810
+ rrdset_done(st_merged_ops_write);
1811
+ }
1812
}
1813
1814
static inline char *cgroup_chart_type(char *buffer, const char *id, size_t len) {
@@ -1739,22 +1846,24 @@ void update_cgroup_charts(int update_every) {
1846
continue;
1847
1848
if(likely(cgroup_enable_systemd_services && cg->options & CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE)) {
1742
- if(cg->cpuacct_stat.updated && (cg->cpuacct_stat.user || cg->cpuacct_stat.system)) services_do_cpu++;
1743
- if(cg->memory.usage_in_bytes_updated && (cg->memory.usage_in_bytes)) services_do_mem_usage++;
1744
- if(cg->memory.failcnt_updated && (cg->memory.failcnt)) services_do_mem_failcnt++;
1745
- if(cg->memory.msw_usage_in_bytes_updated && (cg->memory.msw_usage_in_bytes)) services_do_swap_usage++;
1746
- if(cg->io_service_bytes.updated && (cg->io_service_bytes.Read || cg->io_service_bytes.Write)) services_do_io++;
1747
- if(cg->io_serviced.updated && (cg->io_serviced.Read || cg->io_serviced.Write)) services_do_io_ops++;
1748
- if(cg->throttle_io_service_bytes.updated && (cg->throttle_io_service_bytes.Read || cg->throttle_io_service_bytes.Write)) services_do_throttle_io++;
1749
- if(cg->throttle_io_serviced.updated && (cg->throttle_io_serviced.Read || cg->throttle_io_serviced.Write)) services_do_throttle_ops++;
1750
- if(cg->io_queued.updated && (cg->io_queued.Read || cg->io_queued.Write)) services_do_queued_ops++;
1751
- if(cg->io_merged.updated && (cg->io_merged.Read || cg->io_merged.Write)) services_do_merged_ops++;
1849
+ if(cg->cpuacct_stat.updated && cg->cpuacct_stat.enabled == CONFIG_ONDEMAND_YES) services_do_cpu++;
1850
+
1851
+ if(cg->memory.usage_in_bytes_updated && cg->memory.enabled_usage == CONFIG_ONDEMAND_YES) services_do_mem_usage++;
1852
+ if(cg->memory.failcnt_updated && cg->memory.enabled_failcnt == CONFIG_ONDEMAND_YES) services_do_mem_failcnt++;
1853
+ if(cg->memory.msw_usage_in_bytes_updated && cg->memory.enabled_swap == CONFIG_ONDEMAND_YES) services_do_swap_usage++;
1854
+
1855
+ if(cg->io_service_bytes.updated && cg->io_service_bytes.enabled == CONFIG_ONDEMAND_YES) services_do_io++;
1856
+ if(cg->io_serviced.updated && cg->io_serviced.enabled == CONFIG_ONDEMAND_YES) services_do_io_ops++;
1857
+ if(cg->throttle_io_service_bytes.updated && cg->throttle_io_service_bytes.enabled == CONFIG_ONDEMAND_YES) services_do_throttle_io++;
1858
+ if(cg->throttle_io_serviced.updated && cg->throttle_io_serviced.enabled == CONFIG_ONDEMAND_YES) services_do_throttle_ops++;
1859
+ if(cg->io_queued.updated && cg->io_queued.enabled == CONFIG_ONDEMAND_YES) services_do_queued_ops++;
1860
+ if(cg->io_merged.updated && cg->io_merged.enabled == CONFIG_ONDEMAND_YES) services_do_merged_ops++;
1861
continue;
1862
}
1863
1864
type[0] = '\0';
1865
1757
- if(likely(cg->cpuacct_stat.updated)) {
1866
+ if(likely(cg->cpuacct_stat.updated && cg->cpuacct_stat.enabled == CONFIG_ONDEMAND_YES)) {
1867
if(unlikely(!cg->st_cpu)) {
1868
cg->st_cpu = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "cpu");
1869
if(likely(!cg->st_cpu)) {
@@ -1772,7 +1881,7 @@ void update_cgroup_charts(int update_every) {
1881
rrdset_done(cg->st_cpu);
1882
}
1883
1775
- if(likely(cg->cpuacct_usage.updated)) {
1884
+ if(likely(cg->cpuacct_usage.updated && cg->cpuacct_usage.enabled == CONFIG_ONDEMAND_YES)) {
1885
char id[RRD_ID_LENGTH_MAX + 1];
1886
unsigned int i;
1887
@@ -1797,33 +1906,31 @@ void update_cgroup_charts(int update_every) {
1906
rrdset_done(cg->st_cpu_per_core);
1907
}
1908
1800
- if(likely(cg->memory.updated)) {
1801
- if(likely(cg->memory.cache || cg->memory.rss || cg->memory.rss_huge || cg->memory.mapped_file)) {
1802
- if(unlikely(!cg->st_mem)) {
1803
- cg->st_mem = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "mem");
1804
- if(likely(!cg->st_mem)) {
1805
- snprintfz(title, CHART_TITLE_MAX, "Memory Usage for cgroup %s", cg->chart_title);
1806
- cg->st_mem = rrdset_create(type, "mem", NULL, "mem", "cgroup.mem", title, "MB", 40210, update_every, RRDSET_TYPE_STACKED);
1807
- }
1808
-
1809
- rrddim_add(cg->st_mem, "cache", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1810
- rrddim_add(cg->st_mem, "rss", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1811
- if(cg->memory.has_dirty_swap)
1812
- rrddim_add(cg->st_mem, "swap", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1813
- rrddim_add(cg->st_mem, "rss_huge", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1814
- rrddim_add(cg->st_mem, "mapped_file", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1909
+ if(likely(cg->memory.updated && cg->memory.enabled_detailed == CONFIG_ONDEMAND_YES)) {
1910
+ if(unlikely(!cg->st_mem)) {
1911
+ cg->st_mem = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "mem");
1912
+ if(likely(!cg->st_mem)) {
1913
+ snprintfz(title, CHART_TITLE_MAX, "Memory Usage for cgroup %s", cg->chart_title);
1914
+ cg->st_mem = rrdset_create(type, "mem", NULL, "mem", "cgroup.mem", title, "MB", 40210, update_every, RRDSET_TYPE_STACKED);
1915
}
1816
- else
1817
- rrdset_next(cg->st_mem);
1916
1819
- rrddim_set(cg->st_mem, "cache", cg->memory.cache);
1820
- rrddim_set(cg->st_mem, "rss", cg->memory.rss);
1917
+ rrddim_add(cg->st_mem, "cache", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1918
+ rrddim_add(cg->st_mem, "rss", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1919
if(cg->memory.has_dirty_swap)
1822
- rrddim_set(cg->st_mem, "swap", cg->memory.swap);
1823
- rrddim_set(cg->st_mem, "rss_huge", cg->memory.rss_huge);
1824
- rrddim_set(cg->st_mem, "mapped_file", cg->memory.mapped_file);
1825
- rrdset_done(cg->st_mem);
1920
+ rrddim_add(cg->st_mem, "swap", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1921
+ rrddim_add(cg->st_mem, "rss_huge", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1922
+ rrddim_add(cg->st_mem, "mapped_file", NULL, 1, 1024 * 1024, RRDDIM_ABSOLUTE);
1923
}
1924
+ else
1925
+ rrdset_next(cg->st_mem);
1926
+
1927
+ rrddim_set(cg->st_mem, "cache", cg->memory.cache);
1928
+ rrddim_set(cg->st_mem, "rss", cg->memory.rss);
1929
+ if(cg->memory.has_dirty_swap)
1930
+ rrddim_set(cg->st_mem, "swap", cg->memory.swap);
1931
+ rrddim_set(cg->st_mem, "rss_huge", cg->memory.rss_huge);
1932
+ rrddim_set(cg->st_mem, "mapped_file", cg->memory.mapped_file);
1933
+ rrdset_done(cg->st_mem);
1934
1935
if(unlikely(!cg->st_writeback)) {
1936
cg->st_writeback = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "writeback");
@@ -1844,44 +1951,40 @@ void update_cgroup_charts(int update_every) {
1951
rrddim_set(cg->st_writeback, "writeback", cg->memory.writeback);
1952
rrdset_done(cg->st_writeback);
1953
1847
- if(likely(cg->memory.pgpgin || cg->memory.pgpgout)) {
1848
- if(unlikely(!cg->st_mem_activity)) {
1849
- cg->st_mem_activity = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "mem_activity");
1850
- if(likely(!cg->st_mem_activity)) {
1851
- snprintfz(title, CHART_TITLE_MAX, "Memory Activity for cgroup %s", cg->chart_title);
1852
- cg->st_mem_activity = rrdset_create(type, "mem_activity", NULL, "mem", "cgroup.mem_activity", title, "MB/s", 40400, update_every, RRDSET_TYPE_LINE);
1853
- }
1854
- rrddim_add(cg->st_mem_activity, "pgpgin", "in", sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1855
- rrddim_add(cg->st_mem_activity, "pgpgout", "out", -sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1954
+ if(unlikely(!cg->st_mem_activity)) {
1955
+ cg->st_mem_activity = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "mem_activity");
1956
+ if(likely(!cg->st_mem_activity)) {
1957
+ snprintfz(title, CHART_TITLE_MAX, "Memory Activity for cgroup %s", cg->chart_title);
1958
+ cg->st_mem_activity = rrdset_create(type, "mem_activity", NULL, "mem", "cgroup.mem_activity", title, "MB/s", 40400, update_every, RRDSET_TYPE_LINE);
1959
}
1857
- else
1858
- rrdset_next(cg->st_mem_activity);
1859
-
1860
- rrddim_set(cg->st_mem_activity, "pgpgin", cg->memory.pgpgin);
1861
- rrddim_set(cg->st_mem_activity, "pgpgout", cg->memory.pgpgout);
1862
- rrdset_done(cg->st_mem_activity);
1960
+ rrddim_add(cg->st_mem_activity, "pgpgin", "in", sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1961
+ rrddim_add(cg->st_mem_activity, "pgpgout", "out", -sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1962
}
1963
+ else
1964
+ rrdset_next(cg->st_mem_activity);
1965
1865
- if(likely(cg->memory.pgfault || cg->memory.pgmajfault)) {
1866
- if(unlikely(!cg->st_pgfaults)) {
1867
- cg->st_pgfaults = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "pgfaults");
1868
- if(likely(!cg->st_pgfaults)) {
1869
- snprintfz(title, CHART_TITLE_MAX, "Memory Page Faults for cgroup %s", cg->chart_title);
1870
- cg->st_pgfaults = rrdset_create(type, "pgfaults", NULL, "mem", "cgroup.pgfaults", title, "MB/s", 40500, update_every, RRDSET_TYPE_LINE);
1871
- }
1872
- rrddim_add(cg->st_pgfaults, "pgfault", NULL, sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1873
- rrddim_add(cg->st_pgfaults, "pgmajfault", "swap", -sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1874
- }
1875
- else
1876
- rrdset_next(cg->st_pgfaults);
1966
+ rrddim_set(cg->st_mem_activity, "pgpgin", cg->memory.pgpgin);
1967
+ rrddim_set(cg->st_mem_activity, "pgpgout", cg->memory.pgpgout);
1968
+ rrdset_done(cg->st_mem_activity);
1969
1878
- rrddim_set(cg->st_pgfaults, "pgfault", cg->memory.pgfault);
1879
- rrddim_set(cg->st_pgfaults, "pgmajfault", cg->memory.pgmajfault);
1880
- rrdset_done(cg->st_pgfaults);
1970
+ if(unlikely(!cg->st_pgfaults)) {
1971
+ cg->st_pgfaults = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "pgfaults");
1972
+ if(likely(!cg->st_pgfaults)) {
1973
+ snprintfz(title, CHART_TITLE_MAX, "Memory Page Faults for cgroup %s", cg->chart_title);
1974
+ cg->st_pgfaults = rrdset_create(type, "pgfaults", NULL, "mem", "cgroup.pgfaults", title, "MB/s", 40500, update_every, RRDSET_TYPE_LINE);
1975
+ }
1976
+ rrddim_add(cg->st_pgfaults, "pgfault", NULL, sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1977
+ rrddim_add(cg->st_pgfaults, "pgmajfault", "swap", -sysconf(_SC_PAGESIZE), 1024 * 1024, RRDDIM_INCREMENTAL);
1978
}
1979
+ else
1980
+ rrdset_next(cg->st_pgfaults);
1981
+
1982
+ rrddim_set(cg->st_pgfaults, "pgfault", cg->memory.pgfault);
1983
+ rrddim_set(cg->st_pgfaults, "pgmajfault", cg->memory.pgmajfault);
1984
+ rrdset_done(cg->st_pgfaults);
1985
}
1986
1884
- if(likely(cg->memory.usage_in_bytes_updated)) {
1987
+ if(likely(cg->memory.usage_in_bytes_updated && cg->memory.enabled_usage == CONFIG_ONDEMAND_YES)) {
1988
if(unlikely(!cg->st_mem_usage)) {
1989
cg->st_mem_usage = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "mem_usage");
1990
if(likely(!cg->st_mem_usage)) {
@@ -1899,7 +2002,7 @@ void update_cgroup_charts(int update_every) {
2002
rrdset_done(cg->st_mem_usage);
2003
}
2004
1902
- if(likely(cg->memory.failcnt_updated && cg->memory.failcnt)) {
2005
+ if(likely(cg->memory.failcnt_updated && cg->memory.enabled_failcnt == CONFIG_ONDEMAND_YES)) {
2006
if(unlikely(!cg->st_mem_failcnt)) {
2007
cg->st_mem_failcnt = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "mem_failcnt");
2008
if(likely(!cg->st_mem_failcnt)) {
@@ -1915,7 +2018,7 @@ void update_cgroup_charts(int update_every) {
2018
rrdset_done(cg->st_mem_failcnt);
2019
}
2020
1918
- if(likely(cg->io_service_bytes.updated && (cg->io_service_bytes.Read || cg->io_service_bytes.Write))) {
2021
+ if(likely(cg->io_service_bytes.updated && cg->io_service_bytes.enabled == CONFIG_ONDEMAND_YES)) {
2022
if(unlikely(!cg->st_io)) {
2023
cg->st_io = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "io");
2024
if(likely(!cg->st_io)) {
@@ -1933,7 +2036,7 @@ void update_cgroup_charts(int update_every) {
2036
rrdset_done(cg->st_io);
2037
}
2038
1936
- if(likely(cg->io_serviced.updated && (cg->io_serviced.Read || cg->io_serviced.Write))) {
2039
+ if(likely(cg->io_serviced.updated && cg->io_serviced.enabled == CONFIG_ONDEMAND_YES)) {
2040
if(unlikely(!cg->st_serviced_ops)) {
2041
cg->st_serviced_ops = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "serviced_ops");
2042
if(likely(!cg->st_serviced_ops)) {
@@ -1951,7 +2054,7 @@ void update_cgroup_charts(int update_every) {
2054
rrdset_done(cg->st_serviced_ops);
2055
}
2056
1954
- if(likely(cg->throttle_io_service_bytes.updated && (cg->throttle_io_service_bytes.Read || cg->throttle_io_service_bytes.Write))) {
2057
+ if(likely(cg->throttle_io_service_bytes.updated && cg->throttle_io_service_bytes.enabled == CONFIG_ONDEMAND_YES)) {
2058
if(unlikely(!cg->st_throttle_io)) {
2059
cg->st_throttle_io = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "throttle_io");
2060
if(likely(!cg->st_throttle_io)) {
@@ -1969,7 +2072,7 @@ void update_cgroup_charts(int update_every) {
2072
rrdset_done(cg->st_throttle_io);
2073
}
2074
1972
- if(likely(cg->throttle_io_serviced.updated && (cg->throttle_io_serviced.Read || cg->throttle_io_serviced.Write))) {
2075
+ if(likely(cg->throttle_io_serviced.updated && cg->throttle_io_serviced.enabled == CONFIG_ONDEMAND_YES)) {
2076
if(unlikely(!cg->st_throttle_serviced_ops)) {
2077
cg->st_throttle_serviced_ops = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "throttle_serviced_ops");
2078
if(likely(!cg->st_throttle_serviced_ops)) {
@@ -1987,7 +2090,7 @@ void update_cgroup_charts(int update_every) {
2090
rrdset_done(cg->st_throttle_serviced_ops);
2091
}
2092
1990
- if(likely(cg->io_queued.updated)) {
2093
+ if(likely(cg->io_queued.updated && cg->io_queued.enabled == CONFIG_ONDEMAND_YES)) {
2094
if(unlikely(!cg->st_queued_ops)) {
2095
cg->st_queued_ops = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "queued_ops");
2096
if(likely(!cg->st_queued_ops)) {
@@ -2005,7 +2108,7 @@ void update_cgroup_charts(int update_every) {
2108
rrdset_done(cg->st_queued_ops);
2109
}
2110
2008
- if(likely(cg->io_merged.updated && (cg->io_merged.Read || cg->io_merged.Write))) {
2111
+ if(likely(cg->io_merged.updated && cg->io_merged.enabled == CONFIG_ONDEMAND_YES)) {
2112
if(unlikely(!cg->st_merged_ops)) {
2113
cg->st_merged_ops = rrdset_find_bytype(cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX), "merged_ops");
2114
if(likely(!cg->st_merged_ops)) {