@cryptotaxi247 / netdata-1 / commits / b3c1cf515

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': {