cgroups: collect pids/pids.current (#16369)
* cgroups collect pids/pids.current * change dim name
Ilya Mashchenko committed
Nov 9, 2023 at 15:23 UTC
eafc0f045c7bd9667e23b34e108282938fb10eea
5 files changed
+166
-36
collectors/cgroups.plugin/cgroup-charts.c
+40
@@ -1484,3 +1484,43 @@ void update_io_full_pressure_stall_time_chart(struct cgroup *cg) {
1484
rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1485
rrdset_done(chart);
1486
}
1487
+
1488
+void update_pids_current_chart(struct cgroup *cg) {
1489
+ RRDSET *chart = cg->st_pids;
1490
+
1491
+ if (unlikely(!cg->st_pids)) {
1492
+ char *title;
1493
+ char *context;
1494
+ int prio;
1495
+ if (is_cgroup_systemd_service(cg)) {
1496
+ title = "Systemd Services Number of Processes";
1497
+ context = "systemd.service.pids.current";
1498
+ prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 70;
1499
+ } else {
1500
+ title = "Number of processes";
1501
+ context = k8s_is_kubepod(cg) ? "k8s.cgroup.pids_current" : "cgroup.pids_current";
1502
+ prio = cgroup_containers_chart_priority + 2150;
1503
+ }
1504
+
1505
+ char buff[RRD_ID_LENGTH_MAX + 1];
1506
+ chart = cg->st_pids = rrdset_create_localhost(
1507
+ cgroup_chart_type(buff, cg),
1508
+ "pids_current",
1509
+ NULL,
1510
+ "pids",
1511
+ context,
1512
+ title,
1513
+ "pids",
1514
+ PLUGIN_CGROUPS_NAME,
1515
+ is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1516
+ prio,
1517
+ cgroup_update_every,
1518
+ RRDSET_TYPE_LINE);
1519
+
1520
+ rrdset_update_rrdlabels(chart, cg->chart_labels);
1521
+ cg->st_pids_rd_pids_current = rrddim_add(chart, "pids", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1522
+ }
1523
+
1524
+ rrddim_set_by_pointer(chart, cg->st_pids_rd_pids_current, (collected_number)cg->pids.pids_current);
1525
+ rrdset_done(chart);
1526
+}
collectors/cgroups.plugin/cgroup-discovery.c
+18
@@ -75,6 +75,7 @@ static inline void cgroup_free(struct cgroup *cg) {
75
if(cg->st_throttle_serviced_ops) rrdset_is_obsolete___safe_from_collector_thread(cg->st_throttle_serviced_ops);
76
if(cg->st_queued_ops) rrdset_is_obsolete___safe_from_collector_thread(cg->st_queued_ops);
77
if(cg->st_merged_ops) rrdset_is_obsolete___safe_from_collector_thread(cg->st_merged_ops);
78
+ if(cg->st_pids) rrdset_is_obsolete___safe_from_collector_thread(cg->st_pids);
79
80
freez(cg->filename_cpuset_cpus);
81
freez(cg->filename_cpu_cfs_period);
@@ -105,6 +106,7 @@ static inline void cgroup_free(struct cgroup *cg) {
106
107
freez(cg->io_merged.filename);
108
freez(cg->io_queued.filename);
109
+ freez(cg->pids.pids_current_filename);
110
111
free_pressure(&cg->cpu_pressure);
112
free_pressure(&cg->io_pressure);
@@ -598,6 +600,14 @@ static inline void discovery_update_filenames_cgroup_v1(struct cgroup *cg) {
600
}
601
}
602
}
603
+
604
+ // Pids
605
+ if (unlikely(!cg->pids.pids_current_filename)) {
606
+ snprintfz(filename, FILENAME_MAX, "%s%s/pids.current", cgroup_pids_base, cg->id);
607
+ if (likely(stat(filename, &buf) != -1)) {
608
+ cg->pids.pids_current_filename = strdupz(filename);
609
+ }
610
+ }
611
}
612
613
static inline void discovery_update_filenames_cgroup_v2(struct cgroup *cg) {
@@ -713,6 +723,14 @@ static inline void discovery_update_filenames_cgroup_v2(struct cgroup *cg) {
723
cg->irq_pressure.full.enabled = cgroup_enable_pressure_irq_full;
724
}
725
}
726
+
727
+ // Pids
728
+ if (unlikely(!cg->pids.pids_current_filename)) {
729
+ snprintfz(filename, FILENAME_MAX, "%s%s/pids.current", cgroup_unified_base, cg->id);
730
+ if (likely(stat(filename, &buf) != -1)) {
731
+ cg->pids.pids_current_filename = strdupz(filename);
732
+ }
733
+ }
734
}
735
736
static inline void discovery_update_filenames_all_cgroups() {
collectors/cgroups.plugin/cgroup-internals.h
+21
-5
@@ -25,6 +25,12 @@ struct blkio {
25
*/
26
};
27
28
+struct pids {
29
+ char *pids_current_filename;
30
+ int pids_current_updated;
31
+ unsigned long long pids_current;
32
+};
33
+
34
// https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
35
struct memory {
36
ARL_BASE *arl_base;
@@ -218,6 +224,8 @@ struct cgroup {
224
struct blkio io_merged; // operations
225
struct blkio io_queued; // operations
226
227
+ struct pids pids;
228
+
229
struct cgroup_network_interface *interfaces;
230
231
struct pressure cpu_pressure;
@@ -225,7 +233,7 @@ struct cgroup {
233
struct pressure memory_pressure;
234
struct pressure irq_pressure;
235
228
- // per cgroup charts
236
+ // Cpu
237
RRDSET *st_cpu;
238
RRDDIM *st_cpu_rd_user;
239
RRDDIM *st_cpu_rd_system;
@@ -236,6 +244,7 @@ struct cgroup {
244
RRDSET *st_cpu_throttled_time;
245
RRDSET *st_cpu_shares;
246
247
+ // Memory
248
RRDSET *st_mem;
249
RRDDIM *st_mem_rd_ram;
250
RRDDIM *st_mem_rd_swap;
@@ -248,6 +257,7 @@ struct cgroup {
257
RRDSET *st_mem_usage_limit;
258
RRDSET *st_mem_failcnt;
259
260
+ // Blkio
261
RRDSET *st_io;
262
RRDDIM *st_io_rd_read;
263
RRDDIM *st_io_rd_written;
@@ -263,6 +273,10 @@ struct cgroup {
273
RRDSET *st_queued_ops;
274
RRDSET *st_merged_ops;
275
276
+ // Pids
277
+ RRDSET *st_pids;
278
+ RRDDIM *st_pids_rd_pids_current;
279
+
280
// per cgroup chart variables
281
char *filename_cpuset_cpus;
282
unsigned long long cpuset_cpus;
@@ -307,10 +321,6 @@ extern uv_mutex_t cgroup_root_mutex;
321
322
void cgroup_discovery_worker(void *ptr);
323
310
-
311
-
312
-
313
-
324
extern int is_inside_k8s;
325
extern long system_page_size;
326
extern int cgroup_enable_cpuacct_stat;
@@ -350,6 +360,7 @@ extern char *cgroup_cpuacct_base;
360
extern char *cgroup_cpuset_base;
361
extern char *cgroup_blkio_base;
362
extern char *cgroup_memory_base;
363
+extern char *cgroup_pids_base;
364
extern char *cgroup_devices_base;
365
extern char *cgroup_unified_base;
366
extern int cgroup_root_count;
@@ -478,18 +489,23 @@ void update_throttle_io_serviced_ops_chart(struct cgroup *cg);
489
void update_io_queued_ops_chart(struct cgroup *cg);
490
void update_io_merged_ops_chart(struct cgroup *cg);
491
492
+void update_pids_current_chart(struct cgroup *cg);
493
+
494
void update_cpu_some_pressure_chart(struct cgroup *cg);
495
void update_cpu_some_pressure_stall_time_chart(struct cgroup *cg);
496
void update_cpu_full_pressure_chart(struct cgroup *cg);
497
void update_cpu_full_pressure_stall_time_chart(struct cgroup *cg);
498
+
499
void update_mem_some_pressure_chart(struct cgroup *cg);
500
void update_mem_some_pressure_stall_time_chart(struct cgroup *cg);
501
void update_mem_full_pressure_chart(struct cgroup *cg);
502
void update_mem_full_pressure_stall_time_chart(struct cgroup *cg);
503
+
504
void update_irq_some_pressure_chart(struct cgroup *cg);
505
void update_irq_some_pressure_stall_time_chart(struct cgroup *cg);
506
void update_irq_full_pressure_chart(struct cgroup *cg);
507
void update_irq_full_pressure_stall_time_chart(struct cgroup *cg);
508
+
509
void update_io_some_pressure_chart(struct cgroup *cg);
510
void update_io_some_pressure_stall_time_chart(struct cgroup *cg);
511
void update_io_full_pressure_chart(struct cgroup *cg);
collectors/cgroups.plugin/cgroup-top.c
+24
-1
@@ -115,6 +115,7 @@ int cgroup_function_cgroup_top(BUFFER *wb, int timeout __maybe_unused, const cha
115
buffer_json_member_add_string(wb, "help", RRDFUNCTIONS_CGTOP_HELP);
116
buffer_json_member_add_array(wb, "data");
117
118
+ double max_pids = 0.0;
119
double max_cpu = 0.0;
120
double max_ram = 0.0;
121
double max_disk_io_read = 0.0;
@@ -139,6 +140,8 @@ int cgroup_function_cgroup_top(BUFFER *wb, int timeout __maybe_unused, const cha
140
else
141
buffer_json_add_array_item_string(wb, "cgroup"); // Kind
142
143
+ double pids_current = rrddim_get_last_stored_value(cg->st_pids_rd_pids_current, &max_pids, 1.0);
144
+
145
double cpu = NAN;
146
if (cg->st_cpu_rd_user && cg->st_cpu_rd_system) {
147
cpu = cg->st_cpu_rd_user->collector.last_stored_value + cg->st_cpu_rd_system->collector.last_stored_value;
@@ -152,7 +155,6 @@ int cgroup_function_cgroup_top(BUFFER *wb, int timeout __maybe_unused, const cha
155
rd = cg->st_throttle_io_rd_written ? cg->st_throttle_io_rd_written : cg->st_io_rd_written;
156
double disk_io_written = rrddim_get_last_stored_value(rd, &max_disk_io_written, 1024.0);
157
155
-
158
NETDATA_DOUBLE received, sent;
159
cgroup_netdev_get_bandwidth(cg, &received, &sent);
160
if (!isnan(received) && !isnan(sent)) {
@@ -162,6 +164,7 @@ int cgroup_function_cgroup_top(BUFFER *wb, int timeout __maybe_unused, const cha
164
max_net_sent = MAX(max_net_sent, sent);
165
}
166
167
+ buffer_json_add_array_item_double(wb, pids_current);
168
buffer_json_add_array_item_double(wb, cpu);
169
buffer_json_add_array_item_double(wb, ram);
170
buffer_json_add_array_item_double(wb, disk_io_read);
@@ -195,6 +198,14 @@ int cgroup_function_cgroup_top(BUFFER *wb, int timeout __maybe_unused, const cha
198
RRDF_FIELD_OPTS_VISIBLE,
199
NULL);
200
201
+ // PIDs
202
+ buffer_rrdf_table_add_field(wb, field_id++, "PIDs", "Number of Processes Currently in the CGROUP",
203
+ RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
204
+ 0, "pids", max_pids, RRDF_FIELD_SORT_DESCENDING, NULL,
205
+ RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_NONE,
206
+ RRDF_FIELD_OPTS_VISIBLE,
207
+ NULL);
208
+
209
// CPU
210
buffer_rrdf_table_add_field(wb, field_id++, "CPU", "CPU Usage",
211
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
@@ -349,6 +360,7 @@ int cgroup_function_systemd_top(BUFFER *wb, int timeout __maybe_unused, const ch
360
buffer_json_member_add_string(wb, "help", RRDFUNCTIONS_CGTOP_HELP);
361
buffer_json_member_add_array(wb, "data");
362
363
+ double max_pids = 0.0;
364
double max_cpu = 0.0;
365
double max_ram = 0.0;
366
double max_disk_io_read = 0.0;
@@ -366,6 +378,8 @@ int cgroup_function_systemd_top(BUFFER *wb, int timeout __maybe_unused, const ch
378
379
buffer_json_add_array_item_string(wb, cg->name);
380
381
+ double pids_current = rrddim_get_last_stored_value(cg->st_pids_rd_pids_current, &max_pids, 1.0);
382
+
383
double cpu = NAN;
384
if (cg->st_cpu_rd_user && cg->st_cpu_rd_system) {
385
cpu = cg->st_cpu_rd_user->collector.last_stored_value + cg->st_cpu_rd_system->collector.last_stored_value;
@@ -379,6 +393,7 @@ int cgroup_function_systemd_top(BUFFER *wb, int timeout __maybe_unused, const ch
393
rd = cg->st_throttle_io_rd_written ? cg->st_throttle_io_rd_written : cg->st_io_rd_written;
394
double disk_io_written = rrddim_get_last_stored_value(rd, &max_disk_io_written, 1024.0);
395
396
+ buffer_json_add_array_item_double(wb, pids_current);
397
buffer_json_add_array_item_double(wb, cpu);
398
buffer_json_add_array_item_double(wb, ram);
399
buffer_json_add_array_item_double(wb, disk_io_read);
@@ -402,6 +417,14 @@ int cgroup_function_systemd_top(BUFFER *wb, int timeout __maybe_unused, const ch
417
RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY | RRDF_FIELD_OPTS_FULL_WIDTH,
418
NULL);
419
420
+ // PIDs
421
+ buffer_rrdf_table_add_field(wb, field_id++, "PIDs", "Number of Processes Currently in the CGROUP",
422
+ RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
423
+ 0, "pids", max_pids, RRDF_FIELD_SORT_DESCENDING, NULL,
424
+ RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_NONE,
425
+ RRDF_FIELD_OPTS_VISIBLE,
426
+ NULL);
427
+
428
// CPU
429
buffer_rrdf_table_add_field(wb, field_id++, "CPU", "CPU Usage",
430
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
collectors/cgroups.plugin/sys_fs_cgroup.c
+63
-30
@@ -50,6 +50,7 @@ char *cgroup_cpuset_base = NULL;
50
char *cgroup_blkio_base = NULL;
51
char *cgroup_memory_base = NULL;
52
char *cgroup_devices_base = NULL;
53
+char *cgroup_pids_base = NULL;
54
char *cgroup_unified_base = NULL;
55
int cgroup_root_count = 0;
56
int cgroup_root_max = 1000;
@@ -310,54 +311,70 @@ void read_cgroup_plugin_configuration() {
311
cgroup_enable_pressure_memory_full = CONFIG_BOOLEAN_NO;
312
313
mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "cpuacct");
313
- if(!mi) mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "cpuacct");
314
- if(!mi) {
314
+ if (!mi)
315
+ mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "cpuacct");
316
+ if (!mi) {
317
collector_error("CGROUP: cannot find cpuacct mountinfo. Assuming default: /sys/fs/cgroup/cpuacct");
318
s = "/sys/fs/cgroup/cpuacct";
317
- }
318
- else s = mi->mount_point;
319
+ } else
320
+ s = mi->mount_point;
321
set_cgroup_base_path(filename, s);
322
cgroup_cpuacct_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/cpuacct", filename);
323
324
mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "cpuset");
323
- if(!mi) mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "cpuset");
324
- if(!mi) {
325
+ if (!mi)
326
+ mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "cpuset");
327
+ if (!mi) {
328
collector_error("CGROUP: cannot find cpuset mountinfo. Assuming default: /sys/fs/cgroup/cpuset");
329
s = "/sys/fs/cgroup/cpuset";
327
- }
328
- else s = mi->mount_point;
330
+ } else
331
+ s = mi->mount_point;
332
set_cgroup_base_path(filename, s);
333
cgroup_cpuset_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/cpuset", filename);
334
335
mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "blkio");
333
- if(!mi) mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "blkio");
334
- if(!mi) {
336
+ if (!mi)
337
+ mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "blkio");
338
+ if (!mi) {
339
collector_error("CGROUP: cannot find blkio mountinfo. Assuming default: /sys/fs/cgroup/blkio");
340
s = "/sys/fs/cgroup/blkio";
337
- }
338
- else s = mi->mount_point;
341
+ } else
342
+ s = mi->mount_point;
343
set_cgroup_base_path(filename, s);
344
cgroup_blkio_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/blkio", filename);
345
346
mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "memory");
343
- if(!mi) mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "memory");
344
- if(!mi) {
347
+ if (!mi)
348
+ mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "memory");
349
+ if (!mi) {
350
collector_error("CGROUP: cannot find memory mountinfo. Assuming default: /sys/fs/cgroup/memory");
351
s = "/sys/fs/cgroup/memory";
347
- }
348
- else s = mi->mount_point;
352
+ } else
353
+ s = mi->mount_point;
354
set_cgroup_base_path(filename, s);
355
cgroup_memory_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/memory", filename);
356
357
mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "devices");
353
- if(!mi) mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "devices");
354
- if(!mi) {
358
+ if (!mi)
359
+ mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "devices");
360
+ if (!mi) {
361
collector_error("CGROUP: cannot find devices mountinfo. Assuming default: /sys/fs/cgroup/devices");
362
s = "/sys/fs/cgroup/devices";
357
- }
358
- else s = mi->mount_point;
363
+ } else
364
+ s = mi->mount_point;
365
set_cgroup_base_path(filename, s);
366
cgroup_devices_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/devices", filename);
367
+
368
+ mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "pids");
369
+ if (!mi)
370
+ mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "pids");
371
+ if (!mi) {
372
+ collector_error("CGROUP: cannot find pids mountinfo. Assuming default: /sys/fs/cgroup/pids");
373
+ s = "/sys/fs/cgroup/pids";
374
+ } else
375
+ s = mi->mount_point;
376
+ set_cgroup_base_path(filename, s);
377
+ cgroup_pids_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/pids", filename);
378
}
379
else {
380
//cgroup_enable_cpuacct_stat =
@@ -377,22 +394,19 @@ void read_cgroup_plugin_configuration() {
394
cgroup_used_memory = CONFIG_BOOLEAN_NO; //unified cgroups use different values
395
396
//TODO: can there be more than 1 cgroup2 mount point?
380
- mi = mountinfo_find_by_filesystem_super_option(root, "cgroup2", "rw"); //there is no cgroup2 specific super option - for now use 'rw' option
381
- if(mi)
382
- netdata_log_debug(D_CGROUP, "found unified cgroup root using super options, with path: '%s'", mi->mount_point);
383
- if(!mi) {
397
+ //there is no cgroup2 specific super option - for now use 'rw' option
398
+ mi = mountinfo_find_by_filesystem_super_option(root, "cgroup2", "rw");
399
+ if (!mi) {
400
mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup2", "cgroup");
385
- if(mi)
386
- netdata_log_debug(D_CGROUP, "found unified cgroup root using mountsource info, with path: '%s'", mi->mount_point);
401
}
388
- if(!mi) {
402
+ if (!mi) {
403
collector_error("CGROUP: cannot find cgroup2 mountinfo. Assuming default: /sys/fs/cgroup");
404
s = "/sys/fs/cgroup";
391
- }
392
- else s = mi->mount_point;
405
+ } else
406
+ s = mi->mount_point;
407
+
408
set_cgroup_base_path(filename, s);
409
cgroup_unified_base = config_get("plugin:cgroups", "path to unified cgroups", filename);
395
- netdata_log_debug(D_CGROUP, "using cgroup root: '%s'", cgroup_unified_base);
410
}
411
412
cgroup_root_max = (int)config_get_number("plugin:cgroups", "max cgroups to allow", cgroup_root_max);
@@ -1146,6 +1160,15 @@ memory_next:
1160
}
1161
}
1162
1163
+static void cgroup_read_pids_current(struct pids *pids) {
1164
+ pids->pids_current_updated = 0;
1165
+
1166
+ if (unlikely(!pids->pids_current_filename))
1167
+ return;
1168
+
1169
+ pids->pids_current_updated = !read_single_signed_number_file(pids->pids_current_filename, &pids->pids_current);
1170
+}
1171
+
1172
static inline void read_cgroup(struct cgroup *cg) {
1173
netdata_log_debug(D_CGROUP, "reading metrics for cgroups '%s'", cg->id);
1174
if(!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
@@ -1160,6 +1183,7 @@ static inline void read_cgroup(struct cgroup *cg) {
1183
cgroup_read_blkio(&cg->throttle_io_serviced);
1184
cgroup_read_blkio(&cg->io_merged);
1185
cgroup_read_blkio(&cg->io_queued);
1186
+ cgroup_read_pids_current(&cg->pids);
1187
}
1188
else {
1189
//TODO: io_service_bytes and io_serviced use same file merge into 1 function
@@ -1172,6 +1196,7 @@ static inline void read_cgroup(struct cgroup *cg) {
1196
cgroup2_read_pressure(&cg->memory_pressure);
1197
cgroup2_read_pressure(&cg->irq_pressure);
1198
cgroup_read_memory(&cg->memory, 1);
1199
+ cgroup_read_pids_current(&cg->pids);
1200
}
1201
}
1202
@@ -1347,6 +1372,10 @@ void update_cgroup_systemd_services_charts() {
1372
update_io_merged_ops_chart(cg);
1373
}
1374
1375
+ if (likely(cg->pids.pids_current_updated)) {
1376
+ update_pids_current_chart(cg);
1377
+ }
1378
+
1379
cg->function_ready = true;
1380
}
1381
}
@@ -1485,6 +1514,10 @@ void update_cgroup_charts() {
1514
update_io_merged_ops_chart(cg);
1515
}
1516
1517
+ if (likely(cg->pids.pids_current_updated)) {
1518
+ update_pids_current_chart(cg);
1519
+ }
1520
+
1521
if (cg->options & CGROUP_OPTIONS_IS_UNIFIED) {
1522
if (likely(cg->cpu_pressure.updated)) {
1523
if (cg->cpu_pressure.some.enabled) {