feat(proc/cgroups.plugin): add PSI stall time charts (#12869)
Ilya Mashchenko committed
May 12, 2022 at 10:16 UTC
b3c1cf515142d36740a8fb6b2717753176e8255d
5 files changed
+474
-204
collectors/cgroups.plugin/sys_fs_cgroup.c
+244
-77
@@ -1397,14 +1397,17 @@ static inline void cgroup2_read_pressure(struct pressure *res) {
1397
return;
1398
}
1399
1400
- res->some.value10 = strtod(procfile_lineword(ff, 0, 2), NULL);
1401
- res->some.value60 = strtod(procfile_lineword(ff, 0, 4), NULL);
1402
- res->some.value300 = strtod(procfile_lineword(ff, 0, 6), NULL);
1400
+
1401
+ res->some.share_time.value10 = strtod(procfile_lineword(ff, 0, 2), NULL);
1402
+ res->some.share_time.value60 = strtod(procfile_lineword(ff, 0, 4), NULL);
1403
+ res->some.share_time.value300 = strtod(procfile_lineword(ff, 0, 6), NULL);
1404
+ res->some.total_time.value_total = str2ull(procfile_lineword(ff, 0, 8)) / 1000; // us->ms
1405
1406
if (lines > 2) {
1405
- res->full.value10 = strtod(procfile_lineword(ff, 1, 2), NULL);
1406
- res->full.value60 = strtod(procfile_lineword(ff, 1, 4), NULL);
1407
- res->full.value300 = strtod(procfile_lineword(ff, 1, 6), NULL);
1407
+ res->full.share_time.value10 = strtod(procfile_lineword(ff, 1, 2), NULL);
1408
+ res->full.share_time.value60 = strtod(procfile_lineword(ff, 1, 4), NULL);
1409
+ res->full.share_time.value300 = strtod(procfile_lineword(ff, 1, 6), NULL);
1410
+ res->full.total_time.value_total = str2ull(procfile_lineword(ff, 0, 8)) / 1000; // us->ms
1411
}
1412
1413
res->updated = 1;
@@ -1740,8 +1743,10 @@ char *k8s_parse_resolved_name(struct label **labels, char *data) {
1743
}
1744
1745
static inline void free_pressure(struct pressure *res) {
1743
- if (res->some.st) rrdset_is_obsolete(res->some.st);
1744
- if (res->full.st) rrdset_is_obsolete(res->full.st);
1746
+ if (res->some.share_time.st) rrdset_is_obsolete(res->some.share_time.st);
1747
+ if (res->some.total_time.st) rrdset_is_obsolete(res->some.total_time.st);
1748
+ if (res->full.share_time.st) rrdset_is_obsolete(res->full.share_time.st);
1749
+ if (res->full.total_time.st) rrdset_is_obsolete(res->full.total_time.st);
1750
freez(res->filename);
1751
}
1752
@@ -4505,17 +4510,20 @@ void update_cgroup_charts(int update_every) {
4510
4511
if (cg->options & CGROUP_OPTIONS_IS_UNIFIED) {
4512
struct pressure *res = &cg->cpu_pressure;
4513
+
4514
if (likely(res->updated && res->some.enabled)) {
4509
- if (unlikely(!res->some.st)) {
4510
- RRDSET *chart;
4511
- snprintfz(title, CHART_TITLE_MAX, "CPU pressure");
4515
+ struct pressure_charts *pcs;
4516
+ pcs = &res->some;
4517
4513
- chart = res->some.st = rrdset_create_localhost(
4518
+ if (unlikely(!pcs->share_time.st)) {
4519
+ RRDSET *chart;
4520
+ snprintfz(title, CHART_TITLE_MAX, "CPU some pressure");
4521
+ chart = pcs->share_time.st = rrdset_create_localhost(
4522
cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4515
- , "cpu_pressure"
4523
+ , "cpu_some_pressure"
4524
, NULL
4525
, "cpu"
4518
- , "cgroup.cpu_pressure"
4526
+ , "cgroup.cpu_some_pressure"
4527
, title
4528
, "percentage"
4529
, PLUGIN_CGROUPS_NAME
@@ -4524,31 +4532,105 @@ void update_cgroup_charts(int update_every) {
4532
, update_every
4533
, RRDSET_TYPE_LINE
4534
);
4527
-
4528
- rrdset_update_labels(chart = res->some.st, cg->chart_labels);
4529
-
4530
- res->some.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4531
- res->some.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4532
- res->some.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4535
+ rrdset_update_labels(chart = pcs->share_time.st, cg->chart_labels);
4536
+ pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4537
+ pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4538
+ pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4539
+ } else {
4540
+ rrdset_next(pcs->share_time.st);
4541
+ }
4542
+ if (unlikely(!pcs->total_time.st)) {
4543
+ RRDSET *chart;
4544
+ snprintfz(title, CHART_TITLE_MAX, "CPU some pressure stall time");
4545
+ chart = pcs->total_time.st = rrdset_create_localhost(
4546
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4547
+ , "cpu_some_pressure_stall_time"
4548
+ , NULL
4549
+ , "cpu"
4550
+ , "cgroup.cpu_some_pressure_stall_time"
4551
+ , title
4552
+ , "ms"
4553
+ , PLUGIN_CGROUPS_NAME
4554
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4555
+ , cgroup_containers_chart_priority + 2220
4556
+ , update_every
4557
+ , RRDSET_TYPE_LINE
4558
+ );
4559
+ rrdset_update_labels(chart = pcs->total_time.st, cg->chart_labels);
4560
+ pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
4561
} else {
4534
- rrdset_next(res->some.st);
4562
+ rrdset_next(pcs->total_time.st);
4563
}
4564
+ update_pressure_charts(pcs);
4565
+ }
4566
+ if (likely(res->updated && res->full.enabled)) {
4567
+ struct pressure_charts *pcs;
4568
+ pcs = &res->full;
4569
4537
- update_pressure_chart(&res->some);
4570
+ if (unlikely(!pcs->share_time.st)) {
4571
+ RRDSET *chart;
4572
+ snprintfz(title, CHART_TITLE_MAX, "CPU full pressure");
4573
+ chart = pcs->share_time.st = rrdset_create_localhost(
4574
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4575
+ , "cpu_full_pressure"
4576
+ , NULL
4577
+ , "cpu"
4578
+ , "cgroup.cpu_full_pressure"
4579
+ , title
4580
+ , "percentage"
4581
+ , PLUGIN_CGROUPS_NAME
4582
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4583
+ , cgroup_containers_chart_priority + 2240
4584
+ , update_every
4585
+ , RRDSET_TYPE_LINE
4586
+ );
4587
+ rrdset_update_labels(chart = pcs->share_time.st, cg->chart_labels);
4588
+ pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4589
+ pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4590
+ pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4591
+ } else {
4592
+ rrdset_next(pcs->share_time.st);
4593
+ }
4594
+ if (unlikely(!pcs->total_time.st)) {
4595
+ RRDSET *chart;
4596
+ snprintfz(title, CHART_TITLE_MAX, "CPU full pressure stall time");
4597
+ chart = pcs->total_time.st = rrdset_create_localhost(
4598
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4599
+ , "cpu_full_pressure_stall_time"
4600
+ , NULL
4601
+ , "cpu"
4602
+ , "cgroup.cpu_full_pressure_stall_time"
4603
+ , title
4604
+ , "ms"
4605
+ , PLUGIN_CGROUPS_NAME
4606
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4607
+ , cgroup_containers_chart_priority + 2260
4608
+ , update_every
4609
+ , RRDSET_TYPE_LINE
4610
+ );
4611
+ rrdset_update_labels(chart = pcs->total_time.st, cg->chart_labels);
4612
+ pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
4613
+ } else {
4614
+ rrdset_next(pcs->total_time.st);
4615
+ }
4616
+ update_pressure_charts(pcs);
4617
}
4618
4619
res = &cg->memory_pressure;
4620
+
4621
if (likely(res->updated && res->some.enabled)) {
4542
- if (unlikely(!res->some.st)) {
4543
- RRDSET *chart;
4544
- snprintfz(title, CHART_TITLE_MAX, "Memory pressure");
4622
+ struct pressure_charts *pcs;
4623
+ pcs = &res->some;
4624
4546
- chart = res->some.st = rrdset_create_localhost(
4625
+ if (unlikely(!pcs->share_time.st)) {
4626
+ RRDSET *chart;
4627
+ snprintfz(title, CHART_TITLE_MAX, "Memory some pressure");
4628
+ chart = pcs->share_time.st = rrdset_create_localhost(
4629
cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4548
- , "mem_pressure"
4630
+ , "mem_some_pressure"
4631
, NULL
4632
, "mem"
4551
- , "cgroup.memory_pressure"
4633
+ , "cgroup.memory_some_pressure"
4634
, title
4635
, "percentage"
4636
, PLUGIN_CGROUPS_NAME
@@ -4556,26 +4638,48 @@ void update_cgroup_charts(int update_every) {
4638
, cgroup_containers_chart_priority + 2300
4639
, update_every
4640
, RRDSET_TYPE_LINE
4559
- );
4560
-
4561
- rrdset_update_labels(chart = res->some.st, cg->chart_labels);
4562
-
4563
- res->some.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4564
- res->some.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4565
- res->some.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4641
+ );
4642
+ rrdset_update_labels(chart = pcs->share_time.st, cg->chart_labels);
4643
+ pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4644
+ pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4645
+ pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4646
} else {
4567
- rrdset_next(res->some.st);
4647
+ rrdset_next(pcs->share_time.st);
4648
}
4569
-
4570
- update_pressure_chart(&res->some);
4649
+ if (unlikely(!pcs->total_time.st)) {
4650
+ RRDSET *chart;
4651
+ snprintfz(title, CHART_TITLE_MAX, "Memory some pressure stall time");
4652
+ chart = pcs->total_time.st = rrdset_create_localhost(
4653
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4654
+ , "memory_some_pressure_stall_time"
4655
+ , NULL
4656
+ , "mem"
4657
+ , "cgroup.memory_some_pressure_stall_time"
4658
+ , title
4659
+ , "ms"
4660
+ , PLUGIN_CGROUPS_NAME
4661
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4662
+ , cgroup_containers_chart_priority + 2320
4663
+ , update_every
4664
+ , RRDSET_TYPE_LINE
4665
+ );
4666
+ rrdset_update_labels(chart = pcs->total_time.st, cg->chart_labels);
4667
+ pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
4668
+ } else {
4669
+ rrdset_next(pcs->total_time.st);
4670
+ }
4671
+ update_pressure_charts(pcs);
4672
}
4673
4674
if (likely(res->updated && res->full.enabled)) {
4574
- if (unlikely(!res->full.st)) {
4675
+ struct pressure_charts *pcs;
4676
+ pcs = &res->full;
4677
+
4678
+ if (unlikely(!pcs->share_time.st)) {
4679
RRDSET *chart;
4680
snprintfz(title, CHART_TITLE_MAX, "Memory full pressure");
4681
4578
- chart = res->full.st = rrdset_create_localhost(
4682
+ chart = pcs->share_time.st = rrdset_create_localhost(
4683
cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4684
, "mem_full_pressure"
4685
, NULL
@@ -4585,35 +4689,58 @@ void update_cgroup_charts(int update_every) {
4689
, "percentage"
4690
, PLUGIN_CGROUPS_NAME
4691
, PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4588
- , cgroup_containers_chart_priority + 2350
4692
+ , cgroup_containers_chart_priority + 2340
4693
, update_every
4694
, RRDSET_TYPE_LINE
4695
);
4696
4593
- rrdset_update_labels(chart = res->full.st, cg->chart_labels);
4594
-
4595
- res->full.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4596
- res->full.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4597
- res->full.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4697
+ rrdset_update_labels(chart = pcs->share_time.st, cg->chart_labels);
4698
+ pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4699
+ pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4700
+ pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4701
} else {
4599
- rrdset_next(res->full.st);
4702
+ rrdset_next(pcs->share_time.st);
4703
}
4601
-
4602
- update_pressure_chart(&res->full);
4704
+ if (unlikely(!pcs->total_time.st)) {
4705
+ RRDSET *chart;
4706
+ snprintfz(title, CHART_TITLE_MAX, "Memory full pressure stall time");
4707
+ chart = pcs->total_time.st = rrdset_create_localhost(
4708
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4709
+ , "memory_full_pressure_stall_time"
4710
+ , NULL
4711
+ , "mem"
4712
+ , "cgroup.memory_full_pressure_stall_time"
4713
+ , title
4714
+ , "ms"
4715
+ , PLUGIN_CGROUPS_NAME
4716
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4717
+ , cgroup_containers_chart_priority + 2360
4718
+ , update_every
4719
+ , RRDSET_TYPE_LINE
4720
+ );
4721
+ rrdset_update_labels(chart = pcs->total_time.st, cg->chart_labels);
4722
+ pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
4723
+ } else {
4724
+ rrdset_next(pcs->total_time.st);
4725
+ }
4726
+ update_pressure_charts(pcs);
4727
}
4728
4729
res = &cg->io_pressure;
4730
+
4731
if (likely(res->updated && res->some.enabled)) {
4607
- if (unlikely(!res->some.st)) {
4608
- RRDSET *chart;
4609
- snprintfz(title, CHART_TITLE_MAX, "I/O pressure");
4732
+ struct pressure_charts *pcs;
4733
+ pcs = &res->some;
4734
4611
- chart = res->some.st = rrdset_create_localhost(
4735
+ if (unlikely(!pcs->share_time.st)) {
4736
+ RRDSET *chart;
4737
+ snprintfz(title, CHART_TITLE_MAX, "I/O some pressure");
4738
+ chart = pcs->share_time.st = rrdset_create_localhost(
4739
cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4613
- , "io_pressure"
4740
+ , "io_some_pressure"
4741
, NULL
4742
, "disk"
4616
- , "cgroup.io_pressure"
4743
+ , "cgroup.io_some_pressure"
4744
, title
4745
, "percentage"
4746
, PLUGIN_CGROUPS_NAME
@@ -4622,25 +4749,46 @@ void update_cgroup_charts(int update_every) {
4749
, update_every
4750
, RRDSET_TYPE_LINE
4751
);
4625
-
4626
- rrdset_update_labels(chart = res->some.st, cg->chart_labels);
4627
-
4628
- res->some.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4629
- res->some.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4630
- res->some.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4752
+ rrdset_update_labels(chart = pcs->share_time.st, cg->chart_labels);
4753
+ pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4754
+ pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4755
+ pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4756
} else {
4632
- rrdset_next(res->some.st);
4757
+ rrdset_next(pcs->share_time.st);
4758
}
4634
-
4635
- update_pressure_chart(&res->some);
4759
+ if (unlikely(!pcs->total_time.st)) {
4760
+ RRDSET *chart;
4761
+ snprintfz(title, CHART_TITLE_MAX, "I/O some pressure stall time");
4762
+ chart = pcs->total_time.st = rrdset_create_localhost(
4763
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4764
+ , "io_some_pressure_stall_time"
4765
+ , NULL
4766
+ , "disk"
4767
+ , "cgroup.io_some_pressure_stall_time"
4768
+ , title
4769
+ , "ms"
4770
+ , PLUGIN_CGROUPS_NAME
4771
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4772
+ , cgroup_containers_chart_priority + 2420
4773
+ , update_every
4774
+ , RRDSET_TYPE_LINE
4775
+ );
4776
+ rrdset_update_labels(chart = pcs->total_time.st, cg->chart_labels);
4777
+ pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
4778
+ } else {
4779
+ rrdset_next(pcs->total_time.st);
4780
+ }
4781
+ update_pressure_charts(pcs);
4782
}
4783
4784
if (likely(res->updated && res->full.enabled)) {
4639
- if (unlikely(!res->full.st)) {
4785
+ struct pressure_charts *pcs;
4786
+ pcs = &res->full;
4787
+
4788
+ if (unlikely(!pcs->share_time.st)) {
4789
RRDSET *chart;
4790
snprintfz(title, CHART_TITLE_MAX, "I/O full pressure");
4642
-
4643
- chart = res->full.st = rrdset_create_localhost(
4791
+ chart = pcs->share_time.st = rrdset_create_localhost(
4792
cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4793
, "io_full_pressure"
4794
, NULL
@@ -4650,21 +4798,40 @@ void update_cgroup_charts(int update_every) {
4798
, "percentage"
4799
, PLUGIN_CGROUPS_NAME
4800
, PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4653
- , cgroup_containers_chart_priority + 2450
4801
+ , cgroup_containers_chart_priority + 2440
4802
, update_every
4803
, RRDSET_TYPE_LINE
4804
);
4657
-
4658
- rrdset_update_labels(chart = res->full.st, cg->chart_labels);
4659
-
4660
- res->full.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4661
- res->full.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4662
- res->full.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4805
+ rrdset_update_labels(chart = pcs->share_time.st, cg->chart_labels);
4806
+ pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4807
+ pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4808
+ pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
4809
} else {
4664
- rrdset_next(res->full.st);
4810
+ rrdset_next(pcs->share_time.st);
4811
}
4666
-
4667
- update_pressure_chart(&res->full);
4812
+ if (unlikely(!pcs->total_time.st)) {
4813
+ RRDSET *chart;
4814
+ snprintfz(title, CHART_TITLE_MAX, "I/O full pressure stall time");
4815
+ chart = pcs->total_time.st = rrdset_create_localhost(
4816
+ cgroup_chart_type(type, cg->chart_id, RRD_ID_LENGTH_MAX)
4817
+ , "io_full_pressure_stall_time"
4818
+ , NULL
4819
+ , "disk"
4820
+ , "cgroup.io_full_pressure_stall_time"
4821
+ , title
4822
+ , "ms"
4823
+ , PLUGIN_CGROUPS_NAME
4824
+ , PLUGIN_CGROUPS_MODULE_CGROUPS_NAME
4825
+ , cgroup_containers_chart_priority + 2460
4826
+ , update_every
4827
+ , RRDSET_TYPE_LINE
4828
+ );
4829
+ rrdset_update_labels(chart = pcs->total_time.st, cg->chart_labels);
4830
+ pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
4831
+ } else {
4832
+ rrdset_next(pcs->total_time.st);
4833
+ }
4834
+ update_pressure_charts(pcs);
4835
}
4836
}
4837
}
collectors/cgroups.plugin/tests/test_doubles.c
+2
-2
@@ -142,9 +142,9 @@ void rrdset_done(RRDSET *st)
142
UNUSED(st);
143
}
144
145
-void update_pressure_chart(struct pressure_chart *chart)
145
+void update_pressure_charts(struct pressure_charts *charts)
146
{
147
- UNUSED(chart);
147
+ UNUSED(charts);
148
}
149
150
void netdev_rename_device_add(
collectors/proc.plugin/proc_pressure.c
+111
-78
@@ -8,22 +8,36 @@
8
// linux calculates this every 2 seconds, see kernel/sched/psi.c PSI_FREQ
9
#define MIN_PRESSURE_UPDATE_EVERY 2
10
11
+static int pressure_update_every = 0;
12
13
static struct pressure resources[PRESSURE_NUM_RESOURCES] = {
13
- {
14
- .some = { .id = "cpu_pressure", .title = "CPU Pressure" },
15
- },
16
- {
17
- .some = { .id = "memory_some_pressure", .title = "Memory Pressure" },
18
- .full = { .id = "memory_full_pressure", .title = "Memory Full Pressure" },
19
- },
20
- {
21
- .some = { .id = "io_some_pressure", .title = "I/O Pressure" },
22
- .full = { .id = "io_full_pressure", .title = "I/O Full Pressure" },
23
- },
14
+ {
15
+ .some =
16
+ {.share_time = {.id = "cpu_some_pressure", .title = "CPU some pressure"},
17
+ .total_time = {.id = "cpu_some_pressure_stall_time", .title = "CPU some pressure stall time"}},
18
+ .full =
19
+ {.share_time = {.id = "cpu_full_pressure", .title = "CPU full pressure"},
20
+ .total_time = {.id = "cpu_full_pressure_stall_time", .title = "CPU full pressure stall time"}},
21
+ },
22
+ {
23
+ .some =
24
+ {.share_time = {.id = "memory_some_pressure", .title = "Memory some pressure"},
25
+ .total_time = {.id = "memory_some_pressure_stall_time", .title = "Memory some pressure stall time"}},
26
+ .full =
27
+ {.share_time = {.id = "memory_full_pressure", .title = "Memory full pressure"},
28
+ .total_time = {.id = "memory_full_pressure_stall_time", .title = "Memory full pressure stall time"}},
29
+ },
30
+ {
31
+ .some =
32
+ {.share_time = {.id = "io_some_pressure", .title = "I/O some pressure"},
33
+ .total_time = {.id = "io_some_pressure_stall_time", .title = "I/O some pressure stall time"}},
34
+ .full =
35
+ {.share_time = {.id = "io_full_pressure", .title = "I/O full pressure"},
36
+ .total_time = {.id = "io_full_pressure_stall_time", .title = "I/O full pressure stall time"}},
37
+ },
38
};
39
26
-static struct {
40
+static struct resource_info {
41
procfile *pf;
42
const char *name; // metric file name
43
const char *family; // webui section name
@@ -34,12 +48,83 @@ static struct {
48
{ .name = "io", .family = "disk", .section_priority = NETDATA_CHART_PRIO_SYSTEM_IO },
49
};
50
37
-void update_pressure_chart(struct pressure_chart *chart) {
38
- rrddim_set_by_pointer(chart->st, chart->rd10, (collected_number)(chart->value10 * 100));
39
- rrddim_set_by_pointer(chart->st, chart->rd60, (collected_number) (chart->value60 * 100));
40
- rrddim_set_by_pointer(chart->st, chart->rd300, (collected_number) (chart->value300 * 100));
51
+void update_pressure_charts(struct pressure_charts *pcs) {
52
+ if (pcs->share_time.st) {
53
+ rrddim_set_by_pointer(
54
+ pcs->share_time.st, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
55
+ rrddim_set_by_pointer(
56
+ pcs->share_time.st, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
57
+ rrddim_set_by_pointer(
58
+ pcs->share_time.st, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
59
+ rrdset_done(pcs->share_time.st);
60
+ }
61
+ if (pcs->total_time.st) {
62
+ rrddim_set_by_pointer(
63
+ pcs->total_time.st, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
64
+ rrdset_done(pcs->total_time.st);
65
+ }
66
+}
67
+
68
+static void proc_pressure_do_resource(procfile *ff, int res_idx, int some) {
69
+ struct pressure_charts *pcs;
70
+ struct resource_info ri;
71
+ pcs = some ? &resources[res_idx].some : &resources[res_idx].full;
72
+ ri = resource_info[res_idx];
73
+
74
+ if (unlikely(!pcs->share_time.st)) {
75
+ pcs->share_time.st = rrdset_create_localhost(
76
+ "system",
77
+ pcs->share_time.id,
78
+ NULL,
79
+ ri.family,
80
+ NULL,
81
+ pcs->share_time.title,
82
+ "percentage",
83
+ PLUGIN_PROC_NAME,
84
+ PLUGIN_PROC_MODULE_PRESSURE_NAME,
85
+ ri.section_priority + (some ? 40 : 50),
86
+ pressure_update_every,
87
+ RRDSET_TYPE_LINE);
88
+ pcs->share_time.rd10 =
89
+ rrddim_add(pcs->share_time.st, some ? "some 10" : "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
90
+ pcs->share_time.rd60 =
91
+ rrddim_add(pcs->share_time.st, some ? "some 60" : "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
92
+ pcs->share_time.rd300 =
93
+ rrddim_add(pcs->share_time.st, some ? "some 300" : "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
94
+ } else {
95
+ rrdset_next(pcs->share_time.st);
96
+ }
97
+ pcs->share_time.value10 = strtod(procfile_lineword(ff, some ? 0 : 1, 2), NULL);
98
+ pcs->share_time.value60 = strtod(procfile_lineword(ff, some ? 0 : 1, 4), NULL);
99
+ pcs->share_time.value300 = strtod(procfile_lineword(ff, some ? 0 : 1, 6), NULL);
100
+
101
+ if (unlikely(!pcs->total_time.st)) {
102
+ pcs->total_time.st = rrdset_create_localhost(
103
+ "system",
104
+ pcs->total_time.id,
105
+ NULL,
106
+ ri.family,
107
+ NULL,
108
+ pcs->total_time.title,
109
+ "ms",
110
+ PLUGIN_PROC_NAME,
111
+ PLUGIN_PROC_MODULE_PRESSURE_NAME,
112
+ ri.section_priority + (some ? 45 : 55),
113
+ pressure_update_every,
114
+ RRDSET_TYPE_LINE);
115
+ pcs->total_time.rdtotal = rrddim_add(pcs->total_time.st, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
116
+ } else {
117
+ rrdset_next(pcs->total_time.st);
118
+ }
119
+ pcs->total_time.value_total = str2ull(procfile_lineword(ff, some ? 0 : 1, 8)) / 1000;
120
+}
121
42
- rrdset_done(chart->st);
122
+static void proc_pressure_do_resource_some(procfile *ff, int res_idx) {
123
+ proc_pressure_do_resource(ff, res_idx, 1);
124
+}
125
+
126
+static void proc_pressure_do_resource_full(procfile *ff, int res_idx) {
127
+ proc_pressure_do_resource(ff, res_idx, 0);
128
}
129
130
int do_proc_pressure(int update_every, usec_t dt) {
@@ -50,6 +135,7 @@ int do_proc_pressure(int update_every, usec_t dt) {
135
static char *base_path = NULL;
136
137
update_every = (update_every < MIN_PRESSURE_UPDATE_EVERY) ? MIN_PRESSURE_UPDATE_EVERY : update_every;
138
+ pressure_update_every = update_every;
139
140
if (next_pressure_dt <= dt) {
141
next_pressure_dt = update_every * USEC_PER_SEC;
@@ -80,11 +166,10 @@ int do_proc_pressure(int update_every, usec_t dt) {
166
snprintfz(config_key, CONFIG_MAX_NAME, "enable %s some pressure", resource_info[i].name);
167
do_some = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_PRESSURE, config_key, CONFIG_BOOLEAN_YES);
168
resources[i].some.enabled = do_some;
83
- if (resources[i].full.id) {
84
- snprintfz(config_key, CONFIG_MAX_NAME, "enable %s full pressure", resource_info[i].name);
85
- do_full = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_PRESSURE, config_key, CONFIG_BOOLEAN_YES);
86
- resources[i].full.enabled = do_full;
87
- }
169
+
170
+ snprintfz(config_key, CONFIG_MAX_NAME, "enable %s full pressure", resource_info[i].name);
171
+ do_full = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_PRESSURE, config_key, CONFIG_BOOLEAN_YES);
172
+ resources[i].full.enabled = do_full;
173
174
ff = procfile_open(filename, " =", PROCFILE_FLAG_DEFAULT);
175
if (unlikely(!ff)) {
@@ -108,65 +193,13 @@ int do_proc_pressure(int update_every, usec_t dt) {
193
continue;
194
}
195
111
- struct pressure_chart *chart;
196
if (do_some) {
113
- chart = &resources[i].some;
114
- if (unlikely(!chart->st)) {
115
- chart->st = rrdset_create_localhost(
116
- "system"
117
- , chart->id
118
- , NULL
119
- , resource_info[i].family
120
- , NULL
121
- , chart->title
122
- , "percentage"
123
- , PLUGIN_PROC_NAME
124
- , PLUGIN_PROC_MODULE_PRESSURE_NAME
125
- , resource_info[i].section_priority + 40
126
- , update_every
127
- , RRDSET_TYPE_LINE
128
- );
129
- chart->rd10 = rrddim_add(chart->st, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
130
- chart->rd60 = rrddim_add(chart->st, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
131
- chart->rd300 = rrddim_add(chart->st, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
132
- } else {
133
- rrdset_next(chart->st);
134
- }
135
-
136
- chart->value10 = strtod(procfile_lineword(ff, 0, 2), NULL);
137
- chart->value60 = strtod(procfile_lineword(ff, 0, 4), NULL);
138
- chart->value300 = strtod(procfile_lineword(ff, 0, 6), NULL);
139
- update_pressure_chart(chart);
197
+ proc_pressure_do_resource_some(ff, i);
198
+ update_pressure_charts(&resources[i].some);
199
}
141
-
200
if (do_full && lines > 2) {
143
- chart = &resources[i].full;
144
- if (unlikely(!chart->st)) {
145
- chart->st = rrdset_create_localhost(
146
- "system"
147
- , chart->id
148
- , NULL
149
- , resource_info[i].family
150
- , NULL
151
- , chart->title
152
- , "percentage"
153
- , PLUGIN_PROC_NAME
154
- , PLUGIN_PROC_MODULE_PRESSURE_NAME
155
- , resource_info[i].section_priority + 45
156
- , update_every
157
- , RRDSET_TYPE_LINE
158
- );
159
- chart->rd10 = rrddim_add(chart->st, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
160
- chart->rd60 = rrddim_add(chart->st, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
161
- chart->rd300 = rrddim_add(chart->st, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
162
- } else {
163
- rrdset_next(chart->st);
164
- }
165
-
166
- chart->value10 = strtod(procfile_lineword(ff, 1, 2), NULL);
167
- chart->value60 = strtod(procfile_lineword(ff, 1, 4), NULL);
168
- chart->value300 = strtod(procfile_lineword(ff, 1, 6), NULL);
169
- update_pressure_chart(chart);
201
+ proc_pressure_do_resource_full(ff, i);
202
+ update_pressure_charts(&resources[i].full);
203
}
204
}
205
collectors/proc.plugin/proc_pressure.h
+23
-11
@@ -9,23 +9,35 @@ struct pressure {
9
int updated;
10
char *filename;
11
12
- struct pressure_chart {
12
+ struct pressure_charts {
13
int enabled;
14
15
- const char *id;
16
- const char *title;
15
+ struct pressure_share_time_chart {
16
+ const char *id;
17
+ const char *title;
18
18
- double value10;
19
- double value60;
20
- double value300;
19
+ double value10;
20
+ double value60;
21
+ double value300;
22
22
- RRDSET *st;
23
- RRDDIM *rd10;
24
- RRDDIM *rd60;
25
- RRDDIM *rd300;
23
+ RRDSET *st;
24
+ RRDDIM *rd10;
25
+ RRDDIM *rd60;
26
+ RRDDIM *rd300;
27
+ } share_time;
28
+
29
+ struct pressure_total_time_chart {
30
+ const char *id;
31
+ const char *title;
32
+
33
+ unsigned long long value_total;
34
+
35
+ RRDSET *st;
36
+ RRDDIM *rdtotal;
37
+ } total_time;
38
} some, full;
39
};
40
29
-extern void update_pressure_chart(struct pressure_chart *chart);
41
+extern void update_pressure_charts(struct pressure_charts *charts);
42
43
#endif //NETDATA_PROC_PRESSURE_H
web/gui/dashboard_info.js
+94
-36
@@ -1309,29 +1309,61 @@ netdataDashboard.context = {
1309
height: 0.7
1310
},
1311
1312
- 'system.cpu_pressure': {
1313
- info: '<a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a> ' +
1314
- 'identifies and quantifies the disruptions caused by resource contentions. ' +
1315
- 'The "some" line indicates the share of time in which at least <b>some</b> tasks are stalled on CPU. ' +
1316
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
1312
+ 'system.cpu_some_pressure': {
1313
+ info: 'CPU <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
1314
+ '<b>Some</b> indicates the share of time in which at least <b>some tasks</b> are stalled on CPU. ' +
1315
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
1316
+ },
1317
+ 'system.cpu_some_pressure_stall_time': {
1318
+ info: 'The amount of time some processes have been waiting for CPU time.'
1319
+ },
1320
+ 'system.cpu_full_pressure': {
1321
+ info: 'CPU <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. ' +
1322
+ '<b>Full</b> indicates the share of time in which <b>all non-idle tasks</b> are stalled on CPU resource simultaneously. ' +
1323
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
1324
+ },
1325
+ 'system.cpu_full_pressure_stall_time': {
1326
+ info: 'The amount of time all non-idle processes have been stalled due to CPU congestion.'
1327
},
1328
1329
'system.memory_some_pressure': {
1320
- info: '<a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a> ' +
1321
- 'identifies and quantifies the disruptions caused by resource contentions. ' +
1322
- 'The "some" line indicates the share of time in which at least <b>some</b> tasks are stalled on memory. ' +
1323
- 'The "full" line indicates the share of time in which <b>all non-idle</b> tasks are stalled on memory simultaneously. ' +
1324
- 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. ' +
1325
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
1330
+ info: 'Memory <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
1331
+ '<b>Some</b> indicates the share of time in which at least <b>some tasks</b> are stalled on memory. ' +
1332
+ 'In this state the CPU is still doing productive work. '+
1333
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
1334
+ },
1335
+ 'system.memory_some_pressure_stall_time': {
1336
+ info: 'The amount of time some processes have been waiting due to memory congestion.'
1337
+ },
1338
+ 'system.memory_full_pressure': {
1339
+ info: 'Memory <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. ' +
1340
+ '<b>Full</b> indicates the share of time in which <b>all non-idle tasks</b> are stalled on memory resource simultaneously. ' +
1341
+ 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. '+
1342
+ 'This has severe impact on performance. '+
1343
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
1344
+ },
1345
+ 'system.memory_full_pressure_stall_time': {
1346
+ info: 'The amount of time all non-idle processes have been stalled due to memory congestion.'
1347
},
1348
1349
'system.io_some_pressure': {
1329
- info: '<a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a> ' +
1330
- 'identifies and quantifies the disruptions caused by resource contentions. ' +
1331
- 'The "some" line indicates the share of time in which at least <b>some</b> tasks are stalled on I/O. ' +
1332
- 'The "full" line indicates the share of time in which <b>all non-idle</b> tasks are stalled on I/O simultaneously. ' +
1333
- 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. ' +
1334
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
1350
+ info: 'I/O <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
1351
+ '<b>Some</b> indicates the share of time in which at least <b>some tasks</b> are stalled on I/O. ' +
1352
+ 'In this state the CPU is still doing productive work. '+
1353
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
1354
+ },
1355
+ 'system.io_some_pressure_stall_time': {
1356
+ info: 'The amount of time some processes have been waiting due to I/O congestion.'
1357
+ },
1358
+ 'system.io_full_pressure': {
1359
+ info: 'I/O <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. ' +
1360
+ '<b>Full</b> line indicates the share of time in which <b>all non-idle tasks</b> are stalled on I/O resource simultaneously. ' +
1361
+ 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. '+
1362
+ 'This has severe impact on performance. '+
1363
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
1364
+ },
1365
+ 'system.io_full_pressure_stall_time': {
1366
+ info: 'The amount of time all non-idle processes have been stalled due to I/O congestion.'
1367
},
1368
1369
'system.io': {
@@ -4037,10 +4069,22 @@ netdataDashboard.context = {
4069
info: 'Total CPU utilization per core within the system-wide CPU resources.'
4070
},
4071
4040
- 'cgroup.cpu_pressure': {
4072
+ 'cgroup.cpu_some_pressure': {
4073
info: 'CPU <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
4042
- '<b>Some</b> indicates the share of time in which at least some tasks are stalled on CPU. '+
4043
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
4074
+ '<b>Some</b> indicates the share of time in which at least <b>some tasks</b> are stalled on CPU. ' +
4075
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
4076
+ },
4077
+ 'cgroup.cpu_some_pressure_stall_time': {
4078
+ info: 'The amount of time some processes have been waiting for CPU time.'
4079
+ },
4080
+
4081
+ 'cgroup.cpu_full_pressure': {
4082
+ info: 'CPU <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. ' +
4083
+ '<b>Full</b> indicates the share of time in which <b>all non-idle tasks</b> are stalled on CPU resource simultaneously. ' +
4084
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
4085
+ },
4086
+ 'cgroup.cpu_full_pressure_stall_time': {
4087
+ info: 'The amount of time all non-idle processes have been stalled due to CPU congestion.'
4088
},
4089
4090
'cgroup.mem_utilization': {
@@ -4126,18 +4170,25 @@ netdataDashboard.context = {
4170
'<b>Swap</b> - major page faults.</p>'
4171
},
4172
4129
- 'cgroup.memory_pressure': {
4173
+ 'cgroup.memory_some_pressure': {
4174
info: 'Memory <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
4131
- '<b>Some</b> indicates the share of time in which at least some tasks are stalled on memory. '+
4132
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
4175
+ '<b>Some</b> indicates the share of time in which at least <b>some tasks</b> are stalled on memory. ' +
4176
+ 'In this state the CPU is still doing productive work. '+
4177
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
4178
+ },
4179
+ 'cgroup.memory_some_pressure_stall_time': {
4180
+ info: 'The amount of time some processes have been waiting due to memory congestion.'
4181
},
4182
4183
'cgroup.memory_full_pressure': {
4136
- info: 'Memory <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
4137
- '<b>Full</b> indicates the share of time in which all non-idle tasks are stalled on memory simultaneously. '+
4138
- 'In this state actual CPU cycles are going to waste, '+
4139
- 'and a workload that spends extended time in this state is considered to be thrashing. '+
4140
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
4184
+ info: 'Memory <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. ' +
4185
+ '<b>Full</b> indicates the share of time in which <b>all non-idle tasks</b> are stalled on memory resource simultaneously. ' +
4186
+ 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. '+
4187
+ 'This has severe impact on performance. '+
4188
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
4189
+ },
4190
+ 'cgroup.memory_full_pressure_stall_time': {
4191
+ info: 'The amount of time all non-idle processes have been stalled due to memory congestion.'
4192
},
4193
4194
'cgroup.io': {
@@ -4197,18 +4248,25 @@ netdataDashboard.context = {
4248
info: 'The number of I/O operations performed on specific devices as seen by the throttling policy.'
4249
},
4250
4200
- 'cgroup.io_pressure': {
4251
+ 'cgroup.io_some_pressure': {
4252
info: 'I/O <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
4202
- '<b>Some</b> indicates the share of time in which at least some tasks are stalled on I/O. '+
4203
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
4253
+ '<b>Some</b> indicates the share of time in which at least <b>some tasks</b> are stalled on I/O. ' +
4254
+ 'In this state the CPU is still doing productive work. '+
4255
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
4256
+ },
4257
+ 'cgroup.io_some_pressure_stall_time': {
4258
+ info: 'The amount of time some processes have been waiting due to I/O congestion.'
4259
},
4260
4261
'cgroup.io_full_pressure': {
4207
- info: 'I/O <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. '+
4208
- '<b>Full</b> indicates the share of time in which all non-idle tasks are stalled on I/O simultaneously. '+
4209
- 'In this state actual CPU cycles are going to waste, '+
4210
- 'and a workload that spends extended time in this state is considered to be thrashing. '+
4211
- 'The ratios (in %) are tracked as recent trends over 10-, 60-, and 300-second windows.'
4262
+ info: 'I/O <a href="https://www.kernel.org/doc/html/latest/accounting/psi.html" target="_blank">Pressure Stall Information</a>. ' +
4263
+ '<b>Full</b> line indicates the share of time in which <b>all non-idle tasks</b> are stalled on I/O resource simultaneously. ' +
4264
+ 'In this state actual CPU cycles are going to waste, and a workload that spends extended time in this state is considered to be thrashing. '+
4265
+ 'This has severe impact on performance. '+
4266
+ 'The ratios are tracked as recent trends over 10-, 60-, and 300-second windows.'
4267
+ },
4268
+ 'cgroup.io_full_pressure_stall_time': {
4269
+ info: 'The amount of time all non-idle processes have been stalled due to I/O congestion.'
4270
},
4271
4272
'cgroup.swap_read': {