From 692ccc0c9e4fd29b44e9ada28ce6db35e37db24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Tue, 9 Jul 2024 00:58:33 +0800 Subject: [PATCH 01/37] add testcase for v1-cpuacct --- .../LICENSE" | 824 ++++++++++++++++++ .../Makefile" | 27 + .../Makefile.common" | 3 + .../README.md" | 99 +++ .../cmd/Makefile" | 20 + .../cmd/hello.c" | 6 + .../kmod/Makefile" | 28 + .../kmod/ts_kcommon.c" | 14 + .../testcase/Makefile" | 21 + .../testcase/cgroup-v1-cpuacct-stat.sh" | 73 ++ .../testcase/cgroup-v1-cpuacct-usage.sh" | 66 ++ .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 91 ++ .../cgroup-v1-cpuacct-usage_percpu.sh" | 66 ++ .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 71 ++ .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 71 ++ .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 67 ++ .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 67 ++ .../tst_common/.gitignore" | 33 + .../tst_common/LICENSE" | 824 ++++++++++++++++++ .../tst_common/Makefile" | 27 + .../tst_common/Makefile.common" | 2 + .../tst_common/README.md" | 21 + .../tst_common/cmd/Makefile" | 20 + .../tst_common/cmd/tsuite.c" | 6 + .../tst_common/docs/API-C.md" | 24 + .../tst_common/docs/API-Python.md" | 62 ++ .../tst_common/docs/API-Shell.md" | 68 ++ .../tst_common/kmod/Makefile" | 28 + .../tst_common/kmod/kmod_common.c" | 14 + .../tst_common/lib/Makefile" | 20 + .../tst_common/lib/benchmark.c" | 389 +++++++++ .../tst_common/lib/benchmark.h" | 81 ++ .../tst_common/lib/benchmark.py" | 304 +++++++ .../tst_common/lib/common.c" | 597 +++++++++++++ .../tst_common/lib/common.h" | 139 +++ .../tst_common/lib/common.py" | 755 ++++++++++++++++ .../tst_common/lib/common.sh" | 735 ++++++++++++++++ .../tst_common/lib/common_func.sh" | 88 ++ .../tst_common/lib/main.h" | 12 + .../tst_common/lib/sched.py" | 129 +++ .../tst_common/lib/tst_ts_setup" | 55 ++ .../tst_common/lib/tst_ts_teardown" | 47 + .../tst_common/lib/tsuite-completion.bash" | 51 ++ .../tst_common/lib/tsuite_func.sh" | 499 +++++++++++ .../tst_common/testcase/Makefile" | 20 + .../tst_common/testcase/test_c_testcase.c" | 35 + .../tst_common/testcase/test_perf_tools.py" | 51 ++ .../testcase/test_python_testcase.py" | 38 + .../testcase/test_shell_testcase.sh" | 47 + .../tst_common/tsuite" | 17 + .../tst_lib/Makefile" | 20 + .../tst_lib/other_common.sh" | 5 + .../tst_lib/ts_common.c" | 23 + .../tst_lib/ts_common.h" | 6 + .../tst_lib/ts_common.py" | 35 + .../tst_lib/ts_common.sh" | 28 + .../tst_lib/ts_setup" | 13 + .../tst_lib/ts_teardown" | 13 + .../tsuite" | 1 + 59 files changed, 6996 insertions(+) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/Makefile" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" create mode 120000 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" new file mode 100644 index 0000000..d06cc9f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" @@ -0,0 +1,824 @@ +Tencent is pleased to support the open source community by making OpenCloudOS Kernel Stream available. + +Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications"). All Tencent Modifications are Copyright (C) THL A29 Limited. + +OpenCloudOS Kernel Stream is licensed under the the Mulan Permissive Software License 2.0 except for the third-party components listed below. + + +Terms of the Mulan Permissive Software License 2.0: +-------------------------------------------------------------------- + 木兰宽松许可证, 第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体”是指提交贡献的机构及其“关联实体”。 + +“关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1,请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2,请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3,请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + +0. Definition + +Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its Affiliates. + +Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + + + +Other dependencies and licenses: + + +Open Source Software Licensed under the GPL v2.0 with Linux-syscall-note, and Other Licenses of the Third-Party Components therein: +The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications"). All Tencent Modifications are Copyright (C) 2021 THL A29 Limited. +-------------------------------------------------------------------- +1. kernel +Copyright © kernel original author and authors + + +The Linux Kernel is provided under: + + SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note + +Being under the terms of the GNU General Public License version 2 only, +according with: + + LICENSES/preferred/GPL-2.0 + +With an explicit syscall exception, as stated at: + + LICENSES/exceptions/Linux-syscall-note + +In addition, other licenses may also apply. Please see: + + Documentation/process/license-rules.rst + +for more details. + +All contributions to the Linux Kernel are subject to this COPYING file. + +Valid-License-Identifier: GPL-2.0 +Valid-License-Identifier: GPL-2.0-only +Valid-License-Identifier: GPL-2.0+ +Valid-License-Identifier: GPL-2.0-or-later +SPDX-URL: https://spdx.org/licenses/GPL-2.0.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU General Public License (GPL) version 2 only' use: + SPDX-License-Identifier: GPL-2.0 + or + SPDX-License-Identifier: GPL-2.0-only + For 'GNU General Public License (GPL) version 2 or any later version' use: + SPDX-License-Identifier: GPL-2.0+ + or + SPDX-License-Identifier: GPL-2.0-or-later +License-Text: + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +SPDX-Exception-Identifier: Linux-syscall-note +SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html +SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+, GPL-2.0-only, GPL-2.0-or-later +Usage-Guide: + This exception is used together with one of the above SPDX-Licenses + to mark user space API (uapi) header files so they can be included + into non GPL compliant user space application code. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH Linux-syscall-note +License-Text: + + NOTE! This copyright does *not* cover user programs that use kernel + services by normal system calls - this is merely considered normal use + of the kernel, and does *not* fall under the heading of "derived work". + Also note that the GPL below is copyrighted by the Free Software + Foundation, but the instance of code that it refers to (the Linux + kernel) is copyrighted by me and others who actually wrote it. + + Also note that the only valid version of the GPL as far as the kernel + is concerned is _this_ particular version of the license (ie v2, not + v2.2 or v3.x or whatever), unless explicitly otherwise stated. + + Linus Torvalds + +For the licenses of other third parties, please refer to the following URL: +https://github.com/torvalds/linux/tree/v5.18-rc5/LICENSES + +Linux kernel licensing rules +The Linux Kernel is provided under the terms of the GNU General Public License version 2 only (GPL-2.0), as provided in LICENSES/preferred/GPL-2.0, with an explicit syscall exception described in LICENSES/exceptions/Linux-syscall-note, as described in the COPYING file. + +This documentation file provides a description of how each source file should be annotated to make its license clear and unambiguous. It doesn't replace the Kernel's license. + +The license described in the COPYING file applies to the kernel source as a whole, though individual source files can have a different license which is required to be compatible with the GPL-2.0: + +GPL-1.0+ : GNU General Public License v1.0 or later +GPL-2.0+ : GNU General Public License v2.0 or later +LGPL-2.0 : GNU Library General Public License v2 only +LGPL-2.0+ : GNU Library General Public License v2 or later +LGPL-2.1 : GNU Lesser General Public License v2.1 only +LGPL-2.1+ : GNU Lesser General Public License v2.1 or later +Aside from that, individual files can be provided under a dual license, e.g. one of the compatible GPL variants and alternatively under a permissive license like BSD, MIT etc. + +The User-space API (UAPI) header files, which describe the interface of user-space programs to the kernel are a special case. According to the note in the kernel COPYING file, the syscall interface is a clear boundary, which does not extend the GPL requirements to any software which uses it to communicate with the kernel. Because the UAPI headers must be includable into any source files which create an executable running on the Linux kernel, the exception must be documented by a special license expression. + +The common way of expressing the license of a source file is to add the matching boilerplate text into the top comment of the file. Due to formatting, typos etc. these "boilerplates" are hard to validate for tools which are used in the context of license compliance. + +An alternative to boilerplate text is the use of Software Package Data Exchange (SPDX) license identifiers in each source file. SPDX license identifiers are machine parsable and precise shorthands for the license under which the content of the file is contributed. SPDX license identifiers are managed by the SPDX Workgroup at the Linux Foundation and have been agreed on by partners throughout the industry, tool vendors, and legal teams. For further information see https://spdx.org/ + +The Linux kernel requires the precise SPDX identifier in all source files. The valid identifiers used in the kernel are explained in the section License identifiers and have been retrieved from the official SPDX license list at https://spdx.org/licenses/ along with the license texts. + +License identifier syntax +Placement: + +The SPDX license identifier in kernel files shall be added at the first possible line in a file which can contain a comment. For the majority of files this is the first line, except for scripts which require the '#!PATH_TO_INTERPRETER' in the first line. For those scripts the SPDX identifier goes into the second line. + + +Style: + +The SPDX license identifier is added in form of a comment. The comment style depends on the file type: + +C source: // SPDX-License-Identifier: +C header: /* SPDX-License-Identifier: */ +ASM: /* SPDX-License-Identifier: */ +scripts: # SPDX-License-Identifier: +.rst: .. SPDX-License-Identifier: +.dts{i}: // SPDX-License-Identifier: +If a specific tool cannot handle the standard comment style, then the appropriate comment mechanism which the tool accepts shall be used. This is the reason for having the "/* */" style comment in C header files. There was build breakage observed with generated .lds files where 'ld' failed to parse the C++ comment. This has been fixed by now, but there are still older assembler tools which cannot handle C++ style comments. + + +Syntax: + +A is either an SPDX short form license identifier found on the SPDX License List, or the combination of two SPDX short form license identifiers separated by "WITH" when a license exception applies. When multiple licenses apply, an expression consists of keywords "AND", "OR" separating sub-expressions and surrounded by "(", ")" . + +License identifiers for licenses like [L]GPL with the 'or later' option are constructed by using a "+" for indicating the 'or later' option.: + +// SPDX-License-Identifier: GPL-2.0+ +// SPDX-License-Identifier: LGPL-2.1+ +WITH should be used when there is a modifier to a license needed. For example, the linux kernel UAPI files use the expression: + +// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note +// SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note +Other examples using WITH exceptions found in the kernel are: + +// SPDX-License-Identifier: GPL-2.0 WITH mif-exception +// SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 +Exceptions can only be used with particular License identifiers. The valid License identifiers are listed in the tags of the exception text file. For details see the point Exceptions in the chapter License identifiers. + +OR should be used if the file is dual licensed and only one license is to be selected. For example, some dtsi files are available under dual licenses: + +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +Examples from the kernel for license expressions in dual licensed files: + +// SPDX-License-Identifier: GPL-2.0 OR MIT +// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause +// SPDX-License-Identifier: GPL-2.0 OR Apache-2.0 +// SPDX-License-Identifier: GPL-2.0 OR MPL-1.1 +// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT +// SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause OR OpenSSL +AND should be used if the file has multiple licenses whose terms all apply to use the file. For example, if code is inherited from another project and permission has been given to put it in the kernel, but the original license terms need to remain in effect: + +// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT +Another other example where both sets of license terms need to be adhered to is: + +// SPDX-License-Identifier: GPL-1.0+ AND LGPL-2.1+ +License identifiers +The licenses currently used, as well as the licenses for code added to the kernel, can be broken down into: + +Preferred licenses: + +Whenever possible these licenses should be used as they are known to be fully compatible and widely used. These licenses are available from the directory: + +LICENSES/preferred/ +in the kernel source tree. + +The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. + +Examples: + +LICENSES/preferred/GPL-2.0 +Contains the GPL version 2 license text and the required metatags: + +LICENSES/preferred/MIT +Contains the MIT license text and the required metatags + +Metatags: + +The following meta tags must be available in a license file: + +Valid-License-Identifier: + +One or more lines which declare which License Identifiers are valid inside the project to reference this particular license text. Usually this is a single valid identifier, but e.g. for licenses with the 'or later' options two identifiers are valid. + +SPDX-URL: + +The URL of the SPDX page which contains additional information related to the license. + +Usage-Guidance: + +Freeform text for usage advice. The text must include correct examples for the SPDX license identifiers as they should be put into source files according to the License identifier syntax guidelines. + +License-Text: + +All text after this tag is treated as the original license text + +File format examples: + +Valid-License-Identifier: GPL-2.0 +Valid-License-Identifier: GPL-2.0+ +SPDX-URL: https://spdx.org/licenses/GPL-2.0.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU General Public License (GPL) version 2 only' use: + SPDX-License-Identifier: GPL-2.0 + For 'GNU General Public License (GPL) version 2 or any later version' use: + SPDX-License-Identifier: GPL-2.0+ +License-Text: + Full license text +SPDX-License-Identifier: MIT +SPDX-URL: https://spdx.org/licenses/MIT.html +Usage-Guide: + To use this license in source code, put the following SPDX + tag/value pair into a comment according to the placement + guidelines in the licensing rules documentation. + SPDX-License-Identifier: MIT +License-Text: + Full license text + +Deprecated licenses: + +These licenses should only be used for existing code or for importing code from a different project. These licenses are available from the directory: + +LICENSES/deprecated/ +in the kernel source tree. + +The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. + +Examples: + +LICENSES/deprecated/ISC +Contains the Internet Systems Consortium license text and the required metatags: + +LICENSES/deprecated/GPL-1.0 +Contains the GPL version 1 license text and the required metatags. + +Metatags: + +The metatag requirements for 'other' licenses are identical to the requirements of the Preferred licenses. + +File format example: + +Valid-License-Identifier: ISC +SPDX-URL: https://spdx.org/licenses/ISC.html +Usage-Guide: + Usage of this license in the kernel for new code is discouraged + and it should solely be used for importing code from an already + existing project. + To use this license in source code, put the following SPDX + tag/value pair into a comment according to the placement + guidelines in the licensing rules documentation. + SPDX-License-Identifier: ISC +License-Text: + Full license text + +Dual Licensing Only + +These licenses should only be used to dual license code with another license in addition to a preferred license. These licenses are available from the directory: + +LICENSES/dual/ +in the kernel source tree. + +The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. + +Examples: + +LICENSES/dual/MPL-1.1 +Contains the Mozilla Public License version 1.1 license text and the required metatags: + +LICENSES/dual/Apache-2.0 +Contains the Apache License version 2.0 license text and the required metatags. + +Metatags: + +The metatag requirements for 'other' licenses are identical to the requirements of the Preferred licenses. + +File format example: + +Valid-License-Identifier: MPL-1.1 +SPDX-URL: https://spdx.org/licenses/MPL-1.1.html +Usage-Guide: + Do NOT use. The MPL-1.1 is not GPL2 compatible. It may only be used for + dual-licensed files where the other license is GPL2 compatible. + If you end up using this it MUST be used together with a GPL2 compatible + license using "OR". + To use the Mozilla Public License version 1.1 put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: +SPDX-License-Identifier: MPL-1.1 +License-Text: + Full license text + +Exceptions: + +Some licenses can be amended with exceptions which grant certain rights which the original license does not. These exceptions are available from the directory: + +LICENSES/exceptions/ +in the kernel source tree. The files in this directory contain the full exception text and the required Exception Metatags. + +Examples: + +LICENSES/exceptions/Linux-syscall-note +Contains the Linux syscall exception as documented in the COPYING file of the Linux kernel, which is used for UAPI header files. e.g. /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */: + +LICENSES/exceptions/GCC-exception-2.0 +Contains the GCC 'linking exception' which allows to link any binary independent of its license against the compiled version of a file marked with this exception. This is required for creating runnable executables from source code which is not compatible with the GPL. + +Exception Metatags: + +The following meta tags must be available in an exception file: + +SPDX-Exception-Identifier: + +One exception identifier which can be used with SPDX license identifiers. + +SPDX-URL: + +The URL of the SPDX page which contains additional information related to the exception. + +SPDX-Licenses: + +A comma separated list of SPDX license identifiers for which the exception can be used. + +Usage-Guidance: + +Freeform text for usage advice. The text must be followed by correct examples for the SPDX license identifiers as they should be put into source files according to the License identifier syntax guidelines. + +Exception-Text: + +All text after this tag is treated as the original exception text + +File format examples: + +SPDX-Exception-Identifier: Linux-syscall-note +SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html +SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+ +Usage-Guidance: + This exception is used together with one of the above SPDX-Licenses + to mark user-space API (uapi) header files so they can be included + into non GPL compliant user-space application code. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH Linux-syscall-note +Exception-Text: + Full exception text +SPDX-Exception-Identifier: GCC-exception-2.0 +SPDX-URL: https://spdx.org/licenses/GCC-exception-2.0.html +SPDX-Licenses: GPL-2.0, GPL-2.0+ +Usage-Guidance: + The "GCC Runtime Library exception 2.0" is used together with one + of the above SPDX-Licenses for code imported from the GCC runtime + library. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH GCC-exception-2.0 +Exception-Text: + Full exception text +All SPDX license identifiers and exceptions must have a corresponding file in the LICENSES subdirectories. This is required to allow tool verification (e.g. checkpatch.pl) and to have the licenses ready to read and extract right from the source, which is recommended by various FOSS organizations, e.g. the FSFE REUSE initiative. + +MODULE_LICENSE +Loadable kernel modules also require a MODULE_LICENSE() tag. This tag is neither a replacement for proper source code license information (SPDX-License-Identifier) nor in any way relevant for expressing or determining the exact license under which the source code of the module is provided. + +The sole purpose of this tag is to provide sufficient information whether the module is free software or proprietary for the kernel module loader and for user space tools. + +The valid license strings for MODULE_LICENSE() are: + +"GPL" Module is licensed under GPL version 2. This does not express any distinction between GPL-2.0-only or GPL-2.0-or-later. The exact license information can only be determined via the license information in the corresponding source files. +"GPL v2" Same as "GPL". It exists for historic reasons. +"GPL and additional rights" Historical variant of expressing that the module source is dual licensed under a GPL v2 variant and MIT license. Please do not use in new code. +"Dual MIT/GPL" The correct way of expressing that the module is dual licensed under a GPL v2 variant or MIT license choice. +"Dual BSD/GPL" The module is dual licensed under a GPL v2 variant or BSD license choice. The exact variant of the BSD license can only be determined via the license information in the corresponding source files. +"Dual MPL/GPL" The module is dual licensed under a GPL v2 variant or Mozilla Public License (MPL) choice. The exact variant of the MPL license can only be determined via the license information in the corresponding source files. +"Proprietary" The module is under a proprietary license. This string is solely for proprietary third party modules and cannot be used for modules which have their source code in the kernel tree. Modules tagged that way are tainting the kernel with the 'P' flag when loaded and the kernel module loader refuses to link such modules against symbols which are exported with EXPORT_SYMBOL_GPL(). \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" new file mode 100644 index 0000000..0ae2951 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" @@ -0,0 +1,27 @@ +export TST_TS_TOPDIR := $(shell pwd) +DIRS := cmd testcase kmod +LIBS := tst_common tst_lib + +all: libs + @for d in $(DIRS); do \ + echo try make $$d; \ + make -C $$d all; \ + done + +libs: + @for d in $(LIBS); do \ + echo try make $$d; \ + make -C $$d all; \ + done + +clean: + @for d in $(DIRS) $(LIBS); do \ + echo try clean $$d; \ + make -C $$d clean; \ + done + +cleanall: + @for d in $(DIRS) $(LIBS); do \ + echo try cleanall $$d; \ + make -C $$d cleanall; \ + done diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" new file mode 100644 index 0000000..1d9d2da --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" @@ -0,0 +1,3 @@ +CFLAGS += -Wall -g -I$(TST_TS_TOPDIR)/tst_common/lib -I$(TST_TS_TOPDIR)/tst_lib +LDFLAGS += -L$(TST_TS_TOPDIR)/tst_common/lib -L$(TST_TS_TOPDIR)/tst_lib +LDFLAGS += -lm -lrt -lpthread -Wl,--whole-archive -lcommon -ltscommon -Wl,--no-whole-archive diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" new file mode 100644 index 0000000..9c815f0 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" @@ -0,0 +1,99 @@ +# 概述 +为提高测试效率,开发了本项目,在测试用例上增加适配层,统一用例的执行接口。 +适配层以测试套的方式存在,支持C、Shell和Python三种语言开发的用例。 +当多个用例之间有一定关联性或存在公共代码时,可以组织成一个测试套,测试套内用例共享部分资源。 + +# 测试套目录结构 +```shell +suite_example ---------> 测试套顶层目录,绝对路径存储在环境变量TST_TS_TOPDIR中 +├── cmd ---------> 测试套公共命令 +│ ├── hello.c +│ └── Makefile +├── tst_common -----> 【不可修改】submodule,公共代码库:test-suite-base +│ ├── cmd +│ │ ├── Makefile +│ │ └── tsuite.c +│ ├── kmod +│ │ ├── kmod_common.c +│ │ └── Makefile +│ ├── lib +│ │ ├── assert.sh +│ │ ├── common.c +│ │ ├── common_func.sh +│ │ ├── common.h +│ │ ├── common.sh +│ │ ├── main.h +│ │ ├── Makefile +│ │ ├── signature.sh +│ │ ├── tst_ts_setup +│ │ ├── tst_ts_teardown +│ │ └── tsuite_func.sh +│ ├── Makefile +│ └── tsuite +├── kmod ---------> 内核模块,该目录下每个.c文件都会编译成同名的ko +│ ├── kmod_common.c +│ └── Makefile +├── lib ---------> 测试套公共库文件,.sh会被source,.c会被编译为静态库,.py会被import +│ ├── common.sh +│ ├── Makefile +│ ├── other_common.sh +│ ├── ts_setup +│ └── ts_teardown +├── logs ---------> 日志和其他运行时临时目录 +├── Makefile +├── testcase ---------> 测试用例目录,所有测试用例放在此目录下 +│ ├── Makefile +│ ├── test_cmd_ls.sh ---------> 测试用例,.sh和.py会被直接执行,.c会被编译为同名的可执行程序后执行 +│ └── test_c_testcase.c -------> 测试用例 +└── tsuite -> ./common/tsuite ---> 软连接,指向公共代码库中的tsuite文件 +``` + +# 新建测试项目 +可以一个测试套对应一个测试git仓库,也可以多个测试套保存在一个仓库。这里以多个测试套对应一个git仓库示例如下: +```shell +# 1、先在代码托管平台(如gitee、github等)新建git仓库 +# 这里的示例仓库为OpenCloudOS社区的软件包测试项目 +# HTTPS协议:https://gitee.com/OpenCloudOS/packages-testing.git +# SSH协议: git@gitee.com:OpenCloudOS/packages-testing.git + +# 2、下载测试项目 +git clone --recurse-submodules https://gitee.com/OpenCloudOS/packages-testing.git + +# 3、新建一个测试套,例如测试套名为:coreutils +cd ./packages-testing +# 3.1、下载测试套模板 +git clone https://gitee.com/opencloudos-stream/test-suite-example.git ./coreutils +# 3.2、删除无用的文件(git文件、用例示例等) +rm -rf ./coreutils/.git ./coreutils/.gitmodules ./coreutils/testcase/test* +rm -rf ./coreutils/tst_common ./coreutils/README.md +# 3.3、为测试套配置git子模块 +git submodule add https://gitee.com/opencloudos-stream/test-suite-base.git ./coreutils/tst_common + +# 4、将测试套提交到git +git add ./coreutils +git commit -asm "提交coreutils测试套模板" +``` + +# 开发测试用例 +测试用例要放在测试套的testcase目录下,推荐使用tsuite工具生成测试用例模板。 +tsuite工具的用法参考:https://gitee.com/opencloudos-stream/test-suite-base +开发测试用例步骤如下: +```shell +# 1、假设需要开发的用例名为tc-mkdir-01,用例使用shell脚本开发 +cd ./coreutils +./tsuite new case sh tc-mkdir-01 +# 1.1、编辑用例文件,增加测试逻辑 +vim testcase/tc-mkdir-01.sh + +# 2、部分用例有C代码,需要编译,直接执行make all即可 +./tsuite compile + +# 3、用例开发完成后可以执行和调试用例 +./tsuite run ./testcase/tc-mkdir-01.sh +# 3.1、或直接执行用例 +./testcase/tc-mkdir-01.sh + +# 4、用例调试通过后提交用例到git +git add ./testcase/tc-mkdir-01.sh +git commit -asm "新增测试用例tc-mkdir-01验证mkdir命令功能" +``` \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" new file mode 100644 index 0000000..133158c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" @@ -0,0 +1,20 @@ +export TST_TS_TOPDIR ?= $(shell pwd)/.. +include $(TST_TS_TOPDIR)/Makefile.common +ALL_SRC := $(wildcard *.c) +ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) +ALL_BIN := $(patsubst %.o,%.cmd,$(ALL_OBJ)) +CFLAGS += +LDFLAGS += + +all: $(ALL_BIN) + +$(ALL_BIN):%.cmd:%.o + $(CC) $^ -o $@ $(LDFLAGS) + +$(ALL_OBJ):%.o:%.c + $(CC) $(CFLAGS) -c $^ -o $@ + +clean: + rm -rfv $(ALL_OBJ) $(ALL_BIN) + +cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" new file mode 100644 index 0000000..c70b442 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" @@ -0,0 +1,6 @@ +#include + +int main(void) { + printf("hello world\n"); + return 0; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" new file mode 100644 index 0000000..01632ef --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" @@ -0,0 +1,28 @@ +# General Purpose Makefile for Linux Kernel module +# 以下编译适合于在内核代码树之外编译内核模块。 +# 整个过程会导致本Makefile文件被加载执行两遍。 +# 第一遍执行时,由于`KERNELRELEASE`没有被定义,所以先执行`else`下的逻辑。 +# `-C $(KERNEL_DIR)`指明跳转到内核源码目录下读取那里的Makefile; +# `M=$(CURDIR)`表明然后返回到当前目录继续读入当前的Makefile并执行之。此为第二遍执行。 +# 第二遍执行时,此时从内核源码目录返回时,KERNELRELEASE已被被定义, +# kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。 +# else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。 + +CURDIR ?= $(shell pwd) +KERNEL_VER := $(shell uname -r) +KERNEL_DIR ?= /lib/modules/$(KERNEL_VER)/build +export ALL_SRC ?= $(filter-out %.mod.c, $(wildcard *.c)) +export ALL_OBJ ?= $(patsubst %.c,%.o,$(ALL_SRC)) +export ALL_MOD ?= $(patsubst %.o,%.ko,$(ALL_OBJ)) + +ifneq ($(KERNELRELEASE),) + obj-m += $(ALL_OBJ) +else +all: + $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules +endif + +clean: + $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean + +cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" new file mode 100644 index 0000000..41a779a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" @@ -0,0 +1,14 @@ +#include + +static int __init kmod_common_init(void) { + printk("Hello, World!\n"); + return 0; +} +static void __exit kmod_common_exit(void) { + printk("Goodbye, World!\n"); +} + +module_init(kmod_common_init); +module_exit(kmod_common_exit); + +MODULE_LICENSE("GPL"); diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/Makefile" new file mode 100644 index 0000000..1b4db5b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/Makefile" @@ -0,0 +1,21 @@ +export TST_TS_TOPDIR ?= $(shell pwd)/.. +include $(TST_TS_TOPDIR)/Makefile.common +ALL_SRC := $(filter-out %.mod.c, $(wildcard *.c)) +ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) +ALL_BIN := $(patsubst %.o,%.test,$(ALL_OBJ)) +CFLAGS += +LDFLAGS += +LDFLAGS += + +all: $(ALL_BIN) + +$(ALL_BIN):%.test:%.o + $(CC) $^ -o $@ $(LDFLAGS) + +$(ALL_OBJ):%.o:%.c + $(CC) $(CFLAGS) -c $^ -o $@ + +clean: + rm -rfv $(ALL_OBJ) $(ALL_BIN) + +cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" new file mode 100755 index 0000000..de0b2b2 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" @@ -0,0 +1,73 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240709-001807-562305058 +# @用例名称: cgroup-v1-cpuacct-stat +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前stat值,单位为USER_HZ + stat_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) + msg "stat_before: $stat_before" + + # @测试步骤:2: 启动一个用户态和内核态混合任务并将其加入cgroup + { + for _ in {1..100}; do + dd if=/dev/zero of=/dev/null bs=1M count=1 + : $((2**20)) + done + } & + + task_pid=$! + echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid + + # @测试步骤:3: 记录运行任务后的stat值 + stat_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) + msg "stat_after: $stat_after" + + # @预期结果:3: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 + user_before=$(echo "$stat_before" | grep user | awk '{print $2}') + sys_before=$(echo "$stat_before" | grep system | awk '{print $2}') + user_after=$(echo "$stat_after" | grep user | awk '{print $2}') + sys_after=$(echo "$stat_after" | grep system | awk '{print $2}') + + # 如果用户态和内核态CPU使用情况都有增加,则认为测试通过 + if [ "$user_after" -gt "$user_before" ] && [ "$sys_after" -gt "$sys_before" ]; then + assert_true [ true ] + return 0; + fi + + return 1 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" new file mode 100755 index 0000000..f7a69c1 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" @@ -0,0 +1,66 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240707-111241-514473309 +# @用例名称: cgroup-v1-cpuacct-usage +# @用例级别: 3 +# @用例标签: cgroup, cpuacct +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +# 创建一个临时目录 +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件:创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "Running test" + + # @测试步骤:1: 将脚本自身进程放入cgroup + echo $$ >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + + # @测试步骤:2: 运行一个CPU密集型任务 + for i in {1..10000}; do echo "$i" >/dev/null; done + + # @测试步骤:3: 获取cpuacct.usage统计数据 + usage_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) + msg "usage_before: $usage_before ns" + + # @测试步骤:4: 再运行一个CPU密集型任务 + for i in {1..10000}; do echo "$i" >/dev/null; done + + # @测试步骤:5: 获取cpuacct.usage统计数据 + usage_after=$(sudo cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) + msg "usage_after: $usage_after ns" + + # @预期结果:4: 验证统计数据是否正确反映了CPU使用情况,即CPU使用时间增加 + assert_true [ "$usage_after" -gt "$usage_before" ] || { + msg "usage_after: $usage_after <= usage_before: $usage_before" + return 1 + } + + return 0 +} + +tc_teardown() { + msg "Cleaning up test environment" + # 删除cgroup + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" new file mode 100755 index 0000000..8e0418b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -0,0 +1,91 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240708-230226-588399104 +# @用例名称: cgroup-v1-cpuacct-usage_all +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前的usage_all值 + usage_all_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) + msg "usage_all_before: " + msg "$usage_all_before" + + # @测试步骤:2: 启动一个用户态和内核态混合任务并将其放入cgroup + { + for _ in {1..100}; do + dd if=/dev/zero of=/dev/null bs=1M count=1 + : $((2**20)) + done + } & + + task_pid=$! + echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid + + # @测试步骤:3: 记录运行任务后的usage_all值 + usage_all_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) + msg "usage_all_after: " + msg "$usage_all_after" + + # @预期结果:3: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 + # 从usage_all文件中提取用户态和内核态CPU使用时间 + IFS=$'\n' read -r -d '' -a usage_all_before_array <<< "$usage_all_before" + IFS=$'\n' read -r -d '' -a usage_all_after_array <<< "$usage_all_after" + + for i in "${!usage_all_before_array[@]}"; do + # shellcheck disable=SC2206 + before_line=(${usage_all_before_array[$i]}) + # shellcheck disable=SC2206 + after_line=(${usage_all_after_array[$i]}) + if [ "${#before_line[@]}" -ne 3 ] || [ "${#after_line[@]}" -ne 3 ]; then + msg "Invalid line format in usage_all_before or usage_all_after at line $i" + return 1 + fi + + user_before=${before_line[1]} + sys_before=${before_line[2]} + user_after=${after_line[1]} + sys_after=${after_line[2]} + + # 是否存在一个CPU的用户态和内核态CPU使用时间都增加了,如果存在则认为测试通过 + if [ "$user_after" \> "$user_before" ] && [ "$sys_after" \> "$sys_before" ]; then + assert_true [ true ] + return 0 + fi + done + + msg "CPU usage did not increase as expected for CPU" + return 1 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" new file mode 100755 index 0000000..41d54ee --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -0,0 +1,66 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240708-202749-391700569 +# @用例名称: cgroup-v1-cpuacct-usage_percpu +# @用例级别: 3 +# @用例标签: cgroup, cpuacct +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前的每个CPU使用时间 + usage_percpu_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + msg "usage_percpu_before: $usage_percpu_before" + # @测试步骤:2: 启动一个CPU密集型任务并将其放入cgroup + { + for i in {1..10000}; do echo "$i" >/dev/null; done + } & + + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid + + # @测试步骤:3: 记录运行任务后的每CPU使用时间 + usage_percpu_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + msg "usage_percpu_after: $usage_percpu_after" + # @预期结果:3: 验证统计数据是否正确反映了CPU使用情况 + for ((i=0; i<${#usage_percpu_before[@]}; i++)); do + # 是否存在某个CPU的使用时间增加,如果有则说明统计数据正确 + if [ "${usage_percpu_after[$i]}" \> "${usage_percpu_before[$i]}" ]; then + assert_true [ true ] + return 0 + fi + done + + msg "per cpu usage did not increase as expected" + return 1 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" new file mode 100755 index 0000000..d858793 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -0,0 +1,71 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240708-225719-108134845 +# @用例名称: cgroup-v1-cpuacct-usage_percpu_sys +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前的所有任务在每个CPU上使用内核态CPU的时间 + usage_percpu_sys_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) + msg "usege_percpu_sys_before: $usage_percpu_sys_before" + + # @测试步骤:2: 启动一个内核态CPU密集型任务并将其放入cgroup + { + for _ in {1..100}; do + # 执行一些内核态操作 + dd if=/dev/zero of=/dev/null bs=1M count=1 + done + } & + + task_pid=$! + echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid + + # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用内核态CPU的时间 + usage_percpu_sys_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) + msg "usage_percpu_sys_after: $usage_percpu_sys_after" + + # @预期结果:3: + for ((i=0; i<${#usage_percpu_sys_before[@]}; i++)); do + # 是否存在某个CPU的内核态CPU使用时间增加,如果有则说明统计数据正确 + if [ "${usage_percpu_sys_after[$i]}" \> "${usage_percpu_sys_before[$i]}" ]; then + assert_true [ true ] + return 0 + fi + done + + msg "per cpu usage did not increase as expected" + return 1 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" new file mode 100755 index 0000000..cc506f4 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -0,0 +1,71 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240708-220905-322684320 +# @用例名称: cgroup-v1-cpuacct-usage_percpu_user +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前的所有任务在每个CPU上使用用户态CPU的时间 + usage_percpu_user_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + msg "usege_percpu_user_before: $usage_percpu_user_before" + + # @测试步骤:2: 启动一个用户态CPU密集型任务并将其放入cgroup + { + for _ in {1..1000000}; do + # 执行一些用户态操作 + : $((2**20)) + done + } & + + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid # 等待任务结束 + + # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用用户态CPU的时间 + usage_percpu_user_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + msg "usage_percpu_user_after: $usage_percpu_user_after" + + # @预期结果:3: + for ((i=0; i<${#usage_percpu_user_before[@]}; i++)); do + # 是否存在某个CPU的用户态CPU使用时间增加,如果有则说明统计数据正确 + if [ "${usage_percpu_user_after[$i]}" \> "${usage_percpu_user_before[$i]}" ]; then + assert_true [ true ] + return 0 + fi + done + + msg "per cpu usage did not increase as expected" + return 1 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" new file mode 100755 index 0000000..2e8d1fd --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -0,0 +1,67 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240708-210528-911301197 +# @用例名称: cgroup-v1-cpuacct-usage_sys +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前的内核态CPU使用时间 + usage_sys_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) + msg "usege_sys_before: $usage_sys_before ns" + + # @测试步骤:2: 启动一个内核态CPU密集型任务并将其放入cgroup + { + for _ in {1..100}; do + # 执行一些内核态操作 + dd if=/dev/zero of=/dev/null bs=1M count=1 + done + } & + + task_pid=$! + echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid + + # @测试步骤:3: 记录运行任务后的内核态CPU使用时间 + usage_sys_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) + msg "usage_sys_after: $usage_sys_after ns" + + # @预期结果:3: 验证统计数据是否正确反映了内核态CPU使用情况,即内核态CPU使用时间增加 + assert_true [ "$usage_sys_after" -gt "$usage_sys_before" ] || { + msg "Kernel CPU usage did not increase as expected: before=$usage_sys_before, after=$usage_sys_after" + return 1 + } + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" new file mode 100755 index 0000000..0b666ae --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -0,0 +1,67 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240708-214708-138227018 +# @用例名称: cgroup-v1-cpuacct-usage_user +# @用例级别: 3 +# @用例标签: cgroup, cpuacct +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 记录运行任务前的用户态CPU使用时间 + usage_user_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) + msg "usage_user_before: $usage_user_before ns" + + # @测试步骤:2: 启用一个用户态CPU密集型任务并将其放入cgroup + { + for _ in {1..1000000}; do + # 执行一些用户态操作 + : $((2**20)) + done + } & + + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + wait $task_pid + + # @测试步骤:3: 记录运行任务后的用户态CPU使用时间 + usage_user_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) + msg "usage_user_after: $usage_user_after ns" + + # @预期结果:3: 验证统计数据是否正确反映了用户态CPU使用情况,即用户态CPU使用时间增加 + assert_true [ "$usage_user_after" -gt "$usage_user_before" ] || { + msg "usage_user_after: $usage_user_after <= usage_user_before: $usage_user_before" + return 1 + } + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" new file mode 100644 index 0000000..8e67438 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" @@ -0,0 +1,33 @@ +# Build and Release Folders +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# Other files and folders +.settings/ + +# Executables +*.swf +*.air +*.ipa +*.apk + +# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` +# should NOT be excluded as they contain compiler settings and other important +# information for Eclipse / Flash Builder. +.idea/ +logs/ +__pycache__/ +*.o +*.a +*.d +*.cmd +*.test +*.log +*.ko +*.mod +*.mod.c +Module.symvers +modules.order +compile_commands.json diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" new file mode 100644 index 0000000..d06cc9f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" @@ -0,0 +1,824 @@ +Tencent is pleased to support the open source community by making OpenCloudOS Kernel Stream available. + +Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications"). All Tencent Modifications are Copyright (C) THL A29 Limited. + +OpenCloudOS Kernel Stream is licensed under the the Mulan Permissive Software License 2.0 except for the third-party components listed below. + + +Terms of the Mulan Permissive Software License 2.0: +-------------------------------------------------------------------- + 木兰宽松许可证, 第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体”是指提交贡献的机构及其“关联实体”。 + +“关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1,请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2,请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3,请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + +0. Definition + +Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its Affiliates. + +Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + + + +Other dependencies and licenses: + + +Open Source Software Licensed under the GPL v2.0 with Linux-syscall-note, and Other Licenses of the Third-Party Components therein: +The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications"). All Tencent Modifications are Copyright (C) 2021 THL A29 Limited. +-------------------------------------------------------------------- +1. kernel +Copyright © kernel original author and authors + + +The Linux Kernel is provided under: + + SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note + +Being under the terms of the GNU General Public License version 2 only, +according with: + + LICENSES/preferred/GPL-2.0 + +With an explicit syscall exception, as stated at: + + LICENSES/exceptions/Linux-syscall-note + +In addition, other licenses may also apply. Please see: + + Documentation/process/license-rules.rst + +for more details. + +All contributions to the Linux Kernel are subject to this COPYING file. + +Valid-License-Identifier: GPL-2.0 +Valid-License-Identifier: GPL-2.0-only +Valid-License-Identifier: GPL-2.0+ +Valid-License-Identifier: GPL-2.0-or-later +SPDX-URL: https://spdx.org/licenses/GPL-2.0.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU General Public License (GPL) version 2 only' use: + SPDX-License-Identifier: GPL-2.0 + or + SPDX-License-Identifier: GPL-2.0-only + For 'GNU General Public License (GPL) version 2 or any later version' use: + SPDX-License-Identifier: GPL-2.0+ + or + SPDX-License-Identifier: GPL-2.0-or-later +License-Text: + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +SPDX-Exception-Identifier: Linux-syscall-note +SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html +SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+, GPL-2.0-only, GPL-2.0-or-later +Usage-Guide: + This exception is used together with one of the above SPDX-Licenses + to mark user space API (uapi) header files so they can be included + into non GPL compliant user space application code. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH Linux-syscall-note +License-Text: + + NOTE! This copyright does *not* cover user programs that use kernel + services by normal system calls - this is merely considered normal use + of the kernel, and does *not* fall under the heading of "derived work". + Also note that the GPL below is copyrighted by the Free Software + Foundation, but the instance of code that it refers to (the Linux + kernel) is copyrighted by me and others who actually wrote it. + + Also note that the only valid version of the GPL as far as the kernel + is concerned is _this_ particular version of the license (ie v2, not + v2.2 or v3.x or whatever), unless explicitly otherwise stated. + + Linus Torvalds + +For the licenses of other third parties, please refer to the following URL: +https://github.com/torvalds/linux/tree/v5.18-rc5/LICENSES + +Linux kernel licensing rules +The Linux Kernel is provided under the terms of the GNU General Public License version 2 only (GPL-2.0), as provided in LICENSES/preferred/GPL-2.0, with an explicit syscall exception described in LICENSES/exceptions/Linux-syscall-note, as described in the COPYING file. + +This documentation file provides a description of how each source file should be annotated to make its license clear and unambiguous. It doesn't replace the Kernel's license. + +The license described in the COPYING file applies to the kernel source as a whole, though individual source files can have a different license which is required to be compatible with the GPL-2.0: + +GPL-1.0+ : GNU General Public License v1.0 or later +GPL-2.0+ : GNU General Public License v2.0 or later +LGPL-2.0 : GNU Library General Public License v2 only +LGPL-2.0+ : GNU Library General Public License v2 or later +LGPL-2.1 : GNU Lesser General Public License v2.1 only +LGPL-2.1+ : GNU Lesser General Public License v2.1 or later +Aside from that, individual files can be provided under a dual license, e.g. one of the compatible GPL variants and alternatively under a permissive license like BSD, MIT etc. + +The User-space API (UAPI) header files, which describe the interface of user-space programs to the kernel are a special case. According to the note in the kernel COPYING file, the syscall interface is a clear boundary, which does not extend the GPL requirements to any software which uses it to communicate with the kernel. Because the UAPI headers must be includable into any source files which create an executable running on the Linux kernel, the exception must be documented by a special license expression. + +The common way of expressing the license of a source file is to add the matching boilerplate text into the top comment of the file. Due to formatting, typos etc. these "boilerplates" are hard to validate for tools which are used in the context of license compliance. + +An alternative to boilerplate text is the use of Software Package Data Exchange (SPDX) license identifiers in each source file. SPDX license identifiers are machine parsable and precise shorthands for the license under which the content of the file is contributed. SPDX license identifiers are managed by the SPDX Workgroup at the Linux Foundation and have been agreed on by partners throughout the industry, tool vendors, and legal teams. For further information see https://spdx.org/ + +The Linux kernel requires the precise SPDX identifier in all source files. The valid identifiers used in the kernel are explained in the section License identifiers and have been retrieved from the official SPDX license list at https://spdx.org/licenses/ along with the license texts. + +License identifier syntax +Placement: + +The SPDX license identifier in kernel files shall be added at the first possible line in a file which can contain a comment. For the majority of files this is the first line, except for scripts which require the '#!PATH_TO_INTERPRETER' in the first line. For those scripts the SPDX identifier goes into the second line. + + +Style: + +The SPDX license identifier is added in form of a comment. The comment style depends on the file type: + +C source: // SPDX-License-Identifier: +C header: /* SPDX-License-Identifier: */ +ASM: /* SPDX-License-Identifier: */ +scripts: # SPDX-License-Identifier: +.rst: .. SPDX-License-Identifier: +.dts{i}: // SPDX-License-Identifier: +If a specific tool cannot handle the standard comment style, then the appropriate comment mechanism which the tool accepts shall be used. This is the reason for having the "/* */" style comment in C header files. There was build breakage observed with generated .lds files where 'ld' failed to parse the C++ comment. This has been fixed by now, but there are still older assembler tools which cannot handle C++ style comments. + + +Syntax: + +A is either an SPDX short form license identifier found on the SPDX License List, or the combination of two SPDX short form license identifiers separated by "WITH" when a license exception applies. When multiple licenses apply, an expression consists of keywords "AND", "OR" separating sub-expressions and surrounded by "(", ")" . + +License identifiers for licenses like [L]GPL with the 'or later' option are constructed by using a "+" for indicating the 'or later' option.: + +// SPDX-License-Identifier: GPL-2.0+ +// SPDX-License-Identifier: LGPL-2.1+ +WITH should be used when there is a modifier to a license needed. For example, the linux kernel UAPI files use the expression: + +// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note +// SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note +Other examples using WITH exceptions found in the kernel are: + +// SPDX-License-Identifier: GPL-2.0 WITH mif-exception +// SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 +Exceptions can only be used with particular License identifiers. The valid License identifiers are listed in the tags of the exception text file. For details see the point Exceptions in the chapter License identifiers. + +OR should be used if the file is dual licensed and only one license is to be selected. For example, some dtsi files are available under dual licenses: + +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +Examples from the kernel for license expressions in dual licensed files: + +// SPDX-License-Identifier: GPL-2.0 OR MIT +// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause +// SPDX-License-Identifier: GPL-2.0 OR Apache-2.0 +// SPDX-License-Identifier: GPL-2.0 OR MPL-1.1 +// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT +// SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause OR OpenSSL +AND should be used if the file has multiple licenses whose terms all apply to use the file. For example, if code is inherited from another project and permission has been given to put it in the kernel, but the original license terms need to remain in effect: + +// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT +Another other example where both sets of license terms need to be adhered to is: + +// SPDX-License-Identifier: GPL-1.0+ AND LGPL-2.1+ +License identifiers +The licenses currently used, as well as the licenses for code added to the kernel, can be broken down into: + +Preferred licenses: + +Whenever possible these licenses should be used as they are known to be fully compatible and widely used. These licenses are available from the directory: + +LICENSES/preferred/ +in the kernel source tree. + +The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. + +Examples: + +LICENSES/preferred/GPL-2.0 +Contains the GPL version 2 license text and the required metatags: + +LICENSES/preferred/MIT +Contains the MIT license text and the required metatags + +Metatags: + +The following meta tags must be available in a license file: + +Valid-License-Identifier: + +One or more lines which declare which License Identifiers are valid inside the project to reference this particular license text. Usually this is a single valid identifier, but e.g. for licenses with the 'or later' options two identifiers are valid. + +SPDX-URL: + +The URL of the SPDX page which contains additional information related to the license. + +Usage-Guidance: + +Freeform text for usage advice. The text must include correct examples for the SPDX license identifiers as they should be put into source files according to the License identifier syntax guidelines. + +License-Text: + +All text after this tag is treated as the original license text + +File format examples: + +Valid-License-Identifier: GPL-2.0 +Valid-License-Identifier: GPL-2.0+ +SPDX-URL: https://spdx.org/licenses/GPL-2.0.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU General Public License (GPL) version 2 only' use: + SPDX-License-Identifier: GPL-2.0 + For 'GNU General Public License (GPL) version 2 or any later version' use: + SPDX-License-Identifier: GPL-2.0+ +License-Text: + Full license text +SPDX-License-Identifier: MIT +SPDX-URL: https://spdx.org/licenses/MIT.html +Usage-Guide: + To use this license in source code, put the following SPDX + tag/value pair into a comment according to the placement + guidelines in the licensing rules documentation. + SPDX-License-Identifier: MIT +License-Text: + Full license text + +Deprecated licenses: + +These licenses should only be used for existing code or for importing code from a different project. These licenses are available from the directory: + +LICENSES/deprecated/ +in the kernel source tree. + +The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. + +Examples: + +LICENSES/deprecated/ISC +Contains the Internet Systems Consortium license text and the required metatags: + +LICENSES/deprecated/GPL-1.0 +Contains the GPL version 1 license text and the required metatags. + +Metatags: + +The metatag requirements for 'other' licenses are identical to the requirements of the Preferred licenses. + +File format example: + +Valid-License-Identifier: ISC +SPDX-URL: https://spdx.org/licenses/ISC.html +Usage-Guide: + Usage of this license in the kernel for new code is discouraged + and it should solely be used for importing code from an already + existing project. + To use this license in source code, put the following SPDX + tag/value pair into a comment according to the placement + guidelines in the licensing rules documentation. + SPDX-License-Identifier: ISC +License-Text: + Full license text + +Dual Licensing Only + +These licenses should only be used to dual license code with another license in addition to a preferred license. These licenses are available from the directory: + +LICENSES/dual/ +in the kernel source tree. + +The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. + +Examples: + +LICENSES/dual/MPL-1.1 +Contains the Mozilla Public License version 1.1 license text and the required metatags: + +LICENSES/dual/Apache-2.0 +Contains the Apache License version 2.0 license text and the required metatags. + +Metatags: + +The metatag requirements for 'other' licenses are identical to the requirements of the Preferred licenses. + +File format example: + +Valid-License-Identifier: MPL-1.1 +SPDX-URL: https://spdx.org/licenses/MPL-1.1.html +Usage-Guide: + Do NOT use. The MPL-1.1 is not GPL2 compatible. It may only be used for + dual-licensed files where the other license is GPL2 compatible. + If you end up using this it MUST be used together with a GPL2 compatible + license using "OR". + To use the Mozilla Public License version 1.1 put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: +SPDX-License-Identifier: MPL-1.1 +License-Text: + Full license text + +Exceptions: + +Some licenses can be amended with exceptions which grant certain rights which the original license does not. These exceptions are available from the directory: + +LICENSES/exceptions/ +in the kernel source tree. The files in this directory contain the full exception text and the required Exception Metatags. + +Examples: + +LICENSES/exceptions/Linux-syscall-note +Contains the Linux syscall exception as documented in the COPYING file of the Linux kernel, which is used for UAPI header files. e.g. /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */: + +LICENSES/exceptions/GCC-exception-2.0 +Contains the GCC 'linking exception' which allows to link any binary independent of its license against the compiled version of a file marked with this exception. This is required for creating runnable executables from source code which is not compatible with the GPL. + +Exception Metatags: + +The following meta tags must be available in an exception file: + +SPDX-Exception-Identifier: + +One exception identifier which can be used with SPDX license identifiers. + +SPDX-URL: + +The URL of the SPDX page which contains additional information related to the exception. + +SPDX-Licenses: + +A comma separated list of SPDX license identifiers for which the exception can be used. + +Usage-Guidance: + +Freeform text for usage advice. The text must be followed by correct examples for the SPDX license identifiers as they should be put into source files according to the License identifier syntax guidelines. + +Exception-Text: + +All text after this tag is treated as the original exception text + +File format examples: + +SPDX-Exception-Identifier: Linux-syscall-note +SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html +SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+ +Usage-Guidance: + This exception is used together with one of the above SPDX-Licenses + to mark user-space API (uapi) header files so they can be included + into non GPL compliant user-space application code. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH Linux-syscall-note +Exception-Text: + Full exception text +SPDX-Exception-Identifier: GCC-exception-2.0 +SPDX-URL: https://spdx.org/licenses/GCC-exception-2.0.html +SPDX-Licenses: GPL-2.0, GPL-2.0+ +Usage-Guidance: + The "GCC Runtime Library exception 2.0" is used together with one + of the above SPDX-Licenses for code imported from the GCC runtime + library. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH GCC-exception-2.0 +Exception-Text: + Full exception text +All SPDX license identifiers and exceptions must have a corresponding file in the LICENSES subdirectories. This is required to allow tool verification (e.g. checkpatch.pl) and to have the licenses ready to read and extract right from the source, which is recommended by various FOSS organizations, e.g. the FSFE REUSE initiative. + +MODULE_LICENSE +Loadable kernel modules also require a MODULE_LICENSE() tag. This tag is neither a replacement for proper source code license information (SPDX-License-Identifier) nor in any way relevant for expressing or determining the exact license under which the source code of the module is provided. + +The sole purpose of this tag is to provide sufficient information whether the module is free software or proprietary for the kernel module loader and for user space tools. + +The valid license strings for MODULE_LICENSE() are: + +"GPL" Module is licensed under GPL version 2. This does not express any distinction between GPL-2.0-only or GPL-2.0-or-later. The exact license information can only be determined via the license information in the corresponding source files. +"GPL v2" Same as "GPL". It exists for historic reasons. +"GPL and additional rights" Historical variant of expressing that the module source is dual licensed under a GPL v2 variant and MIT license. Please do not use in new code. +"Dual MIT/GPL" The correct way of expressing that the module is dual licensed under a GPL v2 variant or MIT license choice. +"Dual BSD/GPL" The module is dual licensed under a GPL v2 variant or BSD license choice. The exact variant of the BSD license can only be determined via the license information in the corresponding source files. +"Dual MPL/GPL" The module is dual licensed under a GPL v2 variant or Mozilla Public License (MPL) choice. The exact variant of the MPL license can only be determined via the license information in the corresponding source files. +"Proprietary" The module is under a proprietary license. This string is solely for proprietary third party modules and cannot be used for modules which have their source code in the kernel tree. Modules tagged that way are tainting the kernel with the 'P' flag when loaded and the kernel module loader refuses to link such modules against symbols which are exported with EXPORT_SYMBOL_GPL(). \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" new file mode 100644 index 0000000..617a017 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" @@ -0,0 +1,27 @@ +export TST_COMMON_TOPDIR := $(shell pwd) +DIRS := cmd testcase kmod +LIBS := lib + +all: libs + @for d in $(DIRS); do \ + echo try make common $$d; \ + make -C $$d all; \ + done + +libs: + @for d in $(LIBS); do \ + echo try make common $$d; \ + make -C $$d all; \ + done + +clean: + @for d in $(DIRS) $(LIBS); do \ + echo try clean common $$d; \ + make -C $$d clean; \ + done + +cleanall: + @for d in $(DIRS) $(LIBS); do \ + echo try cleanall common $$d; \ + make -C $$d cleanall; \ + done diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" new file mode 100644 index 0000000..80b47be --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" @@ -0,0 +1,2 @@ +CFLAGS += -Wall -g -I$(TST_COMMON_TOPDIR)/lib +LDFLAGS += -lm -lrt -lpthread -lcommon -L$(TST_COMMON_TOPDIR)/lib diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" new file mode 100644 index 0000000..315b9f9 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" @@ -0,0 +1,21 @@ +# 概述 +本项目为自动化测试用例的公共代码库和框架代码,公共库接口函数见`docs/API-*.md`部分内容 +测试套应用请参考:https://gitee.com/opencloudos-stream/test-suite-example + +# 用法 +```shell +tsuite options sub_command sub_options + help: 显示帮助信息 + new case sh|c|py case_name [template]: 新增测试用例 + sh|c|py: 【必选】三选一,sh表示Shell脚本用例,c表示C用例,py表示Python脚本用例 + case_name: 【必选】要创建的用例名,同时用作文件名 + template: 【可选】不使用默认用例模板时,可以指定一个文件用作新用例模板 + list: 列出本测试套的测试用例 + compile: 编译测试套 + setup: 执行测试套setup + run [case_path|case_name]: 执行测试用例 + case_path|case_name: 【可选】不指定此参数时执行测试套所有用例,指定时执行指定用例 + teardown: 执行测试套teardown + clean: 执行make clean + cleanall: 执行make cleanall,在clean基础上删除所有临时文件等 +``` \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" new file mode 100644 index 0000000..7eec895 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" @@ -0,0 +1,20 @@ +export TST_COMMON_TOPDIR ?= $(shell pwd)/.. +include $(TST_COMMON_TOPDIR)/Makefile.common +ALL_SRC := $(wildcard *.c) +ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) +ALL_BIN := $(patsubst %.o,%.cmd,$(ALL_OBJ)) +CFLAGS += +LDFLAGS += + +all: $(ALL_BIN) + +$(ALL_BIN):%.cmd:%.o + $(CC) $^ -o $@ $(LDFLAGS) + +$(ALL_OBJ):%.o:%.c + $(CC) $(CFLAGS) -c $^ -o $@ + +clean: + rm -rfv $(ALL_OBJ) $(ALL_BIN) + +cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" new file mode 100644 index 0000000..006dcf3 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" @@ -0,0 +1,6 @@ +#include "common.h" + +int main(void) { + dbg("hello world"); + return 0; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" new file mode 100644 index 0000000..988a482 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" @@ -0,0 +1,24 @@ +# 断言 +## assert_true +```C +// 原型:assert_true(expr) +// 功能:断言表达式返回真 +// 参数: +// expr -- 表达式 +// 返回值:无 +// 示例: +assert_true(1 == 2); +assert_true(a >= b); +``` + +## assert_false +```C +// 原型:assert_false(expr) +// 功能:断言表达式返回假 +// 参数: +// expr -- 表达式 +// 返回值:无 +// 示例: +assert_false(1 == 2); +assert_false(a >= b); +``` diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" new file mode 100644 index 0000000..033c9f5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" @@ -0,0 +1,62 @@ +# 断言 +## assert_true +```Python +def assert_true(self, expr, message=None): + """ + 断言表达式返回真 + :param expr: 要断言的表达式 + :param message: 断言要输出的信息 + :return: None + 示例: + assert_true(1 == 2) + assert_true(a >= b) + """ + pass +``` + +## assert_false +```Python +def assert_false(self, expr, message=None): + """ + 断言表达式返回假 + :param expr: 要断言的表达式 + :param message: 断言要输出的信息 + :return: None + 示例: + assert_false(1 == 2) + assert_false(a >= b) + """ + pass +``` + +## skip_test、skip_if_true和skip_if_false +```Python +def skip_test(self, message=None): + """ + 标记用例为SKIP状态(当用例不需要测试时) + :param message: 要输出的信息 + :return: None + 示例: + skip_test(message='内核CONFIG_XXX未开,系统不支持此测试') + """ + +def skip_if_true(self, expr, message=None): + """ + 当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 + :param expr: 要判断的表达式 + :param message: 要输出的信息 + :return: None + 示例: + skip_if_true(1 == 2) + """ + +def skip_if_false(self, expr, message=None): + """ + 当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 + :param expr: 要判断的表达式 + :param message: 要输出的信息 + :return: None + 示例: + skip_if_false(1 == 2) + """ +``` diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" new file mode 100644 index 0000000..3aa1ab0 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" @@ -0,0 +1,68 @@ +# 断言 +## assert_true和assert_true_cont +```Shell +# 功能:断言表达式返回真或命令执行成功,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 +# 参数: +# $* -- 需要断言的表达式 +# 返回值: +# 0 -- 断言成功 +# 1 -- 断言失败 +# 示例: +assert_true [ $? -eq 0 ] +assert_true_cont grep "abc" /tmp/file +``` + +## assert_false和assert_false_cont +```Shell +# 功能:断言表达式返回假或命令执行失败,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 +# 参数: +# $* -- 需要断言的表达式 +# 返回值: +# 0 -- 断言成功 +# 1 -- 断言失败 +# 示例: +assert_false test -d /tmp/dir +assert_false_cont rmmod mykmod +``` + +## skip_test、skip_if_true和skip_if_false +```Shell +# skip_test +# 功能:标记用例为SKIP状态(当用例不需要测试时) +# 参数: +# $1 -- 对SKIP状态标记的描述 +# 返回值:无 +# 示例: +skip_test "内核CONFIG_XXXX未打开,系统不支持xxx功能" + +# skip_if_true +# 功能:当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 +# 参数: +# $* -- 需要断言的表达式 +# 返回值:无 +# 示例: +skip_if_true test -f /etc/xxx.conf + +# skip_if_false +# 功能:当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 +# 参数: +# $* -- 需要断言的表达式 +# 返回值:无 +# 示例: +skip_if_false which ps +``` +# 工具 +## conv_unit +```Shell +# 功能:将K/M/G/T等单位互相转换 +# 参数:conv_unit [-i k|m|g|t] [-o k|m|g|t] value[_with_unit] +# -i k|m|g|t 【可选参数】输入数据的单位,可选参数,若不指定单位,则默认为1,或者输入的值后面带参数 +# -o k|m|g|t 【可选参数】输出数据的单位,若不指定单位,则默认为1 +# value[_with_unit] 【必选参数】需要转换的数据值,可以跟单位(只取单位第一个字母用于判断k|m|g|t) +# 返回值:标准输出转换后的结果 +# 0 -- 转换成功 +# 1 -- 转换失败 +# 示例: +conv_unit -o M 3G +conv_unit -o M -i G 3 +``` diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" new file mode 100644 index 0000000..01632ef --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" @@ -0,0 +1,28 @@ +# General Purpose Makefile for Linux Kernel module +# 以下编译适合于在内核代码树之外编译内核模块。 +# 整个过程会导致本Makefile文件被加载执行两遍。 +# 第一遍执行时,由于`KERNELRELEASE`没有被定义,所以先执行`else`下的逻辑。 +# `-C $(KERNEL_DIR)`指明跳转到内核源码目录下读取那里的Makefile; +# `M=$(CURDIR)`表明然后返回到当前目录继续读入当前的Makefile并执行之。此为第二遍执行。 +# 第二遍执行时,此时从内核源码目录返回时,KERNELRELEASE已被被定义, +# kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。 +# else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。 + +CURDIR ?= $(shell pwd) +KERNEL_VER := $(shell uname -r) +KERNEL_DIR ?= /lib/modules/$(KERNEL_VER)/build +export ALL_SRC ?= $(filter-out %.mod.c, $(wildcard *.c)) +export ALL_OBJ ?= $(patsubst %.c,%.o,$(ALL_SRC)) +export ALL_MOD ?= $(patsubst %.o,%.ko,$(ALL_OBJ)) + +ifneq ($(KERNELRELEASE),) + obj-m += $(ALL_OBJ) +else +all: + $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules +endif + +clean: + $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean + +cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" new file mode 100644 index 0000000..41a779a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" @@ -0,0 +1,14 @@ +#include + +static int __init kmod_common_init(void) { + printk("Hello, World!\n"); + return 0; +} +static void __exit kmod_common_exit(void) { + printk("Goodbye, World!\n"); +} + +module_init(kmod_common_init); +module_exit(kmod_common_exit); + +MODULE_LICENSE("GPL"); diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" new file mode 100644 index 0000000..ac2cdd6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" @@ -0,0 +1,20 @@ +export TST_COMMON_TOPDIR ?= $(shell pwd)/.. +include $(TST_COMMON_TOPDIR)/Makefile.common +ALL_SRC := $(wildcard *.c) +ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) +LIB_STATIC := libcommon.a +CFLAGS += + +all: $(LIB_STATIC) + +$(LIB_STATIC): $(ALL_OBJ) + ar -rc $(LIB_STATIC) $(ALL_OBJ) + +$(ALL_OBJ):%.o:%.c + $(CC) $(CFLAGS) -c $^ -o $@ + +clean: + rm -rfv $(LIB_STATIC) $(ALL_OBJ) + +cleanall: clean + rm -rfv __pycache__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" new file mode 100644 index 0000000..5ff07e0 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" @@ -0,0 +1,389 @@ +// Time: 2022-06-30 11:10:49 +// Desc: 性能测试框架 + +#include +#include +#include +#include +#include + +#include "benchmark.h" + +long long tst_time_diff(struct tst_time *s, struct tst_time *e) { + return (long long) (e->ts.tv_sec - s->ts.tv_sec) * NS_PER_SEC + (e->ts.tv_nsec - s->ts.tv_nsec); +} + +int tst_get_time(struct tst_time *t) { + if (clock_gettime(CLOCK_MONOTONIC, &(t->ts)) != 0) { + return 1; + } + return 0; +} + +long long tst_time_since_now(struct tst_time *t) { + struct tst_time now; + (void) tst_get_time(&now); + return tst_time_diff(t, &now); +} + +struct tst_perf_ctrl *tst_alloc_ctrl(const char *name, tst_perf_func_t setup, tst_perf_func_t do_test, + tst_perf_func_t teardown, void *args, int warmup, int loop, enum value_type type, + enum key_item key) { + struct tst_perf_ctrl *c = NULL; + + if (name == NULL) { + printf("the name can't be NULL\n"); + return NULL; + } + if (do_test == NULL) { + printf("the do_test function can't be NULL\n"); + return NULL; + } + if (warmup < 0) { + printf("the warmup can't less then 0"); + return NULL; + } + if (loop <= 0) { + printf("the loop must greater then 0"); + return NULL; + } + if (type < LIB || type > HIB) { + printf("the type must in enum value_type"); + return NULL; + } + if (key < key_max || key > key_standard_deviation) { + printf("the key must in enum key_item"); + return NULL; + } + + c = (struct tst_perf_ctrl *) malloc(sizeof(struct tst_perf_ctrl)); + if (c == NULL) { + printf("malloc tst_perf_ctrl fail\n"); + return NULL; + } + (void) memset(c, 0, sizeof(struct tst_perf_ctrl)); + c->name = name; + c->perf_setup = setup; + c->perf_do_test = do_test; + c->perf_teardown = teardown; + c->args = args; + c->nr_warmup = warmup; + c->nr_loop = loop; + c->value_type = type; + c->key_item = key; + c->data = (long long *) calloc(c->nr_loop, sizeof(long long)); + if (c->data == NULL) { + printf("alloc memory for time data fail\n"); + free(c); + return NULL; + } + + return c; +} + +void tst_destroy_ctrl(struct tst_perf_ctrl **c) { + if (c == NULL || *c == NULL) { + return; + } + if ((*c)->data != NULL) { + free((*c)->data); + (*c)->data = NULL; + } + free(*c); + *c = NULL; +} + +int tst_perf_run(struct tst_perf_ctrl *c) { + int ret = 0; + int i; + struct tst_time t; + + if (c == NULL) { + return 1; + } + // 预热 + fprintf(stderr, "%s : start warmup %d\n", c->name, c->nr_warmup); + while (c->nr_warmup > 0) { + c->nr_warmup--; + + if (c->perf_setup) { + ret = c->perf_setup(c->args); + if (ret != 0) { + printf("the perf_setup return %d\n", ret); + return 1; + } + } + + ret = c->perf_do_test(c->args); + if (ret != 0) { + printf("the perf_do_test return %d\n", ret); + return 1; + } + + if (c->perf_teardown) { + ret = c->perf_teardown(c->args); + if (ret != 0) { + printf("the perf_teardown return %d\n", ret); + return 1; + } + } + } + + // 执行性能测试 + fprintf(stderr, "%s : start perf test loop %d\n", c->name, c->nr_loop); + for (i = 0; i < c->nr_loop; i++) { + if (c->perf_setup) { + ret = c->perf_setup(c->args); + if (ret != 0) { + printf("the perf_setup return %d\n", ret); + return 1; + } + } + + (void) tst_get_time(&t); + ret = c->perf_do_test(c->args); + if (ret != 0) { + printf("the perf_do_test return %d\n", ret); + return 1; + } + c->data[i] = tst_time_since_now(&t); + + if (c->perf_teardown) { + ret = c->perf_teardown(c->args); + if (ret != 0) { + printf("the perf_teardown return %d\n", ret); + return 1; + } + } + } + + return 0; +} + +int compare_time(const void *a, const void *b) { + return (int) (*(long long *) a - *(long long *) b); +} + +int statistic_data_base(long long *data, int len, struct tst_statistics_base *result) { + long double sum = 0; + long double step_20, step_100; + long double variance = 0; + int i; + + if (data == NULL || result == NULL || len <= 0) { + return 1; + } + + result->max = data[len - 1]; + result->min = data[0]; + result->median = data[(int) (len / 2)]; + step_20 = (long double) (result->max - result->min) / 20; + step_100 = (long double) (result->max - result->min) / 100; + + for (i = 0; i < len; i++) { + sum += data[i]; + if (step_20 > 0) { + result->dist_20[(int) ((data[i] - result->min) / step_20)]++; + } + if (step_100 > 0) { + result->dist_100[(int) ((data[i] - result->min) / step_100)]++; + } + } + + result->mean = sum / len; + + // 计算方差和 + for (i = 0; i < len; i++) { + variance += powl(data[i] - result->mean, 2); + } + // 计算标准差 + result->standard_deviation = sqrtl(variance / len); + + return 0; +} + +int statistic_data(struct tst_perf_ctrl *c) { + if (c == NULL) { + return 1; + } + int percent_5_start = (int) (c->nr_loop * 0.05); + int percent_5_len = (int) (c->nr_loop * 0.9); + + if (c->data == NULL) { + printf("the data is NULL\n"); + return 1; + } + + // 将时间数据排序 + qsort(c->data, c->nr_loop, sizeof(long long), compare_time); + (void) statistic_data_base(c->data, c->nr_loop, &(c->result.all)); + (void) statistic_data_base(&(c->data[percent_5_start]), percent_5_len, &(c->result.mid_90)); + + return 0; +} + +int show_result_json(struct tst_perf_ctrl *c) { + int i; + + if (statistic_data(c) != 0) { + return 1; + } + + printf("{"); + + printf("'name': '%s',", c->name); + printf("'type': '%s',", "LIB"); + printf("'unit': '%s',", "ns"); + printf("'key': '%s',", "mean"); + + printf("'data': {"); + + printf("100: {"); + printf("'max': %lld,", c->result.all.max); + printf("'min': %lld,", c->result.all.min); + printf("'mean': %Lf,", c->result.all.mean); + printf("'median': %lld,", c->result.all.median); + printf("'standard_deviation': %Lf,", c->result.all.standard_deviation); + printf("'dist_20': ["); + for (i = 0; i < NUM_20; i++) { + printf("%d,", c->result.all.dist_20[i]); + } + printf("],"); + printf("'dist_100': ["); + for (i = 0; i < NUM_100; i++) { + printf("%d,", c->result.all.dist_100[i]); + } + printf("],"); + printf("},"); + + printf("90: {"); + printf("'max': %lld,", c->result.mid_90.max); + printf("'min': %lld,", c->result.mid_90.min); + printf("'mean': %Lf,", c->result.mid_90.mean); + printf("'median': %lld,", c->result.mid_90.median); + printf("'standard_deviation': %Lf,", c->result.mid_90.standard_deviation); + printf("'dist_20': ["); + for (i = 0; i < NUM_20; i++) { + printf("%d,", c->result.mid_90.dist_20[i]); + } + printf("],"); + printf("'dist_100': ["); + for (i = 0; i < NUM_100; i++) { + printf("%d,", c->result.mid_90.dist_100[i]); + } + printf("],"); + printf("},"); + + // end of data + printf("},"); + + printf("}"); + + return 0; +} + + +int tst_test(const char *name, tst_perf_func_t setup, tst_perf_func_t do_test, tst_perf_func_t teardown, + void *args, int warmup, int loop, enum value_type type, enum key_item key) { + + struct tst_perf_ctrl *c = tst_alloc_ctrl(name, setup, do_test, teardown, args, warmup, loop, type, key); + if (c == NULL) { + return 1; + } + tst_perf_run(c); + show_result_json(c); + tst_destroy_ctrl(&c); + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// +/* 下面的代码是示例 */ +#if 0 + +#define NR_LOOP_OPEN 100 +#define OPEN_PATH_LEN 128 +struct open_args { + int nr_opened; + char path[NR_LOOP_OPEN][OPEN_PATH_LEN]; + int fds[NR_LOOP_OPEN]; +}; + +int open_setup(void *args) { + int i; + struct rlimit r; + struct open_args *a = (struct open_args *) (args); + + r.rlim_cur = NR_LOOP_OPEN + 1024; + r.rlim_max = r.rlim_cur; + setrlimit(RLIMIT_NOFILE, &r); + memset(a, 0, sizeof(struct open_args)); + + system("rm -rf ./file.ops"); + system("mkdir ./file.ops"); + + for (i = 0; i < NR_LOOP_OPEN; ++i) { + snprintf(a->path[i], OPEN_PATH_LEN, "./file.ops/open.%08d.test", i); + } + return 0; +} + +int open_do_test(void *args) { + int i; + struct open_args *a = (struct open_args *) (args); + for (i = 0; i < NR_LOOP_OPEN; ++i) { + a->fds[i] = open(a->path[i], O_RDWR | O_CREAT | O_EXCL, 0600); + if (a->fds[i] < 0) { + printf("open the %s file fail\n", a->path[i]); + a->nr_opened = i; + return 1; + } + } + a->nr_opened = i; + return 0; +} + +int open_teardown(void *args) { + int i; + struct open_args *a = (struct open_args *) (args); + for (i = 0; i < a->nr_opened; ++i) { + if (a->fds[i] > 0) { + close(a->fds[i]); + a->fds[i] = 0; + } + } + system("rm -rf ./file.ops"); + return 0; +} + +int exec_do_test(void *args) { + pid_t pid = fork(); + pid_t wait; + if (pid == 0) { + execl("./simple.test", "./simple.test", NULL); + } else if (pid > 0) { + wait = waitpid(pid, NULL, 0); + if (wait == pid) { + return 0; + } + printf("waitpid(%d) return %d not as expect\n", pid, wait); + } else { + printf("fork fail\n"); + } + return 1; +} + + +int main(int argc, char **argv) { + struct open_args a; + printf("{"); + printf("'open': "); + tst_test("open.100", open_setup, open_do_test, open_teardown, &a, 100, 2000, LIB, key_mean); + printf(","); + printf("'exec': "); + tst_test("exec", NULL, exec_do_test, NULL, NULL, 100, 5000, LIB, key_mean); + printf(","); + printf("}\n"); + return 0; +} + +#endif \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" new file mode 100644 index 0000000..738eddb --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" @@ -0,0 +1,81 @@ +#ifndef TST_SUITE_COMMON_BENCHMARK_H +#define TST_SUITE_COMMON_BENCHMARK_H + + +#define NS_PER_SEC 1000000000 +#define NUM_20 20 +#define NUM_100 100 + +typedef int (*tst_perf_func_t)(void *); + +enum value_type { + // 越小越好(value_type.LIB) + LIB, + // 越大越好(value_type.HIB) + HIB +}; + +enum key_item { + // 最大值 + key_max, + // 最小值 + key_min, + // 平均值 + key_mean, + // 中位数 + key_median, + // 标准差 + key_standard_deviation +}; + +struct tst_time { + struct timespec ts; +}; + +struct tst_statistics_base { + // 时间单位都是ns + long long max; + long long min; + long double mean; + long long median; + long double standard_deviation; + int dist_20[NUM_20]; + int dist_100[NUM_100]; +}; + +struct tst_statistics_result { + struct tst_statistics_base all; + struct tst_statistics_base mid_90; +}; + +struct tst_perf_ctrl { + // 测试项名称 + const char *name; + // 初始化函数 + tst_perf_func_t perf_setup; + // 性能测试的对象函数 + tst_perf_func_t perf_do_test; + // 清理函数 + tst_perf_func_t perf_teardown; + // 性能测试函数的参数 + void *args; + // 预热循环次数 + int nr_warmup; + // 性能测试循环次数 + int nr_loop; + // 性能数据类型, + int value_type; + // 本性能指标最重要的统计数据项,例如最大值(key_item.max)、平均值(key_item.mean) + int key_item; + + // 性能测试数据 + long long *data; + // 性能数据统计结果 + struct tst_statistics_result result; +}; + +extern int tst_get_time(struct tst_time *t); + +extern long long tst_time_since_now(struct tst_time *t); + +#endif //TST_SUITE_COMMON_BENCHMARK_H diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" new file mode 100644 index 0000000..22f9abb --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" @@ -0,0 +1,304 @@ +#!/usr/bin/env python3 +# coding: utf-8 +import abc +import json +import re +import subprocess +from _ctypes import PyObj_FromPtr +from enum import Enum + + +class ValueType(Enum): + # 越小越好(value_type.LIB) + LIB = 'LIB' + # 越大越好(value_type.HIB) + HIB = 'HIB' + + +class KeyItem(Enum): + # 最大值 + key_max = 'max' + # 最小值 + key_min = 'min' + # 平均值 + key_mean = 'mean' + # 中位数 + key_median = 'median' + # 标准差 + key_standard_deviation = 'standard_deviation' + + +class PerfResult: + def __init__(self, name: str, value_type: ValueType, key_item: KeyItem, unit: str): + self._result = { + "name": f'{name}', + "type": f'{value_type}', + "key": f'{key_item}', + "unit": f'{unit}', + "data": { + "100": { + "max": 0, + "min": 0, + "mean": 0, + "median": 0, + "standard_deviation": 0, + "dist_20": [0] * 20, + "dist_100": [0] * 100 + } + } + } + + @property + def result(self): + return self._result + + +class TSTPerf: + def __init__(self): + self._result = dict() + + @abc.abstractmethod + def run(self): + pass + + def add_result(self, result: PerfResult): + if result.result['name'] in self._result: + raise KeyError(f'the result with name {result.result["name"]} has existed') + self._result[result.result['name']] = result.result + + @property + def results(self): + return self._result + + def report(self): + print(json.dumps(self.results, indent=4, ensure_ascii=False)) + + +class PerfSysBench(TSTPerf): + def __init__(self, name: str, sysbench: str, testname: str, general_opt: str = None, test_opt: str = None): + super(PerfSysBench, self).__init__() + self.name = name + self.sysbench = sysbench + self.prepare = None + self.cleanup = None + self.testname = testname + self.general_opt = general_opt + self.test_opt = test_opt + self.command = f'{sysbench} {self.general_opt if self.general_opt else ""} {testname} ' \ + f'{self.test_opt if self.test_opt else ""} run' + self.outs = None + self.errs = None + + def run(self, timeout=None): + if self.prepare is not None and callable(self.prepare): + self.prepare() + proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + self.outs, self.errs = proc.communicate(timeout=timeout) + if self.cleanup is not None and callable(self.cleanup): + self.cleanup() + print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') + print(self.outs) + if self.errs: + print('errors:') + print(self.errs) + self.parse_add_result() + + def get_cpu_result(self): + result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, + unit='ms') + for line in self.outs.splitlines(): + if 'avg:' in line: + mean = float(line.split(':')[1].strip()) + result.result['data']['100']['mean'] = mean + return result + + def get_fileio_result(self, data_type): + result = PerfResult(name=f'{self.name}-{data_type}', value_type=ValueType.HIB, key_item=KeyItem.key_mean, + unit='MiB/s') + for line in self.outs.splitlines(): + if f'{data_type}:' in line: + mean = float((line.split('IOPS')[1]).split(' ')[1].strip()) + result.result['data']['100']['mean'] = mean + return result + + def get_memory_result(self): + result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, + unit='MiB/s') + for line in self.outs.splitlines(): + if 'MiB/sec' in line: + mean = float((line.split('(')[1]).split('MiB')[0].strip()) + result.result['data']['100']['mean'] = mean + return result + def get_threads_result(self): + result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, + unit='ms') + for line in self.outs.splitlines(): + if 'avg:' in line: + mean = float(line.split(':')[1].strip()) + result.result['data']['100']['mean'] = mean + return result + def get_mutex_result(self): + result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, + unit='ms') + for line in self.outs.splitlines(): + if 'avg:' in line: + mean = float(line.split(':')[1].strip()) + result.result['data']['100']['mean'] = mean + return result + def parse_add_result(self): + if self.outs is None: + raise Exception('test output is None') + if self.testname == 'cpu': + self.add_result(self.get_cpu_result()) + elif self.testname == 'fileio': + if re.match(r'read:\s+IOPS=0.0', self.outs): + self.add_result(self.get_fileio_result('write')) + elif re.match(r'write:\s+IOPS=0.0', self.outs): + self.add_result(self.get_fileio_result('read')) + else: + self.add_result(self.get_fileio_result('read')) + self.add_result(self.get_fileio_result('write')) + elif self.testname == 'memory': + self.add_result(self.get_memory_result()) + elif self.testname == 'threads': + self.add_result(self.get_threads_result()) + elif self.testname == 'mutex': + self.add_result(self.get_mutex_result()) + else: + raise Exception(f'unknown test name {self.testname}') + +class PerfStream(TSTPerf): + def __init__(self, name: str, stream: str, general_opt: str = None): + super(PerfStream, self).__init__() + self.name = name + self.stream = stream + self.general_opt = general_opt + self.prepare = None + self.cleanup = None + self.command = f'{stream} {self.general_opt if self.general_opt else ""}' + self.outs = None + self.errs = None + + def run(self, timeout=None): + if self.prepare is not None and callable(self.prepare): + self.prepare() + proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + self.outs, self.errs = proc.communicate(timeout=timeout) + if self.cleanup is not None and callable(self.cleanup): + self.cleanup() + print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') + print(self.outs) + if self.errs: + print('errors:') + print(self.errs) + self.parse_add_result() + + def get_stream_result(self, data_type): + result = PerfResult(name=f'{self.name}-{data_type}', value_type=ValueType.HIB, key_item=KeyItem.key_mean, + unit='MiB/s') + for line in self.outs.splitlines(): + if f'{data_type}:' in line: + mean = float((line.split(':')[1].strip()).split(' ')[0].strip()) + result.result['data']['100']['mean'] = mean + return result + def parse_add_result(self): + if self.outs is None: + raise Exception('test output is None') + if self.stream is not None: + self.add_result(self.get_stream_result('Copy')) + self.add_result(self.get_stream_result('Scale')) + self.add_result(self.get_stream_result('Add')) + self.add_result(self.get_stream_result('Triad')) + else: + raise Exception(f'unknown test item {self.stream}') + +class PerfHackbench(TSTPerf): + def __init__(self, name: str, hackbench: str, general_opt: str = None): + super(PerfHackbench, self).__init__() + self.name = name + self.hackbench = hackbench + self.general_opt = general_opt + self.prepare = None + self.cleanup = None + self.command = f'{hackbench} {self.general_opt if self.general_opt else ""}' + self.outs = None + self.errs = None + + def run(self, timeout=None): + if self.prepare is not None and callable(self.prepare): + self.prepare() + proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + self.outs, self.errs = proc.communicate(timeout=timeout) + if self.cleanup is not None and callable(self.cleanup): + self.cleanup() + print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') + print(self.outs) + if self.errs: + print('errors:') + print(self.errs) + self.parse_add_result() + + def get_hackbench_result(self): + result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, + unit='s') + for line in self.outs.splitlines(): + if 'Time:' in line: + mean = float(line.split(':')[1].strip()) + result.result['data']['100']['mean'] = mean + return result + def parse_add_result(self): + if self.outs is None: + raise Exception('test output is None') + if self.hackbench is not None: + self.add_result(self.get_hackbench_result()) + else: + raise Exception(f'unknown test item {self.hackbench}') + +class PerfLibMicro(TSTPerf): + def __init__(self, name: str, libmicro: str, general_opt: str = None, test_opt: str = None): + super(PerfLibMicro, self).__init__() + self.name = name + self.libmicro = libmicro + self.prepare = None + self.cleanup = None + self.general_opt = general_opt + self.test_opt = test_opt + self.command = f'{libmicro} {self.general_opt if self.general_opt else ""} ' \ + f'{self.test_opt if self.test_opt else ""}' + self.outs = None + self.errs = None + + def run(self, timeout=None): + if self.prepare is not None and callable(self.prepare): + self.prepare() + proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + self.outs, self.errs = proc.communicate(timeout=timeout) + if self.cleanup is not None and callable(self.cleanup): + self.cleanup() + print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') + print(self.outs) + if self.errs: + print('errors:') + print(self.errs) + self.parse_add_result() + + def get_libmicro_result(self): + result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, + unit='us') + for line in self.outs.splitlines(): + if 'mean' in line: + mean = float((line.split('mean')[1].strip()).split(' ')[0].strip()) + result.result['data']['100']['mean'] = mean + return result + def parse_add_result(self): + if self.outs is None: + raise Exception('test output is None') + if self.libmicro is not None: + self.add_result(self.get_libmicro_result()) + else: + raise Exception(f'unknown test item {self.libmicro} ') + diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" new file mode 100644 index 0000000..9bb4f28 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" @@ -0,0 +1,597 @@ +// Time: 2022-04-18 14:07:49 +// Desc: C用例基础公共函数库 + +#include "common.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct tst_tc_control { + // 用例名 + char tc_name[PATH_MAX]; + // 用例参数 + int tc_argc; + char **tc_argv; + // 用例源文件路径 + char tc_source_path[PATH_MAX]; + // 用例可执行文件路径 + char tc_exec_path[PATH_MAX]; + // 执行用例文件时的目录 + char exec_cwd[PATH_MAX]; + // TST_TC_CWD 测试用例CWD + char tst_tc_cwd[PATH_MAX]; + // 用例开始执行的时间 + struct tst_time time_start; + // TST_TC_PID 测试用例主进程pid + pid_t tst_tc_pid; + // 标记tc_setup是否被调用 + int tc_setup_called; + // 用例执行状态 + int tc_stat; + // TST_TS_TOPDIR 测试套顶层目录 + char tst_ts_topdir[PATH_MAX]; + // TST_COMMON_TOPDIR common顶层目录 + char tst_common_topdir[PATH_MAX]; + // TST_TS_SYSDIR 测试套公共运行目录 + char tst_ts_sysdir[PATH_MAX]; + // TST_TC_SYSDIR 测试用例管理用临时目录 + char tst_tc_sysdir[PATH_MAX]; + // 测试套执行状态标记文件 + char tst_ts_setup_stat[PATH_MAX]; +}; + +struct tst_tc_control *g_tst_tc_control; + +void show_tc_control(void) { + dbg("tc_name: %s", g_tst_tc_control->tc_name); + dbg("tc_source_path: %s", g_tst_tc_control->tc_source_path); + dbg("tc_exec_path: %s", g_tst_tc_control->tc_exec_path); + dbg("exec_cwd: %s", g_tst_tc_control->exec_cwd); + dbg("tst_tc_cwd: %s", g_tst_tc_control->tst_tc_cwd); + dbg("tst_tc_pid: %d", g_tst_tc_control->tst_tc_pid); + dbg("tc_stat: %d", g_tst_tc_control->tc_stat); + dbg("tst_ts_topdir: %s", g_tst_tc_control->tst_ts_topdir); + dbg("tst_ts_sysdir: %s", g_tst_tc_control->tst_ts_sysdir); + dbg("tst_tc_sysdir: %s", g_tst_tc_control->tst_tc_sysdir); + dbg("tst_ts_setup_stat: %s", g_tst_tc_control->tst_ts_setup_stat); +} + +int _print(const char *format, ...) { + va_list ap; + int ret; + char buff[MAX_LOG_LEN] = {0}; + + va_start(ap, format); + ret = vsnprintf(buff, MAX_LOG_LEN - 1, format, ap); + va_end(ap); + + if (buff[ret - 1] != '\n') { + buff[ret] = '\n'; + buff[ret + 1] = '\0'; + } + fprintf(stderr, "%s", buff); + + return ret; +} + +static int _is_main_process(void) { + if (g_tst_tc_control->tst_tc_pid == getpid()) { + return 1; + } + return 0; +} + +static void _set_tcstat(int stat) { + g_tst_tc_control->tc_stat = stat; +} + +static int _get_tcstat(void) { + return g_tst_tc_control->tc_stat; +} + +void _tc_pass(void) { + // 只有初始状态的用例才能置为PASS,其他异常状态的用例不能从异常变为PASS + if (_get_tcstat() == TST_INIT) { + _set_tcstat(TST_PASS); + } +} + +void _tc_fail(void) { + if (_get_tcstat() != TST_FAIL) { + msg("the testcase first fail here"); + } + _set_tcstat(TST_FAIL); +} + +static char *_tcstat_to_str(int tcstat) { + switch (tcstat) { + case TST_PASS: + return "TST_PASS"; + case TST_FAIL: + return "TST_FAIL"; + case TST_INIT: + return "TST_INIT"; + case TST_SKIP: + return "TST_SKIP"; + default: + return "TST_UNKNOWN"; + } +} + +static int _tc_teardown(int argc, char **argv) { + int ret = 0; + + // 只有用例的主进程才能执行此函数 + if (!_is_main_process()) { + return 0; + } + if (tc_teardown) { + if (tc_teardown(argc, argv) == 0) { + msg("call tc_teardown success"); + } else { + err("call tc_teardown fail"); + ret = 1; + } + } else { + msg("tc_teardown not define"); + } + + return ret; +} + +static int _tc_teardown_common(int argc, char **argv) { + int ret = 0; + + // 只有用例的主进程才能执行此函数 + if (!_is_main_process()) { + return 0; + } + if (tc_teardown_common) { + if (tc_teardown_common(argc, argv) == 0) { + msg("call tc_teardown_common success"); + } else { + err("call tc_teardown_common fail"); + ret = 1; + } + } else { + msg("tc_teardown_common not define"); + } + + return ret; +} + +static void _tc_run_complete(int argc, char **argv) { + int ret = 0; + + // 只有用例的主进程才能执行此函数 + if (!_is_main_process()) { + return; + } + // tc_setup有调用时tc_teardown才会被调用 + if (g_tst_tc_control->tc_setup_called) { + if (_tc_teardown(argc, argv) == 0) { + msg("call _tc_teardown success"); + } else { + msg("call _tc_teardown fail"); + ret = 1; + } + } else { + msg("the tc_setup not called, so tc_teardown ignore"); + } + if (_tc_teardown_common(argc, argv) == 0) { + msg("call _tc_teardown_common success"); + } else { + msg("call _tc_teardown_common fail"); + ret = 1; + } + + // TCase自动化执行框架需要用这个输出判断用例是否支持完 + msg("Global test environment tear-down"); + switch (_get_tcstat()) { + case TST_PASS: + msg("RESULT : %s ==> [ PASSED ]", g_tst_tc_control->tc_name); + break; + case TST_FAIL: + msg("RESULT : %s ==> [ FAILED ]", g_tst_tc_control->tc_name); + ret = 1; + break; + case TST_INIT: + msg("RESULT : %s ==> [ NOTEST ]", g_tst_tc_control->tc_name); + ret = 1; + break; + case TST_SKIP: + msg("RESULT : %s ==> [ SKIP ]", g_tst_tc_control->tc_name); + ret = 0; + break; + default: + msg("RESULT : %s ==> [ UNKNOWN ]", g_tst_tc_control->tc_name); + ret = 1; + break; + } + msg("cost %.9Lf", (long double) tst_time_since_now(&(g_tst_tc_control->time_start)) / NS_PER_SEC); + + exit(ret); +} + +void _tst_assert(const char *expr, const char *file, int line, const char *func) { + msg("%s:%d %s assert '%s' fail", file, line, func, expr); + _tc_run_complete(g_tst_tc_control->tc_argc, g_tst_tc_control->tc_argv); +} + +void _skip_test(const char *message, const char *file, int line, const char *func) { + int tc_stat = _get_tcstat(); + + if ((tc_stat == TST_PASS) || (tc_stat == TST_INIT) || (tc_stat == TST_SKIP)) { + _set_tcstat(TST_SKIP); + msg("%s:%d %s: set testcase SKIP: %s", file, line, func, message); + } else { + msg("%s:%d %s: set testcase SKIP fail: %s", file, line, func, message); + err("the testcase stat is %s, can't set to SKIP", _tcstat_to_str(tc_stat)); + } + _tc_run_complete(g_tst_tc_control->tc_argc, g_tst_tc_control->tc_argv); +} + +static int _tc_setup_common(int argc, char **argv) { + int ret = 0; + + if (tc_setup_common) { + if (tc_setup_common(argc, argv) == 0) { + msg("call tc_setup_common success"); + } else { + err("call tc_setup_common fail"); + ret = 1; + } + } else { + msg("tc_setup_common not define"); + } + + return ret; +} + +static int _tc_setup(int argc, char **argv) { + int ret = 0; + + // 只有用例的主进程才能执行此函数 + if (!_is_main_process()) { + return 0; + } + g_tst_tc_control->tc_setup_called = 1; + if (tc_setup) { + if (tc_setup(argc, argv) == 0) { + msg("call tc_setup success"); + } else { + err("call tc_setup fail"); + ret = 1; + } + } else { + msg("tc_setup not define"); + } + + return ret; +} + +static int _do_test(int argc, char **argv) { + int ret = 0; + + // 只有用例的主进程才能执行此函数 + if (!_is_main_process()) { + return 0; + } + if (do_test) { + if (do_test(argc, argv) == 0) { + msg("call do_test success"); + } else { + err("call do_test fail"); + ret = 1; + } + } else { + err("do_test not define"); + ret = 1; + } + + return ret; +} + +static int _is_ts_setup_called(void) { + if (is_file(g_tst_tc_control->tst_ts_setup_stat)) { + return 1; + } + return 0; +} + +static int _get_ts_setup_stat(void) { + char buff[PAGE_SIZE]; + int read_size = read_line(g_tst_tc_control->tst_ts_setup_stat, 1, buff, PAGE_SIZE); + if (read_size <= 0) { + return TST_INIT; + } + return (int) strtol(buff, NULL, 0); +} + +// 功能:判断路径是否为文件并且存在 +// 参数: +// path -- 文件路径 +// 返回值: +// 0 -- 文件不存在 +// 1 -- 文件存在 +int is_file(const char *path) { + struct stat sb; + + if (stat(path, &sb) != 0) { + return 0; + } + if (S_ISDIR(sb.st_mode)) { + return 0; + } + return 1; +} + +// 功能:判断路径是否为目录并且存在 +// 参数: +// path -- 文件路径 +// 返回值: +// 0 -- 文件不存在 +// 1 -- 文件存在 +int is_dir(const char *path) { + struct stat sb; + + if (stat(path, &sb) != 0) { + return 0; + } + if (S_ISDIR(sb.st_mode)) { + return 1; + } + return 0; +} + +// 功能:判断路径是否存在 +// 参数: +// path -- 文件路径 +// 返回值: +// 0 -- 文件不存在 +// 1 -- 文件存在 +int is_exist(const char *path) { + if (access(path, F_OK) == 0) { + return 1; + } else { + return 0; + } +} + +// 功能:读文件内容到buff中 +// 参数: +// path -- 文件路径 +// buff -- 接收文件内容 +// size -- buff大小 +// 返回值: +// -1 -- 文件读取失败 +// 其他 -- 读取到的文件内容长度 +size_t read_file(const char *path, char *buff, size_t size) { + int fd = open(path, O_RDONLY); + if (fd < 0) { + return -1; + } + int ret = read(fd, buff, size) < 0; + if (ret < 0) { + close(fd); + return -1; + } + close(fd); + return ret; +} + +// 功能:读文本文件指定行的内容到buff中 +// 参数: +// path -- 文件路径 +// line -- 要读取内容的行号(从1开始) +// buff -- 接收文件内容 +// size -- buff大小 +// 返回值: +// -1 -- 文件读取失败 +// 其他 -- 读取到的文件内容长度 +size_t read_line(const char *path, int line, char *buff, size_t size) { + int i = 0; + FILE *file = NULL; + if (line <= 0) { + dbg("the line less then 0: %d", line); + return -1; + } + file = fopen(path, "r"); + if (file == NULL) { + dbg("open file %s fail, errno %d, error: %s", path, errno, strerror(errno)); + return -1; + } + while (i < line) { + i++; + if (fgets(buff, size, file) == NULL) { + if (i == line) { + // 刚好读到指定行的时候文件结束 + break; + } + // 文件读完了,但是行号还没有读到 + dbg("get line %d fail, buff: %s, errno %d, error: %s", i, buff, errno, strerror(errno)); + fclose(file); + return -1; + } + } + fclose(file); + return strlen(buff); +} + +// 功能:创建多层目录 +// 参数: +// dir -- 目录 +// mode -- 目录权限 +// 返回值: +// -1 -- 创建失败 +// 0 -- 创建成功 +int mkdirs(const char *dir, mode_t mode) { + int i; + char now_path[PATH_MAX]; + + for (i = 0; i < min(strlen(dir), PATH_MAX - 1); i++) { + if (dir[i] != '/') { + continue; + } + strncpy(now_path, dir, i + 1); + if (is_exist(now_path)) { + if (is_dir(now_path)) { + continue; + } else { + dbg("the path %s exist but not dir", now_path); + return -1; + } + } + if (mkdir(now_path, mode) != 0) { + dbg("mkdir %s fail, errno %d, error: %s", now_path, errno, strerror(errno)); + return -1; + } + } + if (mkdir(dir, mode) != 0) { + dbg("mkdir %s fail, errno %d, error: %s", dir, errno, strerror(errno)); + return -1; + } + if (!is_dir(dir)) { + dbg("mkdirs %s fail", dir); + return -1; + } + return 0; +} + +// 功能:执行命令 +// 参数: +// command_format -- 命令内容 +// 返回值:同system函数 +int command(const char *command_format, ...) { + va_list ap; + char cmd[MAX_CMD_LEN] = {0}; + + va_start(ap, command_format); + (void) vsnprintf(cmd, MAX_CMD_LEN, command_format, ap); + va_end(ap); + + return system(cmd); +} + +static int _tc_init(int argc, char **argv) { + size_t control_size = ((sizeof(struct tst_tc_control) / PAGE_SIZE) + 1) * PAGE_SIZE; + g_tst_tc_control = (struct tst_tc_control *) mmap(NULL, control_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (g_tst_tc_control == NULL) { + msg("mmap g_tst_tc_control fail, errno: %d, %s", errno, strerror(errno)); + return 1; + } + memset(g_tst_tc_control, 0, control_size); + if (tst_get_time(&(g_tst_tc_control->time_start)) != 0) { + msg("tst_get_time fail, errno: %d, %s", errno, strerror(errno)); + return 1; + } + strncpy(g_tst_tc_control->tc_name, basename(argv[0]), PATH_MAX); + g_tst_tc_control->tc_argc = argc; + g_tst_tc_control->tc_argv = argv; + + if (realpath(argv[0], g_tst_tc_control->tc_exec_path) == NULL) { + msg("get the realpath fail, errno: %d, %s", errno, strerror(errno)); + return 1; + } + + strncpy(g_tst_tc_control->tc_source_path, g_tst_tc_control->tc_exec_path, PATH_MAX); + strncat(g_tst_tc_control->tc_source_path, ".c", PATH_MAX); + + if (getcwd(g_tst_tc_control->exec_cwd, PATH_MAX) == NULL) { + msg("get cwd fail, errno: %d, %s", errno, strerror(errno)); + return 1; + } + + strncpy(g_tst_tc_control->tst_tc_cwd, g_tst_tc_control->tc_exec_path, PATH_MAX); + dirname(g_tst_tc_control->tst_tc_cwd); + + g_tst_tc_control->tst_tc_pid = getpid(); + g_tst_tc_control->tc_stat = TST_INIT; + + // 尝试获取TST_TS_TOPDIR + strncpy(g_tst_tc_control->tst_ts_topdir, g_tst_tc_control->tc_exec_path, PATH_MAX); + char path_tst_common[PATH_MAX]; + char path_cmd[PATH_MAX]; + char path_testcase[PATH_MAX]; + char path_tsuite[PATH_MAX]; + while (g_tst_tc_control->tst_ts_topdir[1] != '\0') { + snprintf(path_tst_common, PATH_MAX, "%s/tst_common", g_tst_tc_control->tst_ts_topdir); + snprintf(path_cmd, PATH_MAX, "%s/cmd", g_tst_tc_control->tst_ts_topdir); + snprintf(path_testcase, PATH_MAX, "%s/testcase", g_tst_tc_control->tst_ts_topdir); + snprintf(path_tsuite, PATH_MAX, "%s/tsuite", g_tst_tc_control->tst_ts_topdir); + if (is_dir(path_cmd) && is_dir(path_testcase) && is_file(path_tsuite)) { + if (is_dir(path_tst_common)) { + strncpy(g_tst_tc_control->tst_common_topdir, path_tst_common, PATH_MAX); + } else { + strncpy(g_tst_tc_control->tst_common_topdir, g_tst_tc_control->tst_ts_topdir, PATH_MAX); + } + break; + } + if (g_tst_tc_control->tst_ts_topdir[1] == '\0') { + memset(g_tst_tc_control->tst_ts_topdir, 0, PATH_MAX); + memset(g_tst_tc_control->tst_common_topdir, 0, PATH_MAX); + break; + } + dirname(g_tst_tc_control->tst_ts_topdir); + } + // TST_TS_TOPDIR成功获取后,TST_TS_SYSDIR和TST_TC_SYSDIR可以生成了 + if (g_tst_tc_control->tst_ts_topdir[0] != '\0') { + snprintf(g_tst_tc_control->tst_ts_sysdir, PATH_MAX, "%s/logs/.ts.sysdir", g_tst_tc_control->tst_ts_topdir); + snprintf(g_tst_tc_control->tst_tc_sysdir, PATH_MAX, "%s/logs/testcase/.tc.%d.sysdir", + g_tst_tc_control->tst_ts_topdir, g_tst_tc_control->tst_tc_pid); + snprintf(g_tst_tc_control->tst_ts_setup_stat, PATH_MAX, "%s/ts.setup.stat", g_tst_tc_control->tst_ts_sysdir); + } + + return 0; +} + +int tst_main(int argc, char **argv) { + int ret = 0; + + if (_tc_init(argc, argv) != 0) { + return 1; + } + if (chdir(g_tst_tc_control->tst_tc_cwd) != 0) { + msg("chdir to %s fail, errno: %d, %s", g_tst_tc_control->tst_tc_cwd, errno, strerror(errno)); + return 1; + } + + if (_is_ts_setup_called()) { + msg("tsuite setup executed, stat is %d", _get_ts_setup_stat()); + } else { + msg("tsuite setup may not executed"); + } + + _set_tcstat(TST_INIT); + + if (_tc_setup_common(argc, argv) == 0) { + if (_tc_setup(argc, argv) == 0) { + msg("call _tc_setup success"); + if (_do_test(argc, argv) == 0) { + msg("call _do_test success"); + } else { + err("call _do_test fail"); + ret = 1; + } + } else { + err("call _tc_setup success"); + ret = 1; + } + } else { + err("call _tc_setup_common success"); + ret = 1; + } + + _tc_run_complete(argc, argv); + + return ret; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" new file mode 100644 index 0000000..c9d6264 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" @@ -0,0 +1,139 @@ +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "benchmark.h" + +#define TST_PASS 0 +#define TST_FAIL 1 +#define TST_INIT 2 +#define TST_SKIP 3 + +#ifndef MAX_LOG_LEN +#define MAX_LOG_LEN 4096 +#endif /* MAX_LOG_LEN */ +#ifndef MAX_CMD_LEN +#define MAX_CMD_LEN 4096 +#endif /* MAX_CMD_LEN */ + +#ifndef PAGE_SHIFT +#define PAGE_SHIFT 12 +#endif /* PAGE_SHIFT */ +#ifndef PAGE_SIZE +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#endif /* PAGE_SIZE */ +#ifndef PAGE_MASK +#define PAGE_MASK (~(PAGE_SIZE-1)) +#endif /* PAGE_MASK */ + +#define KB (1024) +#define MB (KB * KB) +#define GB (MB * KB) + +extern int _print(const char *format, ...); + +#define min(a, b) ((a) > (b) ? (b) : (a)) +#define max(a, b) ((a) < (b) ? (b) : (a)) + +#define dbg(format, ...) _print(format, ##__VA_ARGS__) +#define msg(format, ...) _print(format, ##__VA_ARGS__) +#define err(format, ...) \ + do{ \ + _tc_fail(); \ + _print("%s:%d %s: " format, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \ + }while(0) + +extern void _skip_test(const char *message, const char *file, int line, const char *func); + +#define skip_test(message) _skip_test(message, __FILE__, __LINE__, __FUNCTION__) + +#define skip_if_true(expr) \ + do{ \ + if(expr){ \ + skip_test("skip_if_true " #expr); \ + } \ + }while(0) + +#define skip_if_false(expr) \ + do{ \ + if(!(expr)){ \ + skip_test("skip_if_false " #expr); \ + } \ + }while(0) + +extern void _tc_pass(void); + +extern void _tc_fail(void); + +extern void _tst_assert(const char *expr, const char *file, int line, const char *func); + +// 功能:断言表达式返回真 +// 参数: +// expr -- 表达式 +// 返回值:无 +#define assert_true(expr) \ + do{ \ + if(expr){ \ + _tc_pass(); \ + }else{ \ + _tc_fail(); \ + _tst_assert(#expr, __FILE__, __LINE__, __FUNCTION__); \ + } \ + }while(0) + +// 功能:断言表达式返回假 +// 参数: +// expr -- 表达式 +// 返回值:无 +#define assert_false(expr) \ + do{ \ + if(!(expr)){ \ + _tc_pass(); \ + }else{ \ + _tc_fail(); \ + _tst_assert(#expr, __FILE__, __LINE__, __FUNCTION__); \ + } \ + }while(0) + + +extern void show_tc_control(void); + +extern int is_file(const char *path); + +extern int is_dir(const char *path); + +extern int is_exist(const char *path); + +extern size_t read_line(const char *path, int line, char *buff, size_t size); + +extern size_t read_file(const char *path, char *buff, size_t size); + +extern int mkdirs(const char *dir, mode_t mode); + +extern int command(const char *command_format, ...); + +extern int tc_setup_common(int argc, char **argv) __attribute__((weak)); + +extern int tc_setup(int argc, char **argv) __attribute__((weak)); + +extern int do_test(int argc, char **argv) __attribute__((weak)); + +extern int tc_teardown(int argc, char **argv) __attribute__((weak)); + +extern int tc_teardown_common(int argc, char **argv) __attribute__((weak)); + +#endif // __COMMON_H__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" new file mode 100644 index 0000000..d9a1b97 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" @@ -0,0 +1,755 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# Time: 2022-04-19 22:26:42 +# Desc: Python用例公共模块 + +import abc +import getpass +import os +import platform +import re +import shutil +import socket +import subprocess +import sys +import tempfile +import time +import traceback +import __main__ as main + +TST_PASS = 0 +TST_FAIL = 1 +TST_INIT = 2 +TST_SKIP = 3 +tst_tc_stat_dict = { + TST_PASS: 'TST_PASS', + TST_FAIL: 'TST_FAIL', + TST_INIT: 'TST_INIT', + TST_SKIP: 'TST_SKIP', +} + + +def command(cmd, timeout=20): + proc = subprocess.Popen(cmd, shell=True, encoding='utf-8') + try: + proc.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + proc.kill() + return proc.wait() + + +def command_output(cmd, timeout=20): + proc = subprocess.Popen(cmd, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE) + outs = "" + errs = "" + try: + outs, errs = proc.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + proc.kill() + code = proc.wait() + return outs, errs, code + + +def command_quiet(cmd, timeout=20): + proc = subprocess.Popen(cmd, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + proc.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + proc.kill() + code = proc.wait() + return code + + +def get_yum_provide(filename): + outs, errs, code = command_output(f'yum provides {filename}') + print(f'stdout:\n{outs}') + print(f'stderr:\n{errs}') + print(f'status: {code}') + if code != 0 or outs is None: + return None + for line in outs.splitlines(): + match = re.match(r'^([-\w.]+)-\d(\.\d+)+-.* : ', line) + if match: + package = match.groups()[0] + print(f'get file {filename} provide: {package}') + return package + return None + + +def try_install_command(cmd, package=None): + if command_quiet(f'which {cmd}') == 0: + return True + if package is None: + package = get_yum_provide(cmd) + if package is not None: + command(f'yum install -y {package}') + if command(f'which {cmd}') == 0: + return True + return False + + +def get_kernel_release(): + return platform.release() + + +def get_system_boot_time(): + with open('/proc/uptime', 'r') as f: + uptime = float(f.readline().split()[0]) + now_time = time.time() + boot_time = now_time - uptime + result = boot_time + + tsuite_tmpdir = os.path.join('/tmp', f'.tsuite-{getpass.getuser()}') + if not os.path.exists(tsuite_tmpdir): + os.makedirs(tsuite_tmpdir, mode=0o755, exist_ok=True) + boot_time_file = os.path.join(tsuite_tmpdir, 'boot-time') + if os.path.exists(boot_time_file): + # 如果系统启动的时间已经有记录,那么看看是否同一次启动 + with open(boot_time_file, 'r') as f: + old_boot_time = float(f.readline()) + # 如果记录的时间和当前计算的时间差别不大,那么就认为是同一次启动 + if abs(old_boot_time - boot_time) <= 10: + result = old_boot_time + else: + with open(boot_time_file, 'w') as f: + f.write(f'{boot_time}') + else: + with open(boot_time_file, 'w') as f: + f.write(f'{boot_time}') + return 'boot-time.' + time.strftime('%Y%m%d-%H%M%S', time.localtime(result)) + + +def get_os_release(): + release = None + if os.path.isfile('/etc/os-release'): + with open('/etc/os-release', 'r') as f: + for line in f.readlines(): + if re.match(r'PRETTY_NAME=', line, re.IGNORECASE): + release = re.sub(r'[^\w.]+', '-', line.split('=')[1].strip()) + if os.path.isfile('/etc/tencentos-release'): + with open('/etc/tencentos-release', 'r') as f: + for line in f.readlines(): + if re.match(r'TencentOS', line, re.IGNORECASE): + release = re.sub(r'[^\w.]+', '-', line.strip()) + if os.path.isfile('/etc/motd'): + with open('/etc/motd', 'r') as f: + for line in f.readlines(): + if re.match(r'version', line, re.IGNORECASE): + release = re.sub(r'[^\w.]+', '-', line.strip()) + if re.match(r'tlinux', line, re.IGNORECASE): + release = re.sub(r'[^\w.]+', '-', line.strip()) + if release is None: + return 'Unknown-Linux' + return release.strip('-') + + +def get_tst_test_env_ip(): + outs, _, _ = command_output('ifconfig eth1') + eth1_ip = get_ip_of_ifconfig(outs) + # 测试环境的eth1都是192.168.x.x + if (eth1_ip is None) or (not eth1_ip.startswith('192.168.')): + return None + env_main_ip_1 = re.sub(r'\.\d{1,3}$', '.11', eth1_ip) + # 获取测试环境主环境的IP + outs, _, _ = command_output(f'ssh root@{env_main_ip_1} ifconfig eth0', timeout=3) + env_main_ip_0 = get_ip_of_ifconfig(outs) + if env_main_ip_0 is None: + return None + return [env_main_ip_0, eth1_ip] + + +def get_ip_of_ifconfig(ifconfig_outs: str): + if ifconfig_outs is None: + return None + if not isinstance(ifconfig_outs, str): + return None + for line in ifconfig_outs.splitlines(): + if 'netmask' not in line: + continue + return re.search(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', line).group() + return None + + +def get_host_ip(): + """ + 这个方法是目前见过最优雅获取本机服务器的IP方法了。没有任何的依赖,也没有去猜测机器上的网络设备信息。 + 而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的IP。 + 这个方法并不会真实的向外部发包,所以用抓包工具是看不到的。但是会申请一个 UDP 的端口,所以如果经常调用也会比较耗时的, + 这里如果需要可以将查询到的IP给缓存起来,性能可以获得很大提升。 + + 作者:钟翦 + 链接:https://www.zhihu.com/question/49036683/answer/1243217025 + 来源:知乎 + 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + + :return: + """ + _local_ip = None + s = None + try: + if not _local_ip: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(('8.8.8.8', 80)) + _local_ip = s.getsockname()[0] + return _local_ip + finally: + if s: + s.close() + + +def command_to_filename(cmd: str): + return re.sub(r'\W+', '.', cmd) + '.txt' + + +def get_commands_logs(cmd_list, logs_dir, timeout=60): + start_time = time.time() + exec_list = list() + index = 1 + for cmd in cmd_list: + # print(f'{index} execute command: {cmd}') + cmd_dict = { + 'index': index, + 'command': cmd, + 'timeout': timeout, + 'start_time': time.time(), + 'proc': subprocess.Popen(cmd, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE), + 'log_file': os.path.join(os.path.realpath(logs_dir), command_to_filename(cmd)), + 'end_time': None, + 'cost': None, + 'stdout': None, + 'stderr': None, + 'status': None + } + exec_list.append(cmd_dict) + index += 1 + + # 检查命令是否执行完 + while True: + all_command_ok = True + if time.time() - start_time > timeout: + break + for proc_dict in exec_list: + if proc_dict['status'] is not None: + continue + try: + proc_dict['stdout'], proc_dict['stderr'] = proc_dict['proc'].communicate(timeout=1) + except subprocess.TimeoutExpired: + all_command_ok = False + continue + proc_dict['status'] = proc_dict['proc'].returncode + proc_dict['end_time'] = time.time() + proc_dict['cost'] = proc_dict['end_time'] - proc_dict['start_time'] + # print(f'{proc_dict["index"]} command {proc_dict["command"]} end, status {proc_dict["status"]}') + if all_command_ok: + break + + # 记录命令执行结果,还没有结束的命令直接终止 + for proc_dict in exec_list: + if proc_dict['status'] is None: + proc_dict['proc'].kill() + proc_dict['stdout'], proc_dict['stderr'] = proc_dict['proc'].communicate(timeout=1) + proc_dict['status'] = proc_dict['proc'].returncode + proc_dict['end_time'] = time.time() + proc_dict['cost'] = proc_dict['end_time'] - proc_dict['start_time'] + print(f'{proc_dict["index"]} command {proc_dict["command"]} killed, status {proc_dict["status"]}') + with open(file=proc_dict['log_file'], mode='a', buffering=1, encoding='utf-8') as f: + f.write('=' * 60 + '\n') + f.write(f'### command: {proc_dict["command"]}\n') + f.write(f'### timeout: {proc_dict["timeout"]}\n') + f.write(f'### start_time: ' + f'{time.strftime("%Y-%m-%d %H:%M:%S %z", time.localtime(proc_dict["start_time"]))}\n') + f.write(f'### end_time: ' + f'{time.strftime("%Y-%m-%d %H:%M:%S %z", time.localtime(proc_dict["end_time"]))}\n') + f.write(f'### cost: {proc_dict["cost"]}\n') + f.write(f'### log_file: {proc_dict["log_file"]}\n') + f.write(f'### status: {proc_dict["status"]}\n') + f.write('=' * 60 + '\n') + f.write('### stdout:\n') + f.write(proc_dict["stdout"]) + f.write('=' * 60 + '\n') + f.write('### stderr:\n') + f.write(proc_dict["stderr"]) + f.write('=' * 60 + '\n') + print(f'### all command cost {time.time() - start_time}') + + +def sysinfo(log_dir, install_command=False, merge_files=True): + command_list = [ + "uname -a", + "ulimit -a", + "lscpu", + "lspci", + "lspci -k", + "lspci -vv", + "lspci -t -vv -nn", + "lsscsi", + "lsscsi --list --verbose --long", + "lsusb", + "lsusb --tree", + "lshw -short", + "lsmod", + "route -n", + "ifconfig -a", + "dmidecode", + "udevadm info --export-db", + "ipmitool sdr", + "ipmitool fru", + "ipmitool sensor", + "ipmitool sel", + "fdisk -l", + "mount", + "df -P", + "lsblk", + "lsblk -O", + "smartctl --scan" + "free", + "numastat -v", + "numastat -v -m", + "cpupower --cpu all frequency-info", + "cpupower --cpu all idle-info", + "sysctl -a", + "cat /etc/os-release", + "cat /etc/system-release", + "cat /etc/centos-release", + "cat /etc/redhat-release", + "cat /etc/system-release", + "cat /etc/tencentos-release", + "cat /etc/tlinux-release", + "cat /proc/cpuinfo", + "cat /proc/meminfo", + "cat /proc/buddyinfo", + "cat /proc/devices", + "cat /proc/interrupts", + "cat /proc/iomem", + "cat /proc/ioports", + "cat /proc/modules", + "cat /proc/module_md5_list", + "zcat /proc/config.gz", + "zcat /proc/bt_stat", + "zcat /proc/cgroups", + "zcat /proc/cmdline", + "zcat /proc/consoles", + "zcat /proc/crypto", + "zcat /proc/devices", + "zcat /proc/diskstats", + "zcat /proc/dma", + "zcat /proc/execdomains", + "zcat /proc/filesystems", + "zcat /proc/kallsyms", + "zcat /proc/loadavg", + "zcat /proc/loadavg_bt", + "zcat /proc/locks", + "zcat /proc/mdstat", + "zcat /proc/misc", + "zcat /proc/mtrr", + "zcat /proc/partitions", + "zcat /proc/sched_debug", + "zcat /proc/schedstat", + "zcat /proc/slabinfo", + "zcat /proc/softirqs", + "zcat /proc/stat", + "zcat /proc/swaps", + "zcat /proc/timer_list", + "zcat /proc/uptime", + "zcat /proc/version", + "zcat /proc/vmallocinfo", + "zcat /proc/vmstat", + "zcat /proc/zoneinfo", + "dmesg" + ] + if os.path.isfile('/proc/net/dev'): + with open(file='/proc/net/dev', mode='r') as f: + for line in f.readlines(): + if ':' not in line: + continue + dev = line.split(':')[0].strip() + command_list.append(f'ethtool {dev}') + command_list.append(f'ethtool -i {dev}') + if os.path.isfile('/proc/modules'): + with open(file='/proc/modules', mode='r') as f: + for line in f.readlines(): + module = line.split()[0].strip() + command_list.append(f'modinfo {module}') + outs, _, _ = command_output('smartctl --scan') + if outs: + for line in outs.splitlines(): + dev = line.split()[0].strip() + command_list.append(f'smartctl --xall {dev}') + command_list.append(f'hdparm {dev}') + + # 尝试安装命令 + if install_command: + for cmd in set([c.split()[0] for c in command_list]): + try_install_command(cmd) + + if not os.path.exists(log_dir): + os.makedirs(log_dir, mode=0o755, exist_ok=True) + get_commands_logs(command_list, log_dir) + # 将多个日志文本文件合并成一个文件 + if merge_files: + tmp_file = tempfile.mkstemp()[1] + with open(tmp_file, 'w') as f: + for txt_file in os.listdir(log_dir): + txt_path = os.path.join(log_dir, txt_file) + with open(txt_path, 'r') as tf: + f.write(tf.read()) + os.remove(txt_path) + shutil.move(tmp_file, os.path.join(log_dir, 'sysinfo.txt')) + + +def get_crash_path(): + result = None + if not os.path.exists('/etc/kdump.conf'): + return result + with open('/etc/kdump.conf', 'r') as f: + for line in f.readlines(): + if line.startswith('path '): + result = line.split()[1] + return result + + +def safe_repr(obj, short=False): + max_len = 120 + try: + result = repr(obj) + except Exception: + result = object.__repr__(obj) + if not short or len(result) < max_len: + return result + return result[:max_len] + ' [truncated]...' + + +def set_env(env, value): + if os.environ.get(env): + print(f"the env {env} has value {os.environ.get(env)}, don't set to {value}") + return + os.environ[env] = f"{value}" + + +def set_env_force(env, value): + if os.environ.get(env): + print(f"the env {env} has value {os.environ.get(env)}, now set to {value}") + os.environ[env] = value + + +def get_env(env): + return os.environ.get(env) + + +def get_env_default(env, default): + return os.environ.get(env, default) + + +def _is_main_process(): + return int(get_env_default('TST_TC_PID', '0')) == os.getpid() + + +class ExceptionSkip(Exception): + def __init__(self, message=""): + super(ExceptionSkip, self).__init__(self) + self.message = f'{message}' + + def __str__(self): + return self.message + + +def tcstat_to_str(tcstat): + tst_tc_stat_dict.get(tcstat, 'UNKNOWN') + + +class TestCase: + def __init__(self, *args): + # 用例文件路径 + self.tc_path = os.path.realpath(main.__file__) + # 用例名 + self.tc_name = self._get_tc_attr('用例名称') + # 执行用例文件时的目录 + self.exec_cwd = os.getcwd() + # TST_TC_CWD 测试用例CWD + self.tst_tc_cwd = os.path.dirname(self.tc_path) + set_env('TST_TC_CWD', self.tst_tc_cwd) + # TST_TC_PID 测试用例主进程pid + self.tst_tc_pid = os.getpid() + set_env('TST_TC_PID', self.tst_tc_pid) + # 用例执行状态 + self._tcstat = TST_INIT + # 用例退出码,0表示用例PASS或SKIP,其他表示异常 + self._exit_code = 0 + # TST_TS_TOPDIR 测试套顶层目录 + self.tst_ts_topdir = self._get_ts_topdir() + set_env('TST_TS_TOPDIR', self.tst_ts_topdir) + # TST_COMMON_TOPDIR common顶层目录 + self.tst_common_topdir = self._get_common_topdir() + set_env('TST_COMMON_TOPDIR', self.tst_common_topdir) + # 标记tc_setup是否被调用 + self._tc_setup_called = False + # TST_TS_SYSDIR 测试套公共运行目录 + self.tst_ts_sysdir = None if self.tst_ts_topdir is None \ + else os.path.join(self.tst_ts_topdir, 'logs', '.ts.sysdir') + set_env('TST_TS_SYSDIR', self.tst_ts_sysdir) + # TST_TC_SYSDIR 测试用例管理用临时目录 + self.tst_tc_sysdir = None if self.tst_ts_topdir is None \ + else os.path.join(self.tst_ts_topdir, 'logs', 'testcase', f'.tc.{self.tst_tc_pid}.sysdir') + set_env('TST_TC_SYSDIR', self.tst_tc_sysdir) + + def dbg(self, message): + print(message, file=sys.stderr) + + def msg(self, message): + print(message, file=sys.stderr) + + def err(self, message): + print(message, file=sys.stderr) + self._fail(message) + + def _get_tc_attr(self, attr): + with open(file=self.tc_path, mode='r', encoding='utf-8') as f: + for line in f.readlines(): + if f"@{attr}:" not in line: + continue + return re.sub(f'.*@{attr}:', '', line).strip() + return None + + def _get_ts_topdir(self): + result = self.tst_tc_cwd + while True: + if os.path.isdir(os.path.join(result, 'cmd')) and os.path.isdir(os.path.join(result, 'testcase')) and \ + os.path.isfile(os.path.join(result, 'tsuite')): + if os.path.isdir(os.path.join(result, '..', 'tst_common')): + return os.path.dirname(result) + return result + next_path = os.path.dirname(result) + if next_path == result: + return None + result = next_path + + def _get_common_topdir(self): + if self.tst_ts_topdir is None: + return None + if os.path.isdir(os.path.join(self.tst_ts_topdir, 'tst_common')): + return os.path.join(self.tst_ts_topdir, 'tst_common') + return self.tst_ts_topdir + + def _set_tcstat(self, stat): + self._tcstat = stat + + def _get_tcstat(self): + return self._tcstat + + def _get_tcstat_str(self): + return tcstat_to_str(self._tcstat) + + def _fail(self, message=None): + if self._tcstat != TST_FAIL: + self.msg("the testcase first fail here") + self._set_tcstat(TST_FAIL) + raise AssertionError(message) + + def _pass(self): + if self._get_tcstat() == TST_INIT: + self._set_tcstat(TST_PASS) + + def skip_test(self, message=None): + """ + 标记用例为SKIP状态(当用例不需要测试时) + :param message: 要输出的信息 + :return: None + 示例: + skip_test(message='内核CONFIG_XXX未开,系统不支持此测试') + """ + if self._get_tcstat() in (TST_PASS, TST_INIT, TST_SKIP): + self._set_tcstat(TST_SKIP) + raise ExceptionSkip(f'set testcase SKIP: {message}') + else: + self.msg(f'set testcase SKIP fail: {message}') + self._fail(f'the testcase stat is {self._get_tcstat_str()}, can\'t set to SKIP') + + def skip_if_true(self, expr, message=None): + """ + 当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 + :param expr: 要判断的表达式 + :param message: 要输出的信息 + :return: None + 示例: + skip_if_true(1 == 2) + """ + if expr: + self.skip_test(f'skip_if_true -> {safe_repr(expr)}: {message}') + + def skip_if_false(self, expr, message=None): + """ + 当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 + :param expr: 要判断的表达式 + :param message: 要输出的信息 + :return: None + 示例: + skip_if_false(1 == 2) + """ + if not expr: + self.skip_test(f'skip_if_false -> {safe_repr(expr)}: {message}') + + def assert_true(self, expr, message=None): + """ + 断言表达式返回真 + :param expr: 要断言的表达式 + :param message: 断言要输出的信息 + :return: None + 示例: + assert_true(1 == 2) + assert_true(a >= b) + """ + if not expr: + self.msg(f"{safe_repr(expr)} is not true: {message}") + self._fail(message) + else: + self._pass() + + def assert_false(self, expr, message=None): + """ + 断言表达式返回假 + :param expr: 要断言的表达式 + :param message: 断言要输出的信息 + :return: None + 示例: + assert_false(1 == 2) + assert_false(a >= b) + """ + if expr: + self.msg(f"{safe_repr(expr)} is not false: {message}") + self._fail(message) + else: + self._pass() + + def _tc_setup_common(self, *args): + # 只有用例的主进程才能执行此函数 + if not _is_main_process(): + return None + try: + self.tc_setup_common(*args) + except Exception: + raise + + def tc_setup_common(self, *args): + self.msg("this is TestCase.tc_setup_common") + + def _tc_setup(self, *args): + # 只有用例的主进程才能执行此函数 + if not _is_main_process(): + return None + try: + self._tc_setup_called = True + self.tc_setup(*args) + except Exception: + raise + + def tc_setup(self, *args): + self.msg("this is TestCase.tc_setup") + + def _do_test(self, *args): + # 只有用例的主进程才能执行此函数 + if not _is_main_process(): + return None + try: + self.do_test(*args) + except Exception: + raise + + @abc.abstractmethod + def do_test(self, *args): + self.msg("this is TestCase.do_test") + + def _tc_teardown(self, *args): + # 只有用例的主进程才能执行此函数 + if not _is_main_process(): + return None + try: + self.tc_teardown(*args) + except Exception: + raise + + def tc_teardown(self, *args): + self.msg("this is TestCase.tc_teardown") + + def _tc_teardown_common(self, *args): + # 只有用例的主进程才能执行此函数 + if not _is_main_process(): + return None + try: + self.tc_teardown_common(*args) + except Exception: + raise + + def tc_teardown_common(self, *args): + self.msg("this is TestCase.tc_teardown_common") + + def _is_ts_setup_called(self): + if self.tst_ts_sysdir: + return os.path.isfile(os.path.join(self.tst_ts_sysdir, 'ts.setup.stat')) + else: + return False + + def _get_ts_setup_stat(self): + if self.tst_ts_sysdir: + ts_stat_file = os.path.join(self.tst_ts_sysdir, 'ts.setup.stat') + if not os.path.isfile(ts_stat_file): + return None + with open(file=ts_stat_file, mode='r', encoding='utf-8') as f: + line = f.readline() + return int(line) + else: + return None + + def tst_main(self, *args): + time_start = int(time.monotonic() * 1000000000) + if self._is_ts_setup_called(): + self.msg(f"tsuite setup executed, stat is {self._get_ts_setup_stat()}") + else: + self.msg("tsuite setup may not executed") + + try: + self._tc_setup_common(*args) + self.msg("call _tc_setup_common success") + self._tc_setup(*args) + self.msg("call _tc_setup success") + self._do_test(*args) + self.msg("call _do_test success") + except ExceptionSkip as e: + self._set_tcstat(TST_SKIP) + self.msg(e.message) + except Exception: + self._set_tcstat(TST_FAIL) + self.msg(traceback.format_exc()) + finally: + try: + if self._tc_setup_called: + self._tc_teardown(*args) + else: + self.msg("the tc_setup not called, so tc_teardown ignore") + self._tc_teardown_common(*args) + except ExceptionSkip as e: + self._set_tcstat(TST_SKIP) + self.msg(e.message) + except Exception: + self._set_tcstat(TST_FAIL) + self.msg(traceback.format_exc()) + + # TCase自动化执行框架需要用这个输出判断用例是否支持完 + self.msg("Global test environment tear-down") + if self._get_tcstat() == TST_PASS: + self.msg(f"RESULT : {self.tc_name} ==> [ PASSED ]") + self._exit_code = 0 + elif self._get_tcstat() == TST_FAIL: + self.msg(f"RESULT : {self.tc_name} ==> [ FAILED ]") + self._exit_code = 1 + elif self._get_tcstat() == TST_INIT: + self.msg(f"RESULT : {self.tc_name} ==> [ NOTEST ]") + self._exit_code = 1 + elif self._get_tcstat() == TST_SKIP: + self.msg(f"RESULT : {self.tc_name} ==> [ SKIP ]") + self._exit_code = 0 + else: + self.msg(f"RESULT : {self.tc_name} ==> [ UNKNOWN ]") + self._exit_code = 1 + time_end = int(time.monotonic() * 1000000000) + self.msg(f'cost {(time_end - time_start) / 1000000000:.9f}') + exit(self._exit_code) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" new file mode 100644 index 0000000..325a76e --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" @@ -0,0 +1,735 @@ +#!/bin/bash +# 所有shell脚本的测试用例都应该source此文件 +# 约定: +# 1、以下划线"_"开头的函数和变量用例不能直接调用 +# 2、环境变量全大写,全局变量加上"g_"前置,局部变量统一加"local"修饰 + +export LANG="en_US.UTF-8" +export LANGUAGE="en_US:en" +export LC_ALL=en_US.UTF-8 + +if [ -d "$TST_TS_TOPDIR/tst_common" ]; then + export TST_COMMON_TOPDIR="$TST_TS_TOPDIR/tst_common" + # 先source测试用例自定义的公共文件 + source "$TST_TS_TOPDIR/tst_lib/ts_common.sh" || exit 1 + # 再source全局公共文件 + source "$TST_COMMON_TOPDIR/lib/common_func.sh" || exit 1 +elif [ -d "$TST_TS_TOPDIR/lib" ]; then + export TST_COMMON_TOPDIR="$TST_TS_TOPDIR" + # 只是tst_suite_common使用 + source "$TST_TS_TOPDIR/lib/common_func.sh" || exit 1 +else + echo "can't find the tsuite common file" + exit 1 +fi + +# 环境变量 +# TST_TS_TOPDIR 测试套顶层目录 +# TST_TS_SYSDIR 测试套公共运行目录 +[ -z "$TST_TS_SYSDIR" ] && export TST_TS_SYSDIR="$TST_TS_TOPDIR/logs/.ts.sysdir" +# TST_TC_SYSDIR 测试用例管理用临时目录 +# TST_TC_CWD 测试用例CWD +# TST_TC_PID 测试用例主进程pid +# 下面几个为用例结果状态 +export TST_PASS=0 +export TST_FAIL=1 +export TST_INIT=2 +export TST_SKIP=3 +# TST_TC_NAME 用例名称 +# TST_TC_FILE 用例文件 +# TST_VM_SUBNET 虚拟机子网 +if [ -z "$TST_VM_SUBNET" ]; then + TST_VM_SUBNET=$(ifconfig eth0 2>/dev/null | grep "netmask .* broadcast 192\.168\." | awk '{print $2}') + [ -z "$TST_VM_SUBNET" ] && TST_VM_SUBNET=$(ifconfig eth1 2>/dev/null | grep "netmask .* broadcast 192\.168\." | awk '{print $2}') + [ -z "$TST_VM_SUBNET" ] && TST_VM_SUBNET=$(ifconfig eth2 2>/dev/null | grep "netmask .* broadcast 192\.168\." | awk '{print $2}') + TST_VM_SUBNET=${TST_VM_SUBNET%.*} +fi +export TST_VM_SUBNET + +g_tst_case_start=$(get_up_time_ms) +g_tst_trap_signal=12 + +_tcstat_to_str() { + case "$1" in + "TST_PASS" | "$TST_PASS") + echo "TST_PASS" + ;; + "TST_FAIL" | "$TST_FAIL") + echo "TST_FAIL" + ;; + "TST_INIT" | "$TST_INIT") + echo "TST_INIT" + ;; + "TST_SKIP" | "$TST_SKIP") + echo "TST_SKIP" + ;; + *) + echo "TST_UNKNOWN" + ;; + esac +} + +# 获取用例属性 +# $1 -- 用例属性名称,例如:用例ID、用例名称 +_get_case_attr() { + grep "@${1}:" "$TST_TC_FILE_FULL" | head -n 1 | sed "s|.*@${1}:\s*||g" | sed "s|\s*$||g" +} +_get_case_preconditions() { + grep "@预置条件:" "$TST_TC_FILE_FULL" +} +_get_case_steps() { + grep "@测试步骤:" "$TST_TC_FILE_FULL" +} +_get_case_expect() { + grep "@预期结果:" "$TST_TC_FILE_FULL" +} + +# 功能:设置环境变量 +# 参数: +# $1 -- 环境变量名 +# $2 -- 环境变量值 +# 返回值: +# 0 -- 环境变量设置成功 +# 1 -- 环境变量设置失败 +setup_env_var() { + local _tst_var_name="$1" + local _tst_old_value + eval _tst_old_value=\"\$"${1}"\" + local _tst_new_value="$2" + + if ! echo "$_tst_var_name" | grep "^[A-Z_]\+$" >/dev/null; then + msg "the var name must be upper and '_'" + return 1 + fi + [ -n "$_tst_old_value" ] && msg "the environment variable $_tst_var_name has old value: $_tst_old_value" + eval export "$_tst_var_name"=\""$_tst_new_value"\" + echo "export $_tst_var_name=\"$_tst_new_value\"" >>"$TST_TS_SYSDIR/environment_variable" + return 0 +} + +# 功能:将K/M/G/T等单位互相转换 +# 参数:wait_proc_exit -p pid [-t timeout] [-s signal] +# -p pid 【必选参数】进程pid +# -t timeout 【可选参数】等待超时时间(单位:秒,不指定时默认等待60秒),如果等待超时进程仍未退出则返回失败 +# -s signal 【可选参数】必须配合-t参数使用,超时时间到期后发送-s指定信号到进程 +# 返回值: +# 0 -- 进程退出 +# 1 -- 等待失败 +wait_proc_exit() { + local _tst_all_args="$*" + local _tst_pid + local _tst_timeout + local _tst_signal + while [ $# -gt 0 ]; do + case "$1" in + "-p") + shift + _tst_pid="$1" + shift + ;; + "-t") + shift + _tst_timeout="$1" + shift + ;; + "-s") + shift + _tst_signal="$1" + shift + ;; + *) + msg "unknown args $1 in $_tst_all_args" + return 1 + ;; + esac + done + if [ -z "$_tst_pid" ]; then + msg "pid not set" + return 1 + fi + [ -z "$_tst_timeout" ] && _tst_timeout=60 + + local _tst_time_start + _tst_time_start="$(get_uptime)" + local _tst_time_now + _tst_time_now="$(get_uptime)" + while [ $((_tst_time_start + _tst_timeout)) -gt "$_tst_time_now" ]; do + [ -d "/proc/$_tst_pid" ] || return 0 + sleep 1 + _tst_time_now="$(get_uptime)" + done + [ -n "$_tst_signal" ] && kill -s "$_tst_signal" "$_tst_pid" + sleep 1 + [ -d "/proc/$_tst_pid" ] || return 0 + return 1 +} + +# 功能:获取系统启动后到现在的时间,单位:秒 +# 参数:无 +# 返回值:标准输出时间 +get_uptime() { + awk -F . '{print $1}' /proc/uptime +} + +# 功能:将K/M/G/T等单位互相转换 +# 参数:conv_unit [-i k|m|g|t] [-o k|m|g|t] value[_with_unit] +# -i k|m|g|t 【可选参数】输入数据的单位,可选参数,若不指定单位,则默认为1,或者输入的值后面带参数 +# -o k|m|g|t 【可选参数】输出数据的单位,若不指定单位,则默认为1 +# value[_with_unit] 【必选参数】需要转换的数据值,可以跟单位(只取单位第一个字母用于判断k|m|g|t) +# 返回值:标准输出转换后的结果 +# 0 -- 转换成功 +# 1 -- 转换失败 +conv_unit() { + local _tst_input_all + local _tst_input_value + local _tst_input_unit + local _tst_output_value + local _tst_output_unit + while [ $# -gt 0 ]; do + case "$1" in + "-i") + shift + _tst_input_unit="$1" + shift + ;; + "-o") + shift + _tst_output_unit="$1" + shift + ;; + *) + _tst_input_all="$_tst_input_all $1" + shift + ;; + esac + done + # shellcheck disable=SC2001 + _tst_input_value=$(echo "$_tst_input_all" | sed "s|^[[:blank:]]*\([0-9]\+\)[[:blank:]]*\(.*\)|\1|g") + # shellcheck disable=SC2001 + [ -z "$_tst_input_unit" ] && _tst_input_unit=$(echo "$_tst_input_all" | sed "s|^[[:blank:]]*\([0-9]\+\)[[:blank:]]*\(.*\)|\2|g" | head -c 1) + [ -z "$_tst_input_unit" ] && _tst_input_unit="b" + [ -z "$_tst_output_unit" ] && _tst_output_unit="b" + if [ -z "$_tst_input_value" ]; then + msg "no input value" + return 1 + fi + case "$_tst_input_unit" in + b | B) ;; + k | K) + _tst_input_value=$((_tst_input_value * 1024)) + ;; + m | M) + _tst_input_value=$((_tst_input_value * 1024 * 1024)) + ;; + g | G) + _tst_input_value=$((_tst_input_value * 1024 * 1024 * 1024)) + ;; + t | T) + _tst_input_value=$((_tst_input_value * 1024 * 1024 * 1024 * 1024)) + ;; + *) + msg "unknown input unit $_tst_input_unit" + return 1 + ;; + esac + case "$_tst_output_unit" in + b | B) + _tst_output_value=$_tst_input_value + ;; + k | K) + _tst_output_value=$((_tst_input_value / 1024)) + ;; + m | M) + _tst_output_value=$((_tst_input_value / 1024 / 1024)) + ;; + g | G) + _tst_output_value=$((_tst_input_value / 1024 / 1024 / 1024)) + ;; + t | T) + _tst_output_value=$((_tst_input_value / 1024 / 1024 / 1024 / 1024)) + ;; + *) + msg "unknown output unit $_tst_output_unit" + return 1 + ;; + esac + echo $_tst_output_value + return 0 +} + +# 功能:ssh到环境子网中指定机器上 +# 参数: +# $1 -- 需要登录的机器IP编号 +# $* -- 要远程执行的命令及参数 +# 返回值:同ssh +env_ssh() { + local _tst_ip="${TST_VM_SUBNET}.$1" + shift + msg "try ssh to $_tst_ip execute: $*" + timeout -s SIGTERM 60 ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@"$_tst_ip" "$@" +} + +# 功能:scp本机的文件到到环境子网中指定机器的指定路径 +# 参数: +# $1 -- scp目标机器IP编号 +# $2 -- 远程机器的目标文件夹 +# $* -- 需要从本机拷贝到远端机器的文件,可以拷贝多个文件 +# 返回值:同scp +env_scpt() { + local _tst_ip="${TST_VM_SUBNET}.$1" + shift + local _tst_target="$1" + shift + msg "try scp $* to ${_tst_ip}:$_tst_target" + timeout -s SIGTERM 120 scp -rvq -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$@" root@"$_tst_ip":"$_tst_target" +} + +# 功能:scp指定机器的文件到本机路径 +# 参数: +# $1 -- scp目标机器IP编号 +# $2 -- 本机目标文件夹 +# $* -- 需要从远端机器拷贝到本机的文件,可以拷贝多个文件 +# 返回值:同scp +env_scpf() { + local _tst_ret=0 + local _tst_ip="${TST_VM_SUBNET}.$1" + shift + local _tst_target="$1" + shift + while [ -n "$1" ]; do + msg "try scp ${_tst_ip}:$1 to local $_tst_target" + timeout -s SIGTERM 120 scp -rvq -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@"$_tst_ip":"$1" "$_tst_target" || _tst_ret=1 + shift + done + return $_tst_ret +} + +# 功能:等待指定机器就绪,默认超时时间60秒 +# 参数: +# $1 -- 目标机器IP编号 +# $2 -- 【可选】等待的超时时间,默认等待60秒 +# 返回值: +# 0 -- 机器在超时前就绪 +# 1 -- 机器启动异常 +env_wait() { + local _tst_start_time + _tst_start_time=$(get_uptime) + local _tst_end_time + _tst_end_time=$(get_uptime) + local _tst_timeout + if [ -z "$2" ]; then + _tst_timeout=60 + else + _tst_timeout=$2 + fi + + local _tst_ip="${TST_VM_SUBNET}.$1" + msg "wait env $_tst_ip standby" + while [ $((_tst_start_time + _tst_timeout)) -ge "$_tst_end_time" ]; do + echo -n "." + sleep 3 + _tst_end_time=$(get_uptime) + ping -w 1 -W 1 -c 1 "$_tst_ip" >/dev/null 2>&1 || continue + if env_ssh "$1" test -d /proc; then + msg "the env with IP $_tst_ip ssh success, wait total $((_tst_end_time - _tst_start_time)) seconds" + return 0 + else + continue + fi + done + _tst_end_time=$(get_uptime) + msg "wait the env $_tst_ip timeout, wait total $((_tst_end_time - _tst_start_time)) seconds" + return 1 +} + +_assert_trap_exit() { + kill -s "$g_tst_trap_signal" "$TST_TC_PID" +} + +# 功能:标记用例为SKIP状态(当用例不需要测试时) +# 参数: +# $* -- 对SKIP状态标记的描述 +# 返回值:无 +skip_test() { + local _tst_tc_stat + _tst_tc_stat="$(_get_tcstat)" + + case "$_tst_tc_stat" in + "$TST_PASS" | "$TST_INIT" | "$TST_SKIP") + _set_tcstat "$TST_SKIP" + msg "set testcase SKIP: $*" + _assert_trap_exit + ;; + *) + msg "set testcase SKIP fail: $*" + err "the testcase stat is $(_tcstat_to_str "$_tst_tc_stat"), can't set to SKIP" + ;; + esac +} + +# 功能:当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 +# 参数: +# $* -- 需要断言的表达式 +# 返回值:无 +skip_if_true() { + local _tst_ret + "$@" + _tst_ret=$? + if [ $_tst_ret -eq 0 ]; then + skip_test "skip_if_true get (_tst_ret:$_tst_ret) ->" "$@" + fi +} + +# 功能:当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 +# 参数: +# $* -- 需要断言的表达式 +# 返回值:无 +skip_if_false() { + local _tst_ret + "$@" + _tst_ret=$? + if [ $_tst_ret -ne 0 ]; then + skip_test "skip_if_false get (_tst_ret:$_tst_ret) ->" "$@" + fi +} + +# 功能:断言表达式返回真或命令执行成功,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 +# 参数: +# $* -- 需要断言的表达式 +# 返回值:无 +assert_true_cont() { + local _tst_ret + "$@" + _tst_ret=$? + if [ $_tst_ret -eq 0 ]; then + _tc_pass + return 0 + else + err "assert_true, but return ${_tst_ret}: $*" + return 1 + fi +} +assert_true() { + assert_true_cont "$@" || _assert_trap_exit +} + +# 功能:断言表达式返回假或命令执行失败,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 +# 参数: +# $* -- 需要断言的表达式 +# 返回值:无 +assert_false_cont() { + local _tst_ret + "$@" + _tst_ret=$? + if [ $_tst_ret -ne 0 ]; then + _tc_pass + return 0 + else + err "assert_false, but return ${_tst_ret}: $*" + return 1 + fi +} +assert_false_skip() { + assert_false_cont "$@" || _skip "expect false but true ->" "$@" +} +assert_false() { + assert_false_cont "$@" || _assert_trap_exit +} + +_set_tcstat() { + echo "$1" >"$TST_TC_SYSDIR/tcstat" +} + +_get_tcstat() { + cat "$TST_TC_SYSDIR/tcstat" 2>/dev/null +} + +_tc_pass() { + # 只有初始状态的用例才能置为PASS,其他异常状态的用例不能从异常变为PASS + if [ "$(cat "$TST_TC_SYSDIR/tcstat" 2>/dev/null)" == "$TST_INIT" ]; then + _set_tcstat $TST_PASS + fi +} + +_tc_fail() { + if [ "$(_get_tcstat)" != "$TST_FAIL" ]; then + echo "the testcase first fail here" + fi + _set_tcstat $TST_FAIL +} + +_tc_setup_common() { + local _tst_ret=0 + + # 只有用例的主进程才能执行此函数 + [ "$TST_TC_PID" != "$$" ] && return 0 + + # 对用例执行环境进行初始化设置 + mkdir -p "${TST_TC_SYSDIR}/core" + ulimit -c >"$TST_TC_SYSDIR/old.ulimit.c" + ulimit -c unlimited + cat /proc/sys/kernel/core_pattern >"$TST_TC_SYSDIR/old.proc.core_pattern" + is_root && echo "${TST_TC_SYSDIR}/core/core-e%e-p%p-i%i-s%s-g%g-u%u-t%t.dump" >/proc/sys/kernel/core_pattern + + if is_function tc_setup_common; then + msg "try call tc_setup_common" + if tc_setup_common "$@"; then + msg "call tc_setup_common success" + else + err "call tc_setup_common fail" + _tst_ret=1 + fi + else + msg "tc_setup_common not define" + fi + + return $_tst_ret +} + +_tc_setup() { + local _tst_ret=0 + + # 只有用例的主进程才能执行此函数 + [ "$TST_TC_PID" != "$$" ] && return 0 + touch "$TST_TC_SYSDIR/tc_setup_called" + if is_function tc_setup; then + msg "try call tc_setup" + if tc_setup "$@"; then + msg "call tc_setup success" + else + err "call tc_setup fail" + _tst_ret=1 + fi + else + msg "tc_setup not define" + fi + + return $_tst_ret +} + +_do_test() { + local _tst_ret=0 + + # 只有用例的主进程才能执行此函数 + [ "$TST_TC_PID" != "$$" ] && return 0 + if is_function do_test; then + msg "try call do_test" + if do_test "$@"; then + msg "call do_test success" + else + err "call do_test fail" + _tst_ret=1 + fi + else + err "do_test not define" + _tst_ret=1 + fi + + return $_tst_ret +} + +_tc_teardown() { + local _tst_ret=0 + + # 只有用例的主进程才能执行此函数 + [ "$TST_TC_PID" != "$$" ] && return 0 + if is_function tc_teardown; then + msg "try call tc_teardown" + if tc_teardown "$@"; then + msg "call tc_teardown success" + else + err "call tc_teardown fail" + _tst_ret=1 + fi + else + msg "tc_teardown not define" + fi + + return $_tst_ret +} + +_tc_teardown_common() { + local _tst_ret=0 + + # 只有用例的主进程才能执行此函数 + [ "$TST_TC_PID" != "$$" ] && return 0 + if is_function tc_teardown_common; then + msg "try call tc_teardown_common" + if tc_teardown_common "$@"; then + msg "call tc_teardown_common success" + else + err "call tc_teardown_common fail" + _tst_ret=1 + fi + else + msg "tc_teardown_common not define" + fi + + # 恢复用例执行前做的初始化设置 + ulimit -c "$(cat "$TST_TC_SYSDIR/old.ulimit.c")" + is_root && cat "$TST_TC_SYSDIR/old.proc.core_pattern" >/proc/sys/kernel/core_pattern + + return $_tst_ret +} + +_tc_trap_call() { + _tc_run_complete || exit 1 + exit 0 +} + +_tc_run_complete() { + local _tst_ret=0 + + # 只有用例的主进程才能执行此函数 + [ "$TST_TC_PID" != "$$" ] && return 0 + if [ -e "$TST_TC_SYSDIR/tc_setup_called" ]; then + if _tc_teardown "$@"; then + msg "call _tc_teardown success" + else + err "call _tc_teardown fail" + _tst_ret=1 + fi + else + msg "the tc_setup not called, so tc_teardown ignore" + fi + if _tc_teardown_common "$@"; then + msg "call _tc_teardown_common success" + else + err "call _tc_teardown_common fail" + _tst_ret=1 + fi + + # TCase自动化执行框架需要用这个输出判断用例是否执行完 + echo "Global test environment tear-down" + # 用例失败则收集系统日志上传到TCase用于定位 + case "$(_get_tcstat)" in + "$TST_PASS") + msg "RESULT : $TST_TC_NAME ==> [ PASSED ]" + rm -rf "$TST_TC_SYSDIR" + echo "case-result: PASS" >>"$TST_RESULT_FILE" + ;; + "$TST_FAIL") + msg "RESULT : $TST_TC_NAME ==> [ FAILED ]" + _tst_ret=1 + echo "case-result: FAIL" >>"$TST_RESULT_FILE" + ;; + "$TST_INIT") + msg "RESULT : $TST_TC_NAME ==> [ NOTEST ]" + _tst_ret=1 + echo "case-result: ABORT" >>"$TST_RESULT_FILE" + ;; + "$TST_SKIP") + msg "RESULT : $TST_TC_NAME ==> [ SKIP ]" + rm -rf "$TST_TC_SYSDIR" + _tst_ret=0 + echo "case-result: SKIP" >>"$TST_RESULT_FILE" + ;; + *) + msg "RESULT : $TST_TC_NAME ==> [ UNKNOWN ]" + _tst_ret=1 + echo "case-result: ABORT" >>"$TST_RESULT_FILE" + ;; + esac + local _tst_case_end + _tst_case_end=$(get_up_time_ms) + msg "cost $(diff_time_ms2sec "$g_tst_case_start" "$_tst_case_end")" + + { + echo "case-end-time: $(get_timestamp_ms)" + echo "" + } >>"$TST_RESULT_FILE" + + return $_tst_ret +} + +_set_ts_setup_stat() { + echo "$1" >"$TST_TS_SYSDIR/ts.setup.stat" +} + +_get_ts_setup_stat() { + cat "$TST_TS_SYSDIR/ts.setup.stat" 2>/dev/null +} + +_is_ts_setup_called() { + test -f "$TST_TS_SYSDIR/ts.setup.stat" +} + +_clean_ts_setup_stat() { + rm -rf "$TST_TS_SYSDIR/ts.setup.stat" +} + +tst_main() { + local _tst_ret=0 + + if [ -z "$TST_TS_TOPDIR" ]; then + msg "the TST_TS_TOPDIR not set" + return 1 + fi + if [ ! -d "$TST_TS_TOPDIR" ]; then + msg "the TST_TS_TOPDIR=$TST_TS_TOPDIR not dir" + return 1 + fi + + [ -f "$TST_TS_SYSDIR/environment_variable" ] && source "$TST_TS_SYSDIR/environment_variable" + export TST_TC_PID=$$ + TST_TC_CWD="$(realpath "$(dirname "$0")")" + export TST_TC_CWD + TST_TC_FILE_FULL="$(realpath "$0")" + export TST_TC_FILE_FULL + # shellcheck disable=SC2001 + TST_TC_FILE="$(echo "$TST_TC_FILE_FULL" | sed "s|^${TST_TS_TOPDIR}/*||g")" + export TST_TC_FILE + TST_TC_NAME="$(_get_case_attr "用例名称")" + export TST_TC_NAME + export TST_TC_SYSDIR="$TST_TS_TOPDIR/logs/testcase/.tc.${TST_TC_PID}.sysdir" + + # 用于断言,有的断言会终止测试活动 + trap _tc_trap_call "$g_tst_trap_signal" + + # 生成结果记录文件 + _get_tst_result_file + + { + echo "TESTCASE" + echo "case-name: $TST_TC_NAME" + echo "case-id: $(_get_case_attr "用例ID")" + echo "case-type: case-type" + echo "case-level: $(_get_case_attr "用例级别")" + echo "case-label: $(_get_case_attr "用例标签")" + echo "case-steps: $(_get_case_steps)" + echo "case-result-id: ${TST_TC_NAME}-result-${TST_RESULT_ID}" + echo "case-start-time: $(get_timestamp_ms)" + } >>"$TST_RESULT_FILE" + + if _is_ts_setup_called; then + msg "tsuite setup executed, stat is $(_get_ts_setup_stat)" + else + msg "tsuite setup may not executed" + fi + + cd "$TST_TC_CWD" || return 1 + mkdir -p "$TST_TC_SYSDIR" + _set_tcstat $TST_INIT + + if _tc_setup_common "$@"; then + if _tc_setup "$@"; then + msg "call _tc_setup success" + if _do_test "$@"; then + msg "call _do_test success" + else + err "call _do_test fail" + _tst_ret=1 + fi + else + err "call _tc_setup fail" + _tst_ret=1 + fi + else + err "call _tc_setup_common fail" + _tst_ret=1 + fi + + _tc_run_complete "$@" || _tst_ret=1 + + return $_tst_ret +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" new file mode 100644 index 0000000..9217202 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" @@ -0,0 +1,88 @@ +#!/bin/bash +# 所有shell脚本的测试用例都应该source此文件 +# 约定: +# 1、以下划线"_"开头的函数和变量用例不能直接调用 +# 2、环境变量全大写,全局变量加上"g_"前置,局部变量统一加"local"修饰 + +# Func: 输出调试级别用例日志 +dbg() { + echo "$@" 1>&2 +} + +# Func: 输出普通级别用例日志 +msg() { + echo "$@" 1>&2 +} + +# Func: 输出错误级别用例日志,如果是用例上下文,则标记用例为失败状态 +err() { + echo "$@" 1>&2 + # 只有用例上下文才设置用例状态 + is_function _tc_fail && _tc_fail +} + +is_function() { + type "$1" 2>&1 | head -n 1 | grep "$1 is a function" >/dev/null 2>&1 + return $? +} + +is_root() { + [ "$(id -u)" == "0" ] && return 0 + return 1 +} + +get_up_time_sec() { + awk -F . '{print $1}' /proc/uptime +} + +get_up_time_ms() { + local _tst_uptime + _tst_uptime=$(awk '{print $1}' /proc/uptime | tr -d '.') + echo -n "${_tst_uptime}0" +} + +# 获取时间戳 +get_timestamp_sec() { + date +%s +} +get_timestamp_ms() { + date +%s%N | sed "s|......$||g" +} + +# 输出时间差,并将ms转换为sec +# $1 -- start time: ms +# $2 -- end time: ms +diff_time_ms2sec() { + local _tst_diff_time=$(($2 - $1)) + local _tst_time_sec=$((_tst_diff_time / 1000)) + local _tst_time_ms=$((_tst_diff_time % 1000)) + printf "%d.%03d" $_tst_time_sec $_tst_time_ms +} + +# 获取测试套名 +get_suite_name() { + basename "$TST_TS_TOPDIR" +} + +# 获取测试结果文件 +_get_tst_result_file() { + if [ -z "$TST_RESULT_FILE" ]; then + local test_index=0 + while [ $test_index -lt 10000 ]; do + test_index=$((test_index + 1)) + [ -f "$TST_TS_TOPDIR/logs/${test_index}.result" ] && continue + break + done + export TST_RESULT_ID="$test_index" + TST_RESULT_FILE="$TST_TS_TOPDIR/logs/${test_index}.result" + export TST_RESULT_FILE + { + echo "TESTSUITE" + echo "suite-name: $(get_suite_name)" + echo "suite-start-time: $(get_timestamp_ms)" + echo "suite-end-time:" + echo "" + } >>"$TST_RESULT_FILE" + fi + echo "$TST_RESULT_FILE" +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" new file mode 100644 index 0000000..7a2ca85 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" @@ -0,0 +1,12 @@ +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#include "common.h" + +extern int tst_main(int argc, char **argv); + +int main(int argc, char **argv) { + return tst_main(argc, argv); +} + +#endif // __MAIN_H__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" new file mode 100644 index 0000000..09e3972 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# Time: 2022-08-24 12:22:09 +# Desc: 系统调度 + +import os, time +from multiprocessing import Process, cpu_count + + +def exec_cpu(cpu: int, rate: float, interval: int, timeout: int) -> None: + t_start = time.time() + while time.time() - t_start < timeout: + if ((time.time() - t_start) / interval) % 1 < rate: + pass + else: + time.sleep((1 - rate) * interval) + print(f'cpu {cpu} execute terminated') + + +def set_cpu_rate_of_system(rate: float, interval: int = 1, timeout: int = 10) -> None: + """ + 设置系统CPU使用率到指定值 + :param rate: 系统CPU使用率百分比, [0, cpu_num] + :param interval: 设置使用率的采样间隔时间 + :param timeout: 设置使用率的时间 + :return: None + """ + cpu_num = cpu_count() + if (rate < 0 or rate > cpu_num): + print(f'Input usage rate is {rate}, which must be a float value between 0 and {cpu_num}!') + return + if (interval <= 0): + print(f'Input interval is {interval}, which must be a positive number!') + return + if (timeout <= 0): + print(f'Input timeout is {timeout}, which must be a positive number!') + return + + ps_list = [] + cpu_rate = rate / cpu_num + for i in range(0, cpu_num): + ps_list.append(Process(target = exec_cpu, args = (i, cpu_rate, interval, timeout))) + for p in ps_list: + p.start() + for p in ps_list: + p.join() + print("all cpus execute over") + + +def exec_on_specific_cpu(cpu: int, rate: float, interval: int, timeout: int) -> None: + pid = os.getpid() + os.sched_setaffinity(pid, {cpu}) + t_start = time.time() + while time.time() - t_start < timeout: + if ((time.time() - t_start) / interval) % 1 < rate: + pass + else: + time.sleep((1 - rate) * interval) + print(f'cpu {cpu} execute terminated') + + +def set_cpu_rate_of_cpu(cpu_index: int, rate: float, interval: int = 1, timeout : int = 10) -> Process: + """ + 设置某个CPU的使用率到指定值 + :param cpu_index: cpu编号 + :param rate: CPU使用率百分比, [0, 1] + :param interval: 设置使用率的采样间隔时间 + :param timeout: 设置使用率的时间 + :return: None + """ + if (rate < 0 or rate > 1): + print(f'Input usage rate is {rate}, which must be a float value between 0 and 1!') + return + if (interval <= 0): + print(f'Input interval is {interval}, which must be a positive number!') + return + if (timeout <= 0): + print(f'Input timeout is {timeout}, which must be a positive number!') + return + pid = os.getpid() + eligible_cpu_set = os.sched_getaffinity(pid) + if (cpu_index not in eligible_cpu_set): + print(f'Input cpu index is {cpu_index}, which is not valid! ' + + f'The eligible cpu set is {eligible_cpu_set}') + return + + print(f'Set cpu usage of cpu{cpu_index} to {rate}') + + p = Process(target = exec_on_specific_cpu, args = (cpu_index, rate, interval, timeout)) + p.start() + return p + + +def set_cpu_rate_of_task(rate: float, interval: int = 1, timeout : int = 10) -> None: + """ + 设置进程的使用率到指定值 + :param rate: 进程CPU使用率百分比, [0, 1] + :param interval: 设置使用率的采样间隔时间 + :param timeout: 设置使用率的时间 + :return: None + """ + if (rate < 0 or rate > 1): + print(f'Input usage rate is {rate}, which must be a float value between 0 and 1!') + return + if (interval <= 0): + print(f'Input interval is {interval}, which must be a positive number!') + return + if (timeout <= 0): + print(f'Input timeout is {timeout}, which must be a positive number!') + return + + pid = os.getpid() + print(f'set cpu usage of pid {pid} to {rate}') + t_start = time.time() + + while time.time() - t_start < timeout: + if ((time.time() - t_start) / interval) % 1 < rate: + pass + else: + time.sleep((1 - rate) * interval) + +if __name__ == '__main__': + # set_cpu_rate_of_system(4, 1, 60) + p = set_cpu_rate_of_cpu(1, 0.3, 1, 30) + print('joining') + p.join() + print('cpu test finished') + # set_cpu_rate_of_task(1.5, 1, 20) + diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" new file mode 100755 index 0000000..17bd646 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" @@ -0,0 +1,55 @@ +#!/bin/bash +# Time: 2022-04-19 22:44:25 +# Desc: 测试套公共ts_setup + +if [ -d "$TST_TS_TOPDIR/tst_common" ]; then + # 先source测试用例自定义的公共文件 + source "$TST_TS_TOPDIR/tst_lib/ts_common.sh" || exit 1 + # 再source全局公共文件 + source "$TST_TS_TOPDIR/tst_common/lib/common.sh" || exit 1 +elif [ -d "$TST_TS_TOPDIR/lib" ]; then + # 只是tst_suite_common使用 + source "$TST_TS_TOPDIR/lib/common.sh" || exit 1 +else + echo "can't find the tsuite common file" + exit 1 +fi + +_ts_setup() { + if _is_ts_setup_called; then + if [ "$(_get_ts_setup_stat)" == "$TST_PASS" ]; then + echo "the ts_setup executed passed yet" + return 0 + else + echo "the ts_setup executed yet, but fail" + return 1 + fi + fi + + local _tst_ret=0 + + if [ -f "$TST_TS_TOPDIR/tst_lib/ts_setup" ]; then + if [ -x "$TST_TS_TOPDIR/tst_lib/ts_setup" ]; then + msg "try execute $TST_TS_TOPDIR/tst_lib/ts_setup" + if "$TST_TS_TOPDIR/tst_lib/ts_setup"; then + msg "execute ts_setup success" + _set_ts_setup_stat "$TST_PASS" + else + msg "execute ts_setup fail" + _set_ts_setup_stat "$TST_FAIL" + _tst_ret=1 + fi + else + msg "the $TST_TS_TOPDIR/tst_lib/ts_setup can't execute" + _set_ts_setup_stat "$TST_FAIL" + _tst_ret=1 + fi + else + msg "ts_setup not exist" + _set_ts_setup_stat "$TST_PASS" + fi + + return $_tst_ret +} + +_ts_setup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" new file mode 100755 index 0000000..c3ae1ba --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" @@ -0,0 +1,47 @@ +#!/bin/bash +# Time: 2022-04-19 22:44:25 +# Desc: 测试套公共ts_teardown + +if [ -d "$TST_TS_TOPDIR/tst_common" ]; then + # 先source测试用例自定义的公共文件 + source "$TST_TS_TOPDIR/tst_lib/ts_common.sh" || exit 1 + # 再source全局公共文件 + source "$TST_TS_TOPDIR/tst_common/lib/common.sh" || exit 1 +elif [ -d "$TST_TS_TOPDIR/lib" ]; then + # 只是tst_suite_common使用 + source "$TST_TS_TOPDIR/lib/common.sh" || exit 1 +else + echo "can't find the tsuite common file" + exit 1 +fi + +_ts_teardown() { + local _tst_ret=0 + + if ! _is_ts_setup_called; then + msg "the ts_setup may not execute, we'll not execute the ts_teardown" + return 1 + fi + + if [ -f "$TST_TS_TOPDIR/tst_lib/ts_teardown" ]; then + if [ -x "$TST_TS_TOPDIR/tst_lib/ts_teardown" ]; then + msg "try execute $TST_TS_TOPDIR/tst_lib/ts_teardown" + if ts_teardown; then + msg "execute ts_teardown success" + else + msg "execute ts_teardown fail" + _tst_ret=1 + fi + else + msg "the $TST_TS_TOPDIR/tst_lib/ts_teardown exist, but can't execute" + _tst_ret=1 + fi + else + msg "ts_teardown not exist" + fi + _clean_ts_setup_stat + + return $_tst_ret +} + +_ts_teardown diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" new file mode 100644 index 0000000..e1d3e4c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" @@ -0,0 +1,51 @@ +# bash/zsh completion support for tsuite. + +# To use these routines: +# +# 1) Copy this file to somewhere (e.g. ~/.tsuite-completion.bash). +# 2) Add the following line to your .bashrc/.zshrc: +# source ~/.tsuite-completion.bash + +_tsuite_completion() { + local cur prev + + cur=${COMP_WORDS[COMP_CWORD]} + prev=${COMP_WORDS[COMP_CWORD - 1]} + + case ${COMP_CWORD} in + 1) + COMPREPLY=($(compgen -W "help new list compile setup run teardown clean cleanall" -- ${cur})) + ;; + 2) + case ${prev} in + new) + COMPREPLY=($(compgen -W "case" -- ${cur})) + ;; + run) + local arr i file + arr=($(grep --include \*.c --include \*.sh --include \*.py -Ril "@用例名称:" testcase/)) + COMPREPLY=() + for ((i = 0; i < ${#arr[@]}; ++i)); do + file=${arr[i]} + if [[ -d $MEMO_DIR/$file ]]; then + file=$file/ + fi + COMPREPLY[i]=$file + done + ;; + esac + ;; + 3) + case ${prev} in + case) + COMPREPLY=($(compgen -W "sh c py" -- ${cur})) + ;; + esac + ;; + *) + COMPREPLY=() + ;; + esac +} + +complete -F _tsuite_completion tsuite diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" new file mode 100644 index 0000000..42887c2 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" @@ -0,0 +1,499 @@ +#!/bin/bash +# 测试套管理工具 + +export LANG=en_US.UTF-8 +export LANGUAGE="en_US:en" +export LC_ALL=en_US.UTF-8 + +if [ -d "$TST_TS_TOPDIR/tst_common" ]; then + source "$TST_TS_TOPDIR/tst_common/lib/common.sh" || exit 1 +elif [ -d "$TST_TS_TOPDIR/lib" ]; then + # 只是tst_suite_common使用 + source "$TST_TS_TOPDIR/lib/common.sh" || exit 1 +else + echo "can't find the tsuite common file" + exit 1 +fi + +[ -z "$TST_TS_SYSDIR" ] && export TST_TS_SYSDIR="$TST_TS_TOPDIR/logs/.ts.sysdir" + +tsuite_usage() { + echo -e "" + echo -e "./tsuite options sub_command sub_options" + echo -e " help: 显示帮助信息" + echo -e " new case sh|c|py case_name [template]: 新增测试用例" + echo -e " sh|c|py: 【必选】三选一,sh表示Shell脚本用例,c表示C用例,py表示Python脚本用例" + echo -e " case_name: 【必选】要创建的用例名,同时用作文件名" + echo -e " template: 【可选】不使用默认用例模板时,可以指定一个文件用作新用例模板" + echo -e " list: 列出本测试套的测试用例" + echo -e " compile: 编译测试套" + echo -e " setup: 执行测试套setup" + echo -e " run options: 执行测试用例,options可选参数如下:" + echo -e " null: 不指定时默认执行所有用例" + echo -e " case_path: 执行指定用例" + echo -e " -l level: 执行指定级别的用例,例如:0,1,2" + echo -e " -f case_list: 执行指定列表文件的用例" + echo -e " teardown: 执行测试套teardown" + echo -e " clean: 执行make clean" + echo -e " cleanall: 执行make cleanall,在clean基础上删除所有临时文件等" + echo -e "" +} + +get_all_testcase() { + local _tst_case_dir=./testcase + if [ ! -d "$_tst_case_dir" ]; then + echo "no testcase dir" + return 1 + fi + touch "$TST_TS_SYSDIR/all_testcase.list" + grep -r "@用例名称:" $_tst_case_dir | awk -F : '{print $1}' | sort | uniq >"$TST_TS_SYSDIR/all_testcase.list" +} + +# 获取用例属性 +# $1 -- 属性名称 +# $2 -- 用例文件 +get_case_attr() { + grep "@${1}:" "$2" 2>/dev/null | head -n 1 | sed "s|.*@${1}:\s*||g" | sed "s|\s*$||g" +} + +tsuite_list() { + local _tst_index=1 + + get_all_testcase + local _tst_nr_all_case + _tst_nr_all_case=$(wc -l <"$TST_TS_SYSDIR/all_testcase.list") + + echo "" + for i in $(seq "$_tst_nr_all_case"); do + local _tst_case_file + local _tst_case_name + _tst_case_file="$(sed -n "${i}p" "$TST_TS_SYSDIR/all_testcase.list")" + _tst_case_name=$(get_case_attr "用例名称" "$_tst_case_file") + printf "%4d : %-30s : %s\n" $_tst_index "$_tst_case_name" "$_tst_case_file" + _tst_index=$((_tst_index + 1)) + done + echo "" + echo "total $_tst_nr_all_case testcase" + echo "" +} + +# 执行单个用例 +# $1 -- 用例文件,Shell和Python用例直接执行脚本文件,C可以是源码文件,也可以是二进制文件(两个文件要同名,后缀不同) +tsuite_run_one() { + local _tst_input_file="$1" + shift + + local _tst_ret=0 + local _tst_log_dir="$TST_TS_TOPDIR/logs/testcase" + + local _tst_exec_file + local _tst_case_file + # C用例 + if file "$_tst_input_file" | grep -w "ELF" >/dev/null; then + _tst_exec_file="$_tst_input_file" + _tst_case_file="${_tst_exec_file%.test}" + _tst_case_file="${_tst_case_file}.c" + elif file "$_tst_input_file" | grep -w "C source" >/dev/null; then + _tst_exec_file="${_tst_input_file%.c}" + _tst_exec_file="${_tst_exec_file}.test" + _tst_case_file="${_tst_input_file}" + else + _tst_exec_file="${_tst_input_file}" + _tst_case_file="${_tst_input_file}" + fi + local _tst_case_name + _tst_case_name=$(get_case_attr "用例名称" "$_tst_case_file") + + mkdir -p "$_tst_log_dir" + + echo "execute $_tst_case_name: $_tst_exec_file $*" + "$_tst_exec_file" "$@" || _tst_ret=1 + + return $_tst_ret +} + +# 执行指定列表文件的用例 +# $1 -- 要执行的用例列表文件,每行一个用例,井号'#'表示忽略对应用例 +tsuite_run_some() { + if [ ! -f "$1" ]; then + echo "testcase list file '$1' not exist" + fi + local _tst_run_list="$TST_TS_SYSDIR/run.list" + local _tst_run_result="$TST_TS_SYSDIR/run.result" + rm -rf "$_tst_run_list" "$_tst_run_result" + # 去掉注释行和空行,删掉行前的空格 + grep -v "^[[:blank:]]*#" "$1" | grep -v "^[[:blank:]]*$" | sed "s|^[[:blank:]]\+||g" >"$_tst_run_list" + + local _tst_ret=0 + local _tst_nr_pass=0 + local _tst_nr_skip=0 + local _tst_nr_fail=0 + local _tst_index=1 + local _tst_nr_all_case + _tst_nr_all_case=$(wc -l <"$_tst_run_list") + local _tst_case_time_start + local _tst_case_time_end + local _tst_case_cost + + printf "\n %-30s ==>" "ts_setup" + if tsuite_setup >"$TST_TS_TOPDIR/logs/ts_setup.log" 2>&1; then + echo " PASS" + else + echo " FAIL" + fi + mkdir -p "$TST_TS_TOPDIR/logs/testcase" + for i in $(seq "$_tst_nr_all_case"); do + local _tst_case_file + local _tst_case_name + local _tst_case_result + _tst_case_file="$(sed -n "${i}p" "$_tst_run_list")" + _tst_case_name=$(get_case_attr "用例名称" "$_tst_case_file") + local _tst_case_log="$TST_TS_TOPDIR/logs/testcase/${_tst_case_name}.log" + printf "%4d/%-4d : %-30s ==>" $_tst_index "$_tst_nr_all_case" "$_tst_case_name" + _tst_case_time_start=$(get_up_time_ms) + tsuite_run_one "$_tst_case_file" >"$_tst_case_log" 2>&1 + _tst_case_time_end=$(get_up_time_ms) + _tst_case_cost=$(diff_time_ms2sec "$_tst_case_time_start" "$_tst_case_time_end") + _tst_case_result=$(grep "RESULT : .* ==> \[ [A-Z]\+ \]" "$_tst_case_log" | + tail -n 1 | sed "s|.* ==> \[ \([A-Z]\+\) \].*|\1|g") + case "$_tst_case_result" in + "PASSED") + _tst_nr_pass=$((_tst_nr_pass + 1)) + echo "$_tst_index/$_tst_nr_all_case $_tst_case_name PASS cost:$_tst_case_cost" >>"$_tst_run_result" + echo " PASS (cost $_tst_case_cost)" + ;; + "SKIP") + _tst_nr_skip=$((_tst_nr_skip + 1)) + echo "$_tst_index/$_tst_nr_all_case $_tst_case_name SKIP cost:$_tst_case_cost" >>"$_tst_run_result" + echo " SKIP (cost $_tst_case_cost)" + ;; + *) + _tst_nr_fail=$((_tst_nr_fail + 1)) + echo "$_tst_index/$_tst_nr_all_case $_tst_case_name FAIL cost:$_tst_case_cost" >>"$_tst_run_result" + echo " FAIL (cost $_tst_case_cost)" + _tst_ret=1 + ;; + esac + _tst_index=$((_tst_index + 1)) + done + printf " %-30s ==>" "ts_teardown" + if tsuite_teardown >"$TST_TS_TOPDIR/logs/ts_teardown.log" 2>&1; then + echo " PASS" + else + echo " FAIL" + fi + + echo "" + echo "total: $_tst_nr_all_case" + echo " pass: $_tst_nr_pass" + echo " skip: $_tst_nr_skip" + echo " fail: $_tst_nr_fail" + echo "" + + return $_tst_ret +} + +tsuite_run_all() { + get_all_testcase + tsuite_run_some "$TST_TS_SYSDIR/all_testcase.list" +} + +tsuite_compile() { + local _tst_ret=0 + + echo "try cleanall before compile" + make -C "$TST_TS_TOPDIR" cleanall || _tst_ret=1 + echo "compile the testsuite" + if which bear; then + bear -- make -C "$TST_TS_TOPDIR" all || _tst_ret=1 + else + make -C "$TST_TS_TOPDIR" all || _tst_ret=1 + fi + + return $_tst_ret +} + +tsuite_setup() { + local _tst_ret=0 + + echo "tsuite try execute ts_setup" + if [ -f "$TST_TS_TOPDIR/tst_common/lib/tst_ts_setup" ]; then + "$TST_TS_TOPDIR/tst_common/lib/tst_ts_setup" || _tst_ret=1 + elif [ -f "$TST_TS_TOPDIR/lib/tst_ts_setup" ]; then + # 只是tst_suite_common使用 + "$TST_TS_TOPDIR/lib/tst_ts_setup" || _tst_ret=1 + else + echo "the tst_ts_setup not found" + _tst_ret=1 + fi + + return $_tst_ret +} + +tsuite_run() { + local _tst_ret=0 + + # 生成结果记录文件 + _get_tst_result_file + + if [ -z "$1" ]; then + tsuite_run_all || _tst_ret=1 + elif [ "$1" == "-f" ]; then + echo "Try run testcases in list file '$2'" + tsuite_run_some "$2" || _tst_ret=1 + elif [ "$1" == "-l" ]; then + echo "Try run testcases with level '$2'" + rm -rf "$TST_TS_SYSDIR/level.list" + for l in $(echo "$2" | tr ',' ' '); do + grep -r "@用例级别:[[:blank:]]*$l" ./testcase | awk -F : '{print $1}' | + sort | uniq >>"$TST_TS_SYSDIR/level.list" + done + tsuite_run_some "$TST_TS_SYSDIR/level.list" || _tst_ret=1 + else + tsuite_run_one "$@" || _tst_ret=1 + fi + + sed -i "/^suite-end-time:/c suite-end-time: $(get_timestamp_ms)" "$TST_RESULT_FILE" + + return $_tst_ret +} + +tsuite_teardown() { + local _tst_ret=0 + + mkdir -p "$TST_TS_TOPDIR/logs" + echo "tsuite try execute ts_teardown" + if [ -f "$TST_TS_TOPDIR/tst_common/lib/tst_ts_teardown" ]; then + "$TST_TS_TOPDIR/tst_common/lib/tst_ts_teardown" || _tst_ret=1 + elif [ -f "$TST_TS_TOPDIR/lib/tst_ts_teardown" ]; then + # 只是tst_suite_common使用 + "$TST_TS_TOPDIR/lib/tst_ts_teardown" || _tst_ret=1 + else + echo "the tst_ts_setup not found" + _tst_ret=1 + fi + + return $_tst_ret +} + +tsuite_clean() { + local _tst_ret=0 + + make -C "$TST_TS_TOPDIR" clean || _tst_ret=1 + + return $_tst_ret +} + +tsuite_cleanall() { + local _tst_ret=0 + + make -C "$TST_TS_TOPDIR" cleanall || _tst_ret=1 + rm -rfv "$TST_TS_TOPDIR/logs" "$TST_TS_TOPDIR/compile_commands.json" + + return $_tst_ret +} + +# 新建用例模板 +# $1 -- 用例代码类型:sh/c/py +# $2 -- 用例名 +# $3 -- 可选参数,用例模板 +tsuite_new_case() { + local _tst_tc_type="$1" + local _tst_tc_name="$2" + local _tst_input_template="$3" + local _tst_tc_id + _tst_tc_id=$(date '+%Y%m%d-%H%M%S-%N') + local _tst_tc_file="testcase/${2}.${1}" + local _tst_template_path="$TST_TS_TOPDIR/tst_common/testcase" + # 为了适配tst_suite_common + [ -d "$_tst_template_path" ] || _tst_template_path="$TST_TS_TOPDIR/testcase" + if [ ! -d "$_tst_template_path" ]; then + echo "the template path is $_tst_template_path, not dir" + return 1 + fi + + if [ -z "$_tst_tc_name" ]; then + echo "the testcase name not set" + return 1 + fi + + if [ -z "$_tst_input_template" ]; then + case "$_tst_tc_type" in + sh) + cp -v "$_tst_template_path/test_shell_testcase.sh" "$TST_TS_TOPDIR/$_tst_tc_file" + sed -i "s|}/lib/common|}/tst_common/lib/common|g" "$TST_TS_TOPDIR/$_tst_tc_file" + ;; + c) + cp -v "$_tst_template_path/test_c_testcase.c" "$TST_TS_TOPDIR/$_tst_tc_file" + ;; + py) + cp -v "$_tst_template_path/test_python_testcase.py" "$TST_TS_TOPDIR/$_tst_tc_file" + sed -i "/from lib.common import TestCase/c from tst_lib.ts_common import MyTestCase" \ + "$TST_TS_TOPDIR/$_tst_tc_file" + sed -i "/class PythonTestCase(TestCase):/c class PythonTestCase(MyTestCase):" \ + "$TST_TS_TOPDIR/$_tst_tc_file" + ;; + *) + echo "unsupported testcase type" + return 1 + ;; + esac + else + if [ ! -f "$_tst_input_template" ]; then + echo "the template file $_tst_input_template not exist" + return 1 + fi + if ! echo "$_tst_input_template" | grep "\.$_tst_tc_type$" >/dev/null; then + echo "the template file $_tst_input_template not match the testcase type $_tst_tc_type" + return 1 + fi + cp -v "$_tst_input_template" "$TST_TS_TOPDIR/$_tst_tc_file" + fi + + sed -i "s|@用例ID:.*|@用例ID: $_tst_tc_id|g" "$TST_TS_TOPDIR/$_tst_tc_file" + sed -i "s|@用例名称:.*|@用例名称: $_tst_tc_name|g" "$TST_TS_TOPDIR/$_tst_tc_file" + echo "" + echo "the new testcase info:" + echo " name: $_tst_tc_name" + echo " type: $_tst_tc_type" + echo " id: $_tst_tc_id" + echo " file: $_tst_tc_file" + echo "" + return 0 +} + +# 新建测试套 +# $1 -- 测试套git路径 +tsuite_new_suite() { + local _tst_git_url="$1" + local _tst_suite_name + _tst_suite_name=$(basename "$_tst_git_url" | sed "s|\.git$||g") + + if ! echo "$_tst_git_url" | grep "\.git$" >/dev/null; then + echo "the git url unusable" + return 1 + fi + if [ -z "$_tst_suite_name" ]; then + echo "get suite name fail" + return 1 + fi + if [ -d "./$_tst_suite_name" ]; then + echo "the ./$_tst_suite_name existed" + return 1 + fi + + echo "git clone $_tst_git_url ./$_tst_suite_name" + if ! git clone "$_tst_git_url" "./$_tst_suite_name"; then + echo "clone $_tst_suite_name fail" + return 1 + fi + if [ -d "./$_tst_suite_name/tst_common" ]; then + echo "the suite $_tst_suite_name initialization has been completed yet" + return 1 + fi + + echo "get suite_example: git clone https://gitee.com/opencloudos-stream/test-suite-example.git" + rm -rf "$TST_TS_SYSDIR/suite_example" + if ! git clone https://gitee.com/opencloudos-stream/test-suite-example.git "$TST_TS_SYSDIR/suite_example"; then + echo "clone suite_example fail" + rm -rf "./$_tst_suite_name" + return 1 + fi + cp -rv "$TST_TS_SYSDIR/suite_example"/* "./$_tst_suite_name" + cp -rv "$TST_TS_SYSDIR/suite_example/.gitignore" "./$_tst_suite_name" + rm -rf "$TST_TS_SYSDIR/suite_example" + + cd "./$_tst_suite_name" || return 1 + rm -rf ./tst_common + echo "add submodule to common for $_tst_suite_name" + if ! git submodule add https://gitee.com/opencloudos-stream/test-suite-base.git ./common; then + echo "add submodule fail" + cd .. + rm -rf "./$_tst_suite_name" + return 1 + fi + + echo "remove the sample testcase" + rm -fv ./testcase/test_* + + return 0 +} + +tsuite_new() { + local _tst_ret=0 + + case $1 in + case) + shift + tsuite_new_case "$@" || _tst_ret=1 + ;; + suite) + shift + tsuite_new_suite "$@" || _tst_ret=1 + ;; + *) + echo "unknown new type: $*" + _tst_ret=1 + ;; + esac + + return $_tst_ret +} + +tsuite_main() { + local _tst_ret=0 + local _tst_cmd="$0 $*" + local _tst_suite_time_start + _tst_suite_time_start=$(get_up_time_ms) + local _tst_suite_time_end + + echo "TST_TS_TOPDIR=$TST_TS_TOPDIR" + cd "$TST_TS_TOPDIR" || return 1 + mkdir -p "$TST_TS_SYSDIR" || return 1 + + case "$1" in + help) + tsuite_usage + return 0 + ;; + new) + shift + tsuite_new "$@" || _tst_ret=1 + ;; + list) + tsuite_list || _tst_ret=1 + ;; + compile) + tsuite_compile || _tst_ret=1 + ;; + setup) + tsuite_setup || _tst_ret=1 + ;; + run) + shift + tsuite_run "$@" || _tst_ret=1 + ;; + teardown) + tsuite_teardown || _tst_ret=1 + ;; + clean) + tsuite_clean || _tst_ret=1 + ;; + cleanall) + tsuite_cleanall || _tst_ret=1 + ;; + *) + echo "$0 $*" + tsuite_usage + return 1 + ;; + esac + + _tst_suite_time_end=$(get_up_time_ms) + if [ $_tst_ret -eq 0 ]; then + echo "execute $_tst_cmd success, cost $(diff_time_ms2sec "$_tst_suite_time_start" "$_tst_suite_time_end")" + else + echo "execute $_tst_cmd fail, cost $(diff_time_ms2sec "$_tst_suite_time_start" "$_tst_suite_time_end")" + fi + return $_tst_ret +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" new file mode 100644 index 0000000..1cb97df --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" @@ -0,0 +1,20 @@ +export TST_COMMON_TOPDIR ?= $(shell pwd)/.. +include $(TST_COMMON_TOPDIR)/Makefile.common +ALL_SRC := $(wildcard *.c) +ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) +ALL_BIN := $(patsubst %.o,%.test,$(ALL_OBJ)) +CFLAGS += +LDFLAGS += + +all: $(ALL_BIN) + +$(ALL_BIN):%.test:%.o + $(CC) $^ -o $@ $(LDFLAGS) + +$(ALL_OBJ):%.o:%.c + $(CC) $(CFLAGS) -c $^ -o $@ + +clean: + rm -rfv $(ALL_OBJ) $(ALL_BIN) + +cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" new file mode 100644 index 0000000..6624689 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" @@ -0,0 +1,35 @@ +/* **************************************************************************** + * @用例ID: 20220418-230037-838974137 + * @用例名称: test_c_testcase + * @用例级别: 3 + * @用例标签: + * @用例类型: 功能 + * ***************************************************************************/ + +#include "main.h" + +int tc_setup(int argc, char **argv) { + msg("this is tc_setup"); + // @预置条件: + // @预置条件: + return 0; +} + +int do_test(int argc, char **argv) { + msg("this is do_test"); + + // @测试步骤:1: + + // @测试步骤:2: + + // @测试步骤:3: + // @预期结果:3: + assert_true(1 + 1 == 2); + + return 0; +} + +int tc_teardown(int argc, char **argv) { + msg("this is tc_teardown"); + return 0; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" new file mode 100755 index 0000000..b09c3b0 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# coding: utf-8 +import os.path +import subprocess +import sys + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +from lib.common import TestCase +from lib.benchmark import PerfSysBench + + +def prepare(): + subprocess.run(["which", "sysbench"]) + + +def cleanup(): + pass + + +class PythonTestCase(TestCase): + """ + @用例ID: 20220721-001631-159391306 + @用例名称: test_perf_tools + @用例级别: 3 + @用例标签: + @用例类型: 功能 + """ + + def tc_setup(self, *args): + # @预置条件: + self.msg("this is tc_setup") + + def do_test(self, *args): + # @测试步骤:1: + perf = PerfSysBench(name='cpu', sysbench='sysbench', testname='cpu') + perf.prepare = prepare + perf.cleanup = cleanup + perf.run() + perf.report() + # @测试步骤:2: + + # @测试步骤:3: + # @预期结果:3: + self.assert_true(1 == 1) + + def tc_teardown(self, *args): + self.msg("this is tc_teardown") + + +if __name__ == '__main__': + PythonTestCase().tst_main(sys.argv) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" new file mode 100755 index 0000000..ea86f3d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +# coding: utf-8 + +import os.path +import sys + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +from lib.common import TestCase + + +class PythonTestCase(TestCase): + """ + @用例ID: 20220420-234008-893237761 + @用例名称: test_python_testcase + @用例级别: 3 + @用例标签: + @用例类型: 功能 + """ + + def tc_setup(self, *args): + # @预置条件: + self.msg("this is tc_setup") + + def do_test(self, *args): + # @测试步骤:1: + + # @测试步骤:2: + + # @测试步骤:3: + # @预期结果:3: + self.assert_true(1 == 1) + + def tc_teardown(self, *args): + self.msg("this is tc_teardown") + + +if __name__ == '__main__': + PythonTestCase().tst_main(sys.argv) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" new file mode 100755 index 0000000..5f5f5ba --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" @@ -0,0 +1,47 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20220410-152859-724647329 +# @用例名称: test_shell_testcase +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +source "${TST_TS_TOPDIR}/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: + # @预置条件: + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: + + # @测试步骤:2: + + # @测试步骤:3: + # @预期结果:3: + assert_true [ 1 -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" new file mode 100755 index 0000000..ee4170c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" @@ -0,0 +1,17 @@ +#!/bin/bash +# 测试套管理工具 + +TST_TS_TOPDIR=$(realpath "$(dirname "$0")") +export TST_TS_TOPDIR +TST_TS_ORI_CWD="$(pwd)" +export TST_TS_ORI_CWD +if [ -f "$TST_TS_TOPDIR/tst_common/lib/tsuite_func.sh" ]; then + source "$TST_TS_TOPDIR/tst_common/lib/tsuite_func.sh" +elif [ -f "$TST_TS_TOPDIR/lib/tsuite_func.sh" ]; then + source "$TST_TS_TOPDIR/lib/tsuite_func.sh" +else + echo "can't find the tsuite_func.sh file" + exit 1 +fi + +tsuite_main "$@" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" new file mode 100644 index 0000000..171b10b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" @@ -0,0 +1,20 @@ +export TST_TS_TOPDIR ?= $(shell pwd)/.. +include $(TST_TS_TOPDIR)/Makefile.common +ALL_SRC := $(wildcard *.c) +ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) +LIB_STATIC := libtscommon.a +CFLAGS += + +all: $(LIB_STATIC) + +$(LIB_STATIC): $(ALL_OBJ) + ar -rc $(LIB_STATIC) $(ALL_OBJ) + +$(ALL_OBJ):%.o:%.c + $(CC) $(CFLAGS) -c $^ -o $@ + +clean: + rm -rfv $(LIB_STATIC) $(ALL_OBJ) + +cleanall: clean + rm -rfv __pycache__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" new file mode 100644 index 0000000..e63ac90 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" @@ -0,0 +1,5 @@ +#!/bin/bash + +my_func() { + return 0 +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" new file mode 100644 index 0000000..b65caf6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" @@ -0,0 +1,23 @@ +// 测试套自定义公共函数库 +#include "common.h" +#include "ts_common.h" + +int ts_setup(void) { + msg("this is ts_setup"); + return 0; +} + +int tc_setup_common(int argc, char **argv) { + msg("this is tc_setup_common"); + return 0; +} + +int tc_teardown_common(int argc, char **argv) { + msg("this is tc_teardown_common"); + return 0; +} + +int ts_teardown(void) { + msg("this is ts_teardown"); + return 0; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" new file mode 100644 index 0000000..9ed2c5f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" @@ -0,0 +1,6 @@ +#ifndef __TS_COMMON_H__ +#define __TS_COMMON_H__ + +// 测试套自定义头文件内容 + +#endif // __TS_COMMON_H__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" new file mode 100644 index 0000000..5b60299 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# Desc: 测试套公共模块 +import abc +import os.path +import sys + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +from tst_common.lib.common import TestCase + + +class MyTestCase(TestCase): + """ + 本测试套内的Python用例需要继承此类 + """ + + def tc_setup_common(self, *args): + """ + 所有Python用例执行tc_setup函数前会先执行本函数 + :param args: + :return: + """ + self.msg("this is tc_setup_common") + + @abc.abstractmethod + def do_test(self, *args): + pass + + def tc_teardown_common(self, *args): + """ + 所有Python用例执行tc_teardown函数后会执行本函数 + :param args: + :return: + """ + self.msg("this is tc_teardown_common") diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" new file mode 100644 index 0000000..0516a9e --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" @@ -0,0 +1,28 @@ +#!/bin/bash +# 测试套公共函数 +# 约定: +# 1、以下划线"_"开头的函数和变量用例不能直接调用 +# 2、环境变量全大写,全局变量加上"g_"前置,局部变量统一加"local"修饰 + +# source自己定义的其他公共函数 +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 + +ts_setup() { + msg "this is ts_setup" + return 0 +} + +tc_setup_common() { + msg "this is tc_setup_common" + return 0 +} + +tc_teardown_common() { + msg "this is tc_teardown_common" + return 0 +} + +ts_teardown() { + msg "this is ts_teardown" + return 0 +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" new file mode 100755 index 0000000..2f7aaaf --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" @@ -0,0 +1,13 @@ +#!/bin/bash +# Time: 2022-04-19 22:44:25 +# Desc: ts_setup +[ -z "$TST_TS_TOPDIR" ] && export TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" + +ts_setup() { + # 测试套setup脚本,在这里增加setup操作 + msg "this is ts_setup" + return 0 +} + +ts_setup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" new file mode 100755 index 0000000..324080f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" @@ -0,0 +1,13 @@ +#!/bin/bash +# Time: 2022-04-19 22:44:25 +# Desc: ts_teardown +[ -z "$TST_TS_TOPDIR" ] && export TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" + +ts_teardown() { + # 测试套teardown脚本,在这里增加teardown操作 + msg "this is ts_teardown" + return 0 +} + +ts_teardown diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" new file mode 120000 index 0000000..d7009e5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" @@ -0,0 +1 @@ +tst_common/tsuite \ No newline at end of file -- Gitee From 5f177f6509868297d1ccd6f45d5cbb2eeb4dfded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 11 Jul 2024 10:14:10 +0800 Subject: [PATCH 02/37] =?UTF-8?q?=E4=BF=AE=E6=94=B9cpuaccy=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E7=9A=84=E7=94=A8=E6=88=B7=E6=80=81?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-cpuacct-stat.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" | 4 ++-- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" index de0b2b2..a3c9763 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" @@ -34,7 +34,7 @@ do_test() { { for _ in {1..100}; do dd if=/dev/zero of=/dev/null bs=1M count=1 - : $((2**20)) + echo -e "line1\nline2\nline3" | awk 'END {print NR}' done } & diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" index 8e0418b..e2aeabf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -35,7 +35,7 @@ do_test() { { for _ in {1..100}; do dd if=/dev/zero of=/dev/null bs=1M count=1 - : $((2**20)) + echo -e "line1\nline2\nline3" | awk 'END {print NR}' done } & diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index cc506f4..aed099b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -32,9 +32,9 @@ do_test() { # @测试步骤:2: 启动一个用户态CPU密集型任务并将其放入cgroup { - for _ in {1..1000000}; do + for _ in {1..100}; do # 执行一些用户态操作 - : $((2**20)) + echo -e "line1\nline2\nline3" | awk 'END {print NR}' done } & diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" index 0b666ae..bd0cb11 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -32,9 +32,9 @@ do_test() { # @测试步骤:2: 启用一个用户态CPU密集型任务并将其放入cgroup { - for _ in {1..1000000}; do + for _ in {1..100}; do # 执行一些用户态操作 - : $((2**20)) + echo -e "line1\nline2\nline3" | awk 'END {print NR}' done } & -- Gitee From 8b1de9366e88043d236acdc267b30f460966f081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Sat, 13 Jul 2024 22:20:19 +0800 Subject: [PATCH 03/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cpu=E5=AD=90=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-cpu-cfs.sh" | 79 +++++++++++++++++ .../testcase/cgroup-v1-cpu-rt.sh" | 55 ++++++++++++ .../testcase/cgroup-v1-cpu-shares.sh" | 86 +++++++++++++++++++ .../testcase/cgroup-v1-cpuacct-stat.sh" | 5 +- .../testcase/cgroup-v1-cpuacct-usage.sh" | 5 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 5 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 5 +- .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 5 +- .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 5 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 5 +- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 5 +- 11 files changed, 244 insertions(+), 16 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" new file mode 100755 index 0000000..2fe6f2f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" @@ -0,0 +1,79 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240711-115955-308386734 +# @用例名称: cgroup-v1-cpu-cfs +# @用例级别: 3 +# @用例标签: cgroup cpu +# @用例类型: 测试cpu是否能按CPU使用周期时间分配CPU时间 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_T + OPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +cgroup="${g_tmpdir}/test_cgroup" + +tc_setup() { + msg "this is tc_setup" + + + # @预置条件: 创建一个新的cgroup + cgcreate -g cpu:/"${cgroup}" || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us + echo 500000 > /sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_period_us + echo 400000 > /sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_quota_us + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid > /sys/fs/cgroup/cpu/"${cgroup}"/cgroup.procs + + sleep 3 + + # @测试步骤:3: 读取cpu.stat文件 + cpu_stat=$(cat /sys/fs/cgroup/cpu/"${cgroup}"/cpu.stat) + msg "cpu_stat: " + msg "$cpu_stat" + + # @预期结果:1: 验证cpu.stat文件中的nr_periods和nr_throttled,throttled_time + nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') + nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') + throttled_time=$(echo "$cpu_stat" | grep throttled_time | awk '{print $2}') + + msg "nr_periods: $nr_periods" + msg "nr_throttled: $nr_throttled" + msg "throttled_time: $throttled_time" + + assert_true [ "$nr_periods" -gt 0 ] + assert_true [ "$nr_throttled" -gt 0 ] + assert_true [ "$throttled_time" -gt 0 ] + + kill -9 $task_pid + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpu:/"${cgroup}" || return 1 + cgdelete -g cpu:/"${g_tmpdir}" || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" new file mode 100755 index 0000000..efc6879 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" @@ -0,0 +1,55 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240711-140451-238651765 +# @用例名称: cgroup-v1-cpu-rt +# @用例级别: 3 +# @用例标签: cgroup cpu +# @用例类型: 测试cpu是否能按CPU使用周期时间分配CPU时间(RT调度策略) +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST + _TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件:检查是否启用了CONFIG_RT_GROUP_SCHED配置 + if ! grep -q "^CONFIG_RT_GROUP_SCHED=y" "/boot/config-$(uname -r)"; then + echo "错误信息: cgroup-v1-cpu-rt脚本需要启用CONFIG_RT_GROUP_SCHED配置" + exit 1 + fi + + # @预置条件: 创建一个新的cgroup + cgcreate -g cpu:"/test_cgroup" || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us + echo 1000000 > /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us || return 1 + echo 800000 > /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_runtime_us || return 1 + + # @测试步骤:2: 验证设置 + period=$(cat /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us) + runtime=$(cat /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_runtime_us) + + # @预期结果:1:验证cpu.rt_period_us和cpu.rt_runtime_us是否正确设置 + assert_true [ "$period" -eq 1000000 ] && [ "$runtime" -eq 800000 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpu:/test_cgroup || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" new file mode 100755 index 0000000..4ca8b09 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240711-102849-220066922 +# @用例名称: cgroup-v1-cpu-shares +# @用例级别: 3 +# @用例标签:cgroup cpu +# @用例类型: 测试cpu.shares是否能完成按权重设定CPU分配 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +cgroup1="${g_tmpdir}/cgroup1" +cgroup2="${g_tmpdir}/cgroup2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件:检查是否以root用户运行 + if [ "$EUID" -ne 0 ]; then + echo "本脚本需要 root 权限运行, 尝试在root shell环境下运行" + exit 1 + fi + + # @预置条件:创建两个新的cgroup + cgcreate -g cpu:"$cgroup1" + cgcreate -g cpu:"$cgroup2" + return 0 +} + +do_test() { + msg "this is do_test" + + # 测试步骤:1: 对不同的cgroup设置不同的cpu.shares值 + echo 2048 > /sys/fs/cgroup/cpu/"$cgroup1"/cpu.shares + echo 512 > /sys/fs/cgroup/cpu/"$cgroup2"/cpu.shares + + # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo $task_pid1 > /sys/fs/cgroup/cpu/"$cgroup1"/cgroup.procs + + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + echo $task_pid2 > /sys/fs/cgroup/cpu/"$cgroup2"/cgroup.procs + + sleep 3 + + # @测试步骤:3: 获取两个cgroup的CPU使用时间 + usage1=$(cat /sys/fs/cgroup/cpu/"$cgroup1"/cpuacct.usage) + usage2=$(cat /sys/fs/cgroup/cpu/"$cgroup2"/cpuacct.usage) + + msg "usage1: $usage1" + msg "usage2: $usage2" + + # @预期结果:4: 验证CPU使用时间比例是否符合预期,4:1 + usage_ratio=$(echo "scale=2; $usage1 / $usage2 + 0.5" | bc) + usage_ratio=$(printf "%.0f" "$usage_ratio") + msg "usage_ratio: $usage_ratio" + + expected_ratio=$(echo "2048 / 512" | bc) + msg "expected_ratio: $expected_ratio" + + assert_true [ "$(echo "$usage_ratio >= $expected_ratio" | bc)" -eq 1 ] + + kill -9 $task_pid1 $task_pid2 + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpu:/"$cgroup1" || return 1 + cgdelete -g cpu:/"$cgroup2" || return 1 + cgdelete -g cpu:/"$g_tmpdir" || return 1 + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" index a3c9763..dcab357 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-stat # @用例级别: 3 # @用例标签: -# @用例类型: 功能 +# @用例类型: 测试cpuacct.stat统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -46,7 +46,7 @@ do_test() { stat_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) msg "stat_after: $stat_after" - # @预期结果:3: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 + # @预期结果:1: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 user_before=$(echo "$stat_before" | grep user | awk '{print $2}') sys_before=$(echo "$stat_before" | grep system | awk '{print $2}') user_after=$(echo "$stat_after" | grep user | awk '{print $2}') @@ -64,6 +64,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" index f7a69c1..0736ad0 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage # @用例级别: 3 # @用例标签: cgroup, cpuacct -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -44,7 +44,7 @@ do_test() { usage_after=$(sudo cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) msg "usage_after: $usage_after ns" - # @预期结果:4: 验证统计数据是否正确反映了CPU使用情况,即CPU使用时间增加 + # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况,即CPU使用时间增加 assert_true [ "$usage_after" -gt "$usage_before" ] || { msg "usage_after: $usage_after <= usage_before: $usage_before" return 1 @@ -57,6 +57,7 @@ tc_teardown() { msg "Cleaning up test environment" # 删除cgroup cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" index e2aeabf..50b57fe 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage_all # @用例级别: 3 # @用例标签: -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage_all统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -48,7 +48,7 @@ do_test() { msg "usage_all_after: " msg "$usage_all_after" - # @预期结果:3: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 + # @预期结果:1: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 # 从usage_all文件中提取用户态和内核态CPU使用时间 IFS=$'\n' read -r -d '' -a usage_all_before_array <<< "$usage_all_before" IFS=$'\n' read -r -d '' -a usage_all_after_array <<< "$usage_all_after" @@ -82,6 +82,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index 41d54ee..44dd1a7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage_percpu # @用例级别: 3 # @用例标签: cgroup, cpuacct -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage_percpu统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -41,7 +41,7 @@ do_test() { # @测试步骤:3: 记录运行任务后的每CPU使用时间 usage_percpu_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_after: $usage_percpu_after" - # @预期结果:3: 验证统计数据是否正确反映了CPU使用情况 + # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 for ((i=0; i<${#usage_percpu_before[@]}; i++)); do # 是否存在某个CPU的使用时间增加,如果有则说明统计数据正确 if [ "${usage_percpu_after[$i]}" \> "${usage_percpu_before[$i]}" ]; then @@ -57,6 +57,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index d858793..2be8d0b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage_percpu_sys # @用例级别: 3 # @用例标签: -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage_percpu_sys统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -46,7 +46,7 @@ do_test() { usage_percpu_sys_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) msg "usage_percpu_sys_after: $usage_percpu_sys_after" - # @预期结果:3: + # @预期结果:1: for ((i=0; i<${#usage_percpu_sys_before[@]}; i++)); do # 是否存在某个CPU的内核态CPU使用时间增加,如果有则说明统计数据正确 if [ "${usage_percpu_sys_after[$i]}" \> "${usage_percpu_sys_before[$i]}" ]; then @@ -62,6 +62,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index aed099b..1a8cc4d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage_percpu_user # @用例级别: 3 # @用例标签: -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage_percpu_user统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -46,7 +46,7 @@ do_test() { usage_percpu_user_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_user_after: $usage_percpu_user_after" - # @预期结果:3: + # @预期结果:1: for ((i=0; i<${#usage_percpu_user_before[@]}; i++)); do # 是否存在某个CPU的用户态CPU使用时间增加,如果有则说明统计数据正确 if [ "${usage_percpu_user_after[$i]}" \> "${usage_percpu_user_before[$i]}" ]; then @@ -62,6 +62,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 2e8d1fd..5ac11a7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage_sys # @用例级别: 3 # @用例标签: -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage_sys统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -46,7 +46,7 @@ do_test() { usage_sys_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) msg "usage_sys_after: $usage_sys_after ns" - # @预期结果:3: 验证统计数据是否正确反映了内核态CPU使用情况,即内核态CPU使用时间增加 + # @预期结果:1: 验证统计数据是否正确反映了内核态CPU使用情况,即内核态CPU使用时间增加 assert_true [ "$usage_sys_after" -gt "$usage_sys_before" ] || { msg "Kernel CPU usage did not increase as expected: before=$usage_sys_before, after=$usage_sys_after" return 1 @@ -58,6 +58,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" index bd0cb11..0e93427 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuacct-usage_user # @用例级别: 3 # @用例标签: cgroup, cpuacct -# @用例类型: 功能 +# @用例类型: 测试cpuacct.usage_user统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -46,7 +46,7 @@ do_test() { usage_user_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) msg "usage_user_after: $usage_user_after ns" - # @预期结果:3: 验证统计数据是否正确反映了用户态CPU使用情况,即用户态CPU使用时间增加 + # @预期结果:1: 验证统计数据是否正确反映了用户态CPU使用情况,即用户态CPU使用时间增加 assert_true [ "$usage_user_after" -gt "$usage_user_before" ] || { msg "usage_user_after: $usage_user_after <= usage_user_before: $usage_user_before" return 1 @@ -58,6 +58,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 } -- Gitee From f1fffddfb7d805ad88bfdcf04f36cb8366336922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Sat, 13 Jul 2024 22:41:41 +0800 Subject: [PATCH 04/37] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-cpu-cfs.sh" | 7 +++---- .../testcase/cgroup-v1-cpu-rt.sh" | 4 ++-- .../testcase/cgroup-v1-cpu-shares.sh" | 12 ++++++------ .../testcase/cgroup-v1-cpuacct-stat.sh" | 6 +++--- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 8 ++++---- .../testcase/cgroup-v1-cpuacct-usage_percpu.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" | 6 +++--- .../testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 2 +- 9 files changed, 24 insertions(+), 25 deletions(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" index 2fe6f2f..99bd954 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" @@ -21,7 +21,6 @@ cgroup="${g_tmpdir}/test_cgroup" tc_setup() { msg "this is tc_setup" - # @预置条件: 创建一个新的cgroup cgcreate -g cpu:/"${cgroup}" || return 1 return 0 @@ -31,15 +30,15 @@ do_test() { msg "this is do_test" # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us - echo 500000 > /sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_period_us - echo 400000 > /sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_quota_us + echo 500000 >/sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_period_us + echo 400000 >/sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_quota_us # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup { while true; do :; done } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/cpu/"${cgroup}"/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpu/"${cgroup}"/cgroup.procs sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" index efc6879..3e751c3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" @@ -31,8 +31,8 @@ do_test() { msg "this is do_test" # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us - echo 1000000 > /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us || return 1 - echo 800000 > /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_runtime_us || return 1 + echo 1000000 >/sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us || return 1 + echo 800000 >/sys/fs/cgroup/cpu/test_cgroup/cpu.rt_runtime_us || return 1 # @测试步骤:2: 验证设置 period=$(cat /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" index 4ca8b09..c7f5be8 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" @@ -36,17 +36,17 @@ do_test() { msg "this is do_test" # 测试步骤:1: 对不同的cgroup设置不同的cpu.shares值 - echo 2048 > /sys/fs/cgroup/cpu/"$cgroup1"/cpu.shares - echo 512 > /sys/fs/cgroup/cpu/"$cgroup2"/cpu.shares + echo 2048 >/sys/fs/cgroup/cpu/"$cgroup1"/cpu.shares + echo 512 >/sys/fs/cgroup/cpu/"$cgroup2"/cpu.shares # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 - taskset 0x1 sh -c 'while true; do :; done' & + taskset 0x1 sh -c 'while true; do :; done' & task_pid1=$! - echo $task_pid1 > /sys/fs/cgroup/cpu/"$cgroup1"/cgroup.procs + echo $task_pid1 >/sys/fs/cgroup/cpu/"$cgroup1"/cgroup.procs taskset 0x1 sh -c 'while true; do :; done' & task_pid2=$! - echo $task_pid2 > /sys/fs/cgroup/cpu/"$cgroup2"/cgroup.procs + echo $task_pid2 >/sys/fs/cgroup/cpu/"$cgroup2"/cgroup.procs sleep 3 @@ -65,7 +65,7 @@ do_test() { expected_ratio=$(echo "2048 / 512" | bc) msg "expected_ratio: $expected_ratio" - assert_true [ "$(echo "$usage_ratio >= $expected_ratio" | bc)" -eq 1 ] + assert_true [ "$(echo "$usage_ratio >= $expected_ratio" | bc)" -eq 1 ] kill -9 $task_pid1 $task_pid2 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" index dcab357..05ac50c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" @@ -33,13 +33,13 @@ do_test() { # @测试步骤:2: 启动一个用户态和内核态混合任务并将其加入cgroup { for _ in {1..100}; do - dd if=/dev/zero of=/dev/null bs=1M count=1 + dd if=/dev/zero of=/dev/null bs=1M count=1 echo -e "line1\nline2\nline3" | awk 'END {print NR}' done } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的stat值 @@ -55,7 +55,7 @@ do_test() { # 如果用户态和内核态CPU使用情况都有增加,则认为测试通过 if [ "$user_after" -gt "$user_before" ] && [ "$sys_after" -gt "$sys_before" ]; then assert_true [ true ] - return 0; + return 0 fi return 1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" index 50b57fe..b8cfec6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -33,14 +33,14 @@ do_test() { # @测试步骤:2: 启动一个用户态和内核态混合任务并将其放入cgroup { - for _ in {1..100}; do + for _ in {1..100}; do dd if=/dev/zero of=/dev/null bs=1M count=1 echo -e "line1\nline2\nline3" | awk 'END {print NR}' done } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的usage_all值 @@ -50,8 +50,8 @@ do_test() { # @预期结果:1: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 # 从usage_all文件中提取用户态和内核态CPU使用时间 - IFS=$'\n' read -r -d '' -a usage_all_before_array <<< "$usage_all_before" - IFS=$'\n' read -r -d '' -a usage_all_after_array <<< "$usage_all_after" + IFS=$'\n' read -r -d '' -a usage_all_before_array <<<"$usage_all_before" + IFS=$'\n' read -r -d '' -a usage_all_after_array <<<"$usage_all_after" for i in "${!usage_all_before_array[@]}"; do # shellcheck disable=SC2206 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index 44dd1a7..c817c77 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -42,7 +42,7 @@ do_test() { usage_percpu_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_after: $usage_percpu_after" # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 - for ((i=0; i<${#usage_percpu_before[@]}; i++)); do + for ((i = 0; i < ${#usage_percpu_before[@]}; i++)); do # 是否存在某个CPU的使用时间增加,如果有则说明统计数据正确 if [ "${usage_percpu_after[$i]}" \> "${usage_percpu_before[$i]}" ]; then assert_true [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index 2be8d0b..7594da7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -39,7 +39,7 @@ do_test() { } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用内核态CPU的时间 @@ -47,7 +47,7 @@ do_test() { msg "usage_percpu_sys_after: $usage_percpu_sys_after" # @预期结果:1: - for ((i=0; i<${#usage_percpu_sys_before[@]}; i++)); do + for ((i = 0; i < ${#usage_percpu_sys_before[@]}; i++)); do # 是否存在某个CPU的内核态CPU使用时间增加,如果有则说明统计数据正确 if [ "${usage_percpu_sys_after[$i]}" \> "${usage_percpu_sys_before[$i]}" ]; then assert_true [ true ] @@ -61,7 +61,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 rm -rfv "$g_tmpdir" || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index 1a8cc4d..7e87c0f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -47,7 +47,7 @@ do_test() { msg "usage_percpu_user_after: $usage_percpu_user_after" # @预期结果:1: - for ((i=0; i<${#usage_percpu_user_before[@]}; i++)); do + for ((i = 0; i < ${#usage_percpu_user_before[@]}; i++)); do # 是否存在某个CPU的用户态CPU使用时间增加,如果有则说明统计数据正确 if [ "${usage_percpu_user_after[$i]}" \> "${usage_percpu_user_before[$i]}" ]; then assert_true [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 5ac11a7..197e437 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -39,7 +39,7 @@ do_test() { } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的内核态CPU使用时间 -- Gitee From fd8e12b23880723d6ab63c676118e0307f0fcb20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Sun, 21 Jul 2024 00:21:04 +0800 Subject: [PATCH 05/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cpuset=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-blkio-weight.sh" | 91 ++++++++++++++ .../testcase/cgroup-v1-cpu-cfs.sh" | 15 ++- .../testcase/cgroup-v1-cpu-rt.sh" | 9 +- .../testcase/cgroup-v1-cpu-shares.sh" | 14 +-- .../testcase/cgroup-v1-cpuacct-stat.sh" | 8 +- .../testcase/cgroup-v1-cpuacct-usage.sh" | 8 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 8 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 24 ++-- .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 8 +- .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 8 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 8 +- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 8 +- .../cgroup-v1-cpuset-cpu_exclusive.sh" | 86 +++++++++++++ .../testcase/cgroup-v1-cpuset-cpus.sh" | 74 +++++++++++ .../cgroup-v1-cpuset-mem_exclusive.sh" | 102 +++++++++++++++ .../cgroup-v1-cpuset-mem_hardwall.sh" | 118 ++++++++++++++++++ .../cgroup-v1-cpuset-memory_migrate.sh" | 112 +++++++++++++++++ .../cgroup-v1-cpuset-memory_pressure.sh" | 89 +++++++++++++ ...group-v1-cpuset-memory_spread_page-001.sh" | 108 ++++++++++++++++ ...group-v1-cpuset-memory_spread_page-002.sh" | 111 ++++++++++++++++ .../testcase/cgroup-v1-cpuset-mems.sh" | 92 ++++++++++++++ ...group-v1-cpuset-sched_load_balance-001.sh" | 78 ++++++++++++ ...group-v1-cpuset-sched_load_balance-002.sh" | 76 +++++++++++ 23 files changed, 1222 insertions(+), 33 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" new file mode 100755 index 0000000..3ae1ece --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" @@ -0,0 +1,91 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240715-150528-267263308 +# @用例名称: cgroup-v1-blkio-weight +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio weight +# @用例类型: 测试blkio.weight控制文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +cgroup1="${g_tmpdir}/cgroup1" +cgroup2="${g_tmpdir}/cgroup2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_CGROUP 配置未开启" + fi + # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 + if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" + fi + + # @预置条件: 创建两个新的cgroup + cgcreate -g blkio:"$cgroup1" + cgcreate -g blkio:"$cgroup2" + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 设置blkio.weight文件 + cgset -r blkio.weight=500 "$cgroup1" + cgset -r blkio.weight=1000 "$cgroup2" + + # @测试步骤:2: 启动两个进程进行磁盘I/O操作 + dd if=/dev/zero of="$cgroup1/testfile1" bs=1M count=100 oflag=direct & + pid1=$! + echo $pid1 > "$cgroup1/cgroup.procs" + + dd if=/dev/zero of="$cgroup2/testfile2" bs=1M count=100 oflag=direct & + pid2=$! + echo $pid2 > "$cgroup2/cgroup.procs" + + wait $pid1 + wait $pid2 + + # @测试步骤:3: 检查blkio.throttle.io_service_bytes文件 + io1=$(cgget -r blkio.throttle.io_service_bytes "$cgroup1" | awk '{print $2}') + io2=$(cgget -r blkio.throttle.io_service_bytes "$cgroup2" | awk '{print $2}') + + # @预期结果:1: 检查cgroup1和cgroup2的I/O带宽比是否接近1:2 + ratio=$(echo "scale=2; $io2 / $io1" | bc) + expected_ratio=2.00 + + msg "cgroup1 I/O: $io1 bytes" + msg "cgroup2 I/O: $io2 bytes" + msg "I/O ratio: $ratio" + + assert_true [ $(echo "$ratio > 1.8" | bc) -eq 1 ] && [ $(echo "$ratio < 2.2" | bc) -eq 1 ] + + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g blkio:"$cgroup1" + cgdelete -g blkio:"$cgroup2" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" index 99bd954..9611130 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240711-115955-308386734 # @用例名称: cgroup-v1-cpu-cfs # @用例级别: 3 -# @用例标签: cgroup cpu +# @用例标签: cgroup-v1 cpu cfs # @用例类型: 测试cpu是否能按CPU使用周期时间分配CPU时间 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -13,6 +13,8 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" @@ -20,7 +22,10 @@ cgroup="${g_tmpdir}/test_cgroup" tc_setup() { msg "this is tc_setup" - + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpu:/"${cgroup}" || return 1 return 0 @@ -56,12 +61,10 @@ do_test() { msg "nr_throttled: $nr_throttled" msg "throttled_time: $throttled_time" - assert_true [ "$nr_periods" -gt 0 ] - assert_true [ "$nr_throttled" -gt 0 ] - assert_true [ "$throttled_time" -gt 0 ] - kill -9 $task_pid + assert_true [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ] && [ "$throttled_time" -gt 0 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" index 3e751c3..af1e22d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240711-140451-238651765 # @用例名称: cgroup-v1-cpu-rt # @用例级别: 3 -# @用例标签: cgroup cpu +# @用例标签: cgroup-v1 cpu rt # @用例类型: 测试cpu是否能按CPU使用周期时间分配CPU时间(RT调度策略) ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -11,11 +11,18 @@ _TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +# shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件:检查是否启用了CONFIG_RT_GROUP_SCHED配置 if ! grep -q "^CONFIG_RT_GROUP_SCHED=y" "/boot/config-$(uname -r)"; then echo "错误信息: cgroup-v1-cpu-rt脚本需要启用CONFIG_RT_GROUP_SCHED配置" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" index c7f5be8..5bb2050 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240711-102849-220066922 # @用例名称: cgroup-v1-cpu-shares # @用例级别: 3 -# @用例标签:cgroup cpu +# @用例标签:cgroup-v1 cpu shares # @用例类型: 测试cpu.shares是否能完成按权重设定CPU分配 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,6 +12,8 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" @@ -20,12 +22,10 @@ cgroup2="${g_tmpdir}/cgroup2" tc_setup() { msg "this is tc_setup" - # @预置条件:检查是否以root用户运行 - if [ "$EUID" -ne 0 ]; then - echo "本脚本需要 root 权限运行, 尝试在root shell环境下运行" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then exit 1 fi - # @预置条件:创建两个新的cgroup cgcreate -g cpu:"$cgroup1" cgcreate -g cpu:"$cgroup2" @@ -65,10 +65,10 @@ do_test() { expected_ratio=$(echo "2048 / 512" | bc) msg "expected_ratio: $expected_ratio" - assert_true [ "$(echo "$usage_ratio >= $expected_ratio" | bc)" -eq 1 ] - kill -9 $task_pid1 $task_pid2 + assert_true [ "$(echo "$usage_ratio >= $expected_ratio" | bc)" -eq 1 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" index 05ac50c..c813994 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240709-001807-562305058 # @用例名称: cgroup-v1-cpuacct-stat # @用例级别: 3 -# @用例标签: +# @用例标签: cgroup-v1 cpuacct stat # @用例类型: 测试cpuacct.stat统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" index 0736ad0..8456374 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240707-111241-514473309 # @用例名称: cgroup-v1-cpuacct-usage # @用例级别: 3 -# @用例标签: cgroup, cpuacct +# @用例标签: cgroup-v1 cpuacct usage # @用例类型: 测试cpuacct.usage统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,6 +12,8 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### # 创建一个临时目录 @@ -19,6 +21,10 @@ g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件:创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" index b8cfec6..0fdf363 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240708-230226-588399104 # @用例名称: cgroup-v1-cpuacct-usage_all # @用例级别: 3 -# @用例标签: +# @用例标签: cgroup-v1 cpuacct usage_all # @用例类型: 测试cpuacct.usage_all统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index c817c77..c2559cf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240708-202749-391700569 # @用例名称: cgroup-v1-cpuacct-usage_percpu # @用例级别: 3 -# @用例标签: cgroup, cpuacct +# @用例标签: cgroup-v1 cpuacct usage_percpu # @用例类型: 测试cpuacct.usage_percpu统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 @@ -29,29 +35,23 @@ do_test() { # @测试步骤:1: 记录运行任务前的每个CPU使用时间 usage_percpu_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_before: $usage_percpu_before" + usage_percpu_before_first=$(echo "$usage_percpu_before" | awk '{print $1}') # @测试步骤:2: 启动一个CPU密集型任务并将其放入cgroup { for i in {1..10000}; do echo "$i" >/dev/null; done } & - task_pid=$! + taskset -cp 0 $task_pid echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的每CPU使用时间 usage_percpu_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_after: $usage_percpu_after" + usage_percpu_after_first=$(echo "$usage_percpu_after" | awk '{print $1}') # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 - for ((i = 0; i < ${#usage_percpu_before[@]}; i++)); do - # 是否存在某个CPU的使用时间增加,如果有则说明统计数据正确 - if [ "${usage_percpu_after[$i]}" \> "${usage_percpu_before[$i]}" ]; then - assert_true [ true ] - return 0 - fi - done - - msg "per cpu usage did not increase as expected" - return 1 + assert_true [ "$usage_percpu_after_first" -gt "$usage_percpu_before_first" ] + return } tc_teardown() { diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index 7594da7..7bb3827 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240708-225719-108134845 # @用例名称: cgroup-v1-cpuacct-usage_percpu_sys # @用例级别: 3 -# @用例标签: +# @用例标签: cgroup-v1 cpuacct usage_percpu_sys # @用例类型: 测试cpuacct.usage_percpu_sys统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index 7e87c0f..0bebf2c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240708-220905-322684320 # @用例名称: cgroup-v1-cpuacct-usage_percpu_user # @用例级别: 3 -# @用例标签: +# @用例标签: cgroup-v1 cpuacct usage_percpu_user # @用例类型: 测试cpuacct.usage_percpu_user统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 197e437..59e32eb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240708-210528-911301197 # @用例名称: cgroup-v1-cpuacct-usage_sys # @用例级别: 3 -# @用例标签: +# @用例标签: cgourp-v1 cpuacct usage_sys # @用例类型: 测试cpuacct.usage_sys统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" index 0e93427..b76f8f9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240708-214708-138227018 # @用例名称: cgroup-v1-cpuacct-usage_user # @用例级别: 3 -# @用例标签: cgroup, cpuacct +# @用例标签: cgroup-v1 cpuacct usage_user # @用例类型: 测试cpuacct.usage_user统计数据 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -12,12 +12,18 @@ } # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### g_tmpdir="$(mktemp -d)" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" new file mode 100755 index 0000000..400ed6a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240714-215345-717910787 +# @用例名称: cgroup-v1-cpuset-cpu_exclusive +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset cpu_exclusive +# @用例类型: 测试cpu_exclusive控制文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 创建两个新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-cpu_exclusive_1 + cgcreate -g cpuset:cgroup-v1-cpuset-cpu_exclusive_2 + # @预置条件: 设置cpuset.mems文件 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-cpu_exclusive_1 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-cpu_exclusive_2 + # @预置条件: 设置cpuset.cpus文件 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-cpu_exclusive_1 + cgset -r cpuset.cpus=1 cgroup-v1-cpuset-cpu_exclusive_2 + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 设置cpuset.cpu_exclusive文件 + cgset -r cpuset.cpu_exclusive=1 cgroup-v1-cpuset-cpu_exclusive_1 || return 1 + + # @测试步骤:2: 尝试在另一个cgroup中设置包含已独占的CPU + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-cpu_exclusive_2 || msg "设置cpuset.cpus=0失败. 不能绑定已独占的CPU" + + # @预期结果:1: 验证设置cpuset.cpus失败 + tmp=$(cgget -r cpuset.cpus cgroup-v1-cpuset-cpu_exclusive_2 | awk '{print $2}') + assert_true [ "$tmp" != "0" ] + + # @测试步骤:3: 验证进程在独占的CPU上运行 + { + while true; do + : + done + } & + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpu_exclusive_1/cgroup.procs + sleep 3 + + # @测试步骤:4: 检查进程绑定的CPU + cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') + + kill -9 $task_pid + + # @预期结果:2: 验证进程是否只在指定的CPU上运行 + if [ "$cpus_allowed" = "0" ]; then + msg "cgroup1进程绑定到CPU0核心" + assert_true [ true ] + else + msg "cgroup1进程未绑定到CPU0核心" + return 1 # 测试失败 + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-cpu_exclusive_1 + cgdelete -g cpuset:cgroup-v1-cpuset-cpu_exclusive_2 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" new file mode 100755 index 0000000..c1634a4 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" @@ -0,0 +1,74 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240714-134537-428824230 +# @用例名称: cgroup-v1-cpuset-cpus +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset cpus +# @用例类型: 测试cpuset.cpus控制文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuset:"cgroup-v1-cpuset-cpus" + # @预置条件: 设置cpuset.mems文件 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-cpus + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpuset.cpus文件,限制进程只能运行在CPU1上 + cgset -r cpuset.cpus=1 cgroup-v1-cpuset-cpus + + # @测试步骤:2: 启动一个进程并将其放入cgroup + { + while true; do + : + done + } & + + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpus/cgroup.procs + + sleep 3 + + # @测试步骤:3: 检查进程绑定的CPU + cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') + + kill -9 $task_pid + + # @预期结果:1: 验证进程是否只在指定的CPU上运行 + if [ "$cpus_allowed" = "1" ]; then + msg "进程绑定到CPU1核心" + assert_true [ true ] + else + msg "进程未绑定到CPU1核心" + return 1 # 测试失败 + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-cpus + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" new file mode 100755 index 0000000..4673ff6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -0,0 +1,102 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240716-153117-722732954 +# @用例名称: cgroup-v1-cpuset-mem_exclusive +# @用例级别: 3 +# @用例标签: cgroup-v cpuset mem_exclusive +# @用例类型: 测试cpuset.mem_exclusive控制文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + msg "系统NUMA节点数量小于2" + exit 1 + fi + + # @预置条件: 创建两个新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-mem_exclusive_1 + cgcreate -g cpuset:cgroup-v1-cpuset-mem_exclusive_2 + # @预置条件: 设置cpuset.cpus文件 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mem_exclusive_1 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mem_exclusive_2 + # @预置条件: 设置cpuset.mems文件 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-mem_exclusive_1 + cgset -r cpuset.mems=1 cgroup-v1-cpuset-mem_exclusive_2 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpuset.mem_exclusive文件 + cgset -r cpuset.mem_exclusive=1 cgroup-v1-cpuset-mem_exclusive_1 || return 1 + + # @测试步骤:2: 尝试在另一个cgroup设置包含已独占的numa节点 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-mem_exclusive_2 || msg "设置cpuset.mems=0失败. 不能绑定已独占的numa节点" + + # @预期结果:1: 验证设置cpuset.mems失败 + tmp=$(cgget -r cpuset.mems cgroup-v1-cpuset-mem_exclusive_2 | awk '{print $2}') + assert_true [ "$tmp" != "0" ] + + # @测试步骤:3: 验证进程在独占的numa节点上运行 + { + while true; do + : + done + } & + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_exclusive_1/cgroup.procs + sleep 3 + + # @测试步骤:4: 检查进程绑定的NUMA节点 + mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') + + kill -9 $task_pid + + # @预期结果:3: 验证进程是否只在指定的内存节点上运行 + if [ "$mems_allowed" = "0" ]; then + msg "cgroup1进程绑定到NUMA节点0" + assert_true [ true ] + else + msg "cgroup1进程未绑定到NUMA节点0" + return 1 # 测试失败 + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-mem_exclusive_1 + cgdelete -g cpuset:cgroup-v1-cpuset-mem_exclusive_2 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" new file mode 100755 index 0000000..3311bb5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" @@ -0,0 +1,118 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240716-194110-374464054 +# @用例名称: cgroup-v1-cpuset-mem_hardwall +# @用例级别: 3 +# @用例标签: cgroup-v cpuset mem_hardwall +# @用例类型: 测试cpuset.mem_hardwall +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + msg "系统NUMA节点数量小于2" + exit 1 + fi + + # @预置条件: 创建两个新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-mem_hardwall + # @预置条件: 设置cpuset.cpus文件 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mem_hardwall + # @预置条件: 设置cpuset.mems文件 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-mem_hardwall + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 开启mem_hardwall + cgset -r cpuset.mem_hardwall=1 cgroup-v1-cpuset-mem_hardwall || return 1 + + # @测试步骤:2: 获取numa node0和numa node1的空闲内存 + num0_before_free_size=$(numactl -H | grep "node 0 free" | awk '{print $4}') + num1_before_free_size=$(numactl -H | grep "node 1 free" | awk '{print $4}') + msg "num0_before_free_size: $num0_before_free_size" + msg "num1_before_free_size: $num1_before_free_size" + + # @测试步骤:3: 根据获取的numa node0空闲内存运行一个需要大量内存的测试程序,如果空闲内存小于100MB,提示用户numa node0空闲内存不足,不能进行此测试 + if [ "$num0_before_free_size" -lt "100" ]; then + msg "numa node0空闲内存不足100MB, 不能进行cgroup-v1-cpuset-mem_hardwall测试" + exit 1 + fi + + # @测试步骤:4:运行测试程序 + tmp=$((num0_before_free_size / 2)) + vm_bytes="${tmp}M" + { + stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s + } & + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/cgroup.procs + + # @测试步骤:5: 不断检查numa节点的空闲内存并更新最小的空闲内存 + num0_min_free_size=$num0_before_free_size + num1_min_free_size=$num1_before_free_size + while kill -0 $task_pid 2>/dev/null; do + num0_current_free_size=$(numactl -H | grep "node 0 free" | awk '{print $4}') + num1_current_free_size=$(numactl -H | grep "node 1 free" | awk '{print $4}') + + # 更新最小空闲内存值 + if [ "$num0_current_free_size" -lt "$num0_min_free_size" ]; then + num0_min_free_size=$num0_current_free_size + fi + if [ "$num1_current_free_size" -lt "$num1_min_free_size" ]; then + num1_min_free_size=$num1_current_free_size + fi + + sleep 1 + done + + msg "num0_min_free_size: $num0_min_free_size" + msg "num1_min_free_size: $num1_min_free_size" + + # @预期结果:1: 考虑到误差,numa node0被分配的内存至少要大于vm_bytes/2,而numa node1被分配的内存不能超过25MB + num0_diff=$(echo "$num0_before_free_size-$num0_min_free_size" | bc) + num0_expected=$(echo "$tmp * 4 / 5" | bc) + num1_diff=$(echo "$num1_before_free_size-$num1_min_free_size" | bc) + num1_expected=$(echo "25" | bc) + msg "num0_diff: $num0_diff" + msg "num1_diff: $num1_diff" + assert_true [ "$num0_diff" -gt "$num0_expected" ] && [ "$num1_diff" -lt "$num1_expected" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-mem_hardwall + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" new file mode 100755 index 0000000..c08633c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" @@ -0,0 +1,112 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240716-170043-088308720 +# @用例名称: cgroup-v1-cpuset-memory_migrate +# @用例级别: 3 +# @用例标签: cgroup-v cpuset memory_migrate +# @用例类型: 测试memory_migrate控制文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + msg "系统NUMA节点数量小于2" + exit 1 + fi + + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-001" # 测试迁移 + cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-002" # 测试不迁移 + + # @预置条件: 设置cpuset.cpus和cpuset.mems + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_migrate-001 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_migrate-001 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_migrate-002 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_migrate-002 + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 设置memory_migrate控制文件 + cgset -r cpuset.memory_migrate=1 cgroup-v1-cpuset-memory_migrate-001 + cgset -r cpuset.memory_migrate=0 cgroup-v1-cpuset-memory_migrate-002 + + # @测试步骤:2: 启动一个进程并将其放入cgroup + { + while true; do + : + done + } & + task_pid0=$! + echo $task_pid0 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-001/cgroup.procs + msg "task_pid0: $task_pid0" + { + while true; do + : + done + } & + task_pid1=$! + echo $task_pid1 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-002/cgroup.procs + msg "task_pid1: $task_pid1" + + # @测试步骤:3: 修改cpuset.mems + cgset -r cpuset.mems=1 cgroup-v1-cpuset-memory_migrate-001 + cgset -r cpuset.mems=1 cgroup-v1-cpuset-memory_migrate-002 + sleep 3 + + # @测试步骤:4: 检查内存页是否迁移,使用numastat命令 + memory_usage_in_numa0=$(numastat -p $task_pid0 | awk 'END{print $2}') + memory_usage_in_numa1=$(numastat -p $task_pid0 | awk 'END{print $3}') + memory_usage_in_numa2=$(numastat -p $task_pid1 | awk 'END{print $2}') + memory_usage_in_numa3=$(numastat -p $task_pid1 | awk 'END{print $3}') + + kill -9 $task_pid0 + kill -9 $task_pid1 + + # @预期结果:1: 001:进程在numa node1上有内存使用,在numa node0没有内存使用 + assert_true [ "$memory_usage_in_numa0" == "0.00" ] && [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] + + # @于其结果:2: 002: 进程在numa_node2上有内存使用,在numa_node3也有内存使用 + assert_true [ "$(echo "$memory_usage_in_numa2 > 0" | bc)" -eq 1 ] && [ "$(echo "$memory_usage_in_numa3 > 0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-memory_migrate-001 + cgdelete -g cpuset:cgroup-v1-cpuset-memory_migrate-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" new file mode 100755 index 0000000..24aae12 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" @@ -0,0 +1,89 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240716-232544-101349770 +# @用例名称: cgroup-v1-cpuset-memory_pressure +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset memory_pressure +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 启用cpuset.memory_pressure_enabled + cgset -r cpuset.memory_pressure_enabled=1 / + + # @测试步骤:2: 获取numa node0的空闲内存 + # num0_free_size=$(numactl -H | grep "node 0 free" | awk '{print $4}') + num0_free_size=$(free -h | grep "Mem" | awk '{gsub(/i/, ""); print $4}') + msg "num0_free_size: $num0_free_size" + vm_bytes="${num0_free_size}" + + # @测试步骤:3: 模拟内存压力 + { + stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s + + # stress-ng --vm 1 --vm-bytes 3G -t 10s + } & + task_pid=$! + msg "task_pid: $task_pid" + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup.procs + { + stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s + # stress-ng --vm 1 --vm-bytes 3G -t 10s + } & + task_pid2=$! + msg "task_pid: $task_pid2" + echo $task_pid2 >/sys/fs/cgroup/cpuset/cgroup.procs + + sleep 15 # 等待内存压力生效 + + memory_pressure=$(cat /sys/fs/cgroup/cpuset/cpuset.memory_pressure) + msg "memory_pressure: $memory_pressure" + + # @预期结果:1: + assert_true [ "$memory_pressure" -gt "0" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 恢复cpuset.memory_pressure_enabled默认值 + cgset -r cpuset.memory_pressure_enabled=0 / + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" new file mode 100755 index 0000000..3023948 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -0,0 +1,108 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240719-105612-324932394 +# @用例名称: cgroup-v1-cpuset-memory_spread_page +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset memory_spread_page +# @用例类型: 测试不启用cpuset.memory_spread_page +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + msg "系统NUMA节点数量小于2" + exit 1 + fi + + # @预置条件: 创建新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-memory_spread_page-001 + # @预置条件:设置cpuset.mems和cpuset.cpus + cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_spread_page-001 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取numa node0的空闲内存 + num0_free_size=$(free -h | grep "Mem" | awk '{gsub(/i/, ""); print $4}') + msg "num0_free_size: $num0_free_size" + vm_bytes="${num0_free_size}" + + # @测试步骤:2: 获取numa node0和numa node1的FilePages + node0_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') + node1_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') + msg "node0_file_pages: $node0_file_pages" + msg "node1_file_pages: $node1_file_pages" + + # @测试步骤:3: 运行一个需要申请page cache的程序 + { + stress-ng --hdd 1 --hdd-bytes "$vm_bytes" --timeout 10s + } & + task_pid=$! + msg "task_pid: $task_pid" + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/cgroup.procs + + # @测试步骤:4: 不断检查numa节点的FilePages大小 + num0_max_file_pages=$node0_file_pages + num1_max_file_pages=$node1_file_pages + while kill -0 $task_pid 2>/dev/null; do + num0_current_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') + num1_current_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') + + # 更新最大值 + if [ "$(echo "$num0_current_file_pages > $num0_max_file_pages" | bc)" -eq 1 ]; then + num0_max_file_pages=$num0_current_file_pages + fi + if [ "$(echo "$num1_current_file_pages > $num1_max_file_pages" | bc)" -eq 1 ]; then + num1_max_file_pages=$num1_current_file_pages + fi + sleep 1 + done + msg "num0_max_file_pages: $num0_max_file_pages" + msg "num1_max_file_pages: $num1_max_file_pages" + + # @预期结果:1: numa node0要跟原来的FilePages有一定相差,numa node1的跟原来相差不大 + num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) + abs_num0_diff=${num0_diff//-/} + num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) + abs_num1_diff=${num1_diff//-/} + assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff <= 50" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-memory_spread_page-001 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" new file mode 100755 index 0000000..d62703b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -0,0 +1,111 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240719-150059-269990543 +# @用例名称: cgroup-v1-cpuset-memory_spread_page-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset memory_spread_page +# @用例类型: 测试启用cpuset.memory_spread_page +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + msg "系统NUMA节点数量小于2" + exit 1 + fi + + # @预置条件: 创建新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-memory_spread_page-002 + # @预置条件:设置cpuset.mems和cpuset.cpus + cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_spread_page-002 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-002 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启用cpuset.memory_spread_page + cgset -r cpuset.memory_spread_page=1 cgroup-v1-cpuset-memory_spread_page-002 + + # @测试步骤:2: 获取numa node0的空闲内存 + num0_free_size=$(free -h | grep "Mem" | awk '{gsub(/i/, ""); print $4}') + msg "num0_free_size: $num0_free_size" + vm_bytes="${num0_free_size}" + + # @测试步骤:3: 获取numa node0和numa node1的FilePages + node0_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') + node1_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') + msg "node0_file_pages: $node0_file_pages" + msg "node1_file_pages: $node1_file_pages" + + # @测试步骤:4: 运行一个需要申请page cache的程序 + { + stress-ng --hdd 1 --hdd-bytes "$vm_bytes" --timeout 10s + } & + task_pid=$! + msg "task_pid: $task_pid" + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/cgroup.procs + + # @测试步骤:5: 不断检查numa节点的FilePages大小 + num0_max_file_pages=$node0_file_pages + num1_max_file_pages=$node1_file_pages + while kill -0 $task_pid 2>/dev/null; do + num0_current_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') + num1_current_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') + + # 更新最大值 + if [ "$(echo "$num0_current_file_pages > $num0_max_file_pages" | bc)" -eq 1 ]; then + num0_max_file_pages=$num0_current_file_pages + fi + if [ "$(echo "$num1_current_file_pages > $num1_max_file_pages" | bc)" -eq 1 ]; then + num1_max_file_pages=$num1_current_file_pages + fi + sleep 1 + done + msg "num0_max_file_pages: $num0_max_file_pages" + msg "num1_max_file_pages: $num1_max_file_pages" + + # @预期结果:1: numa node0和numa node1的FilePages大小跟原来都相差较大 + num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) + abs_num0_diff=${num0_diff//-/} + num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) + abs_num1_diff=${num1_diff//-/} + assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff > 50" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-memory_spread_page-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" new file mode 100755 index 0000000..8e64037 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" @@ -0,0 +1,92 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240714-191803-023497569 +# @用例名称: cgroup-v1-cpuset-mems +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset mems +# @用例类型: 测试cpuset.mems控制文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件:检查numactl命令是否存在 + if ! command -v numactl &>/dev/null; then + msg "numactl 未安装, 请先安装numactl" + exit 1 + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + msg "系统不支持NUMA" + exit 1 + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + msg "系统NUMA节点数量小于2" + exit 1 + fi + + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuset:"cgroup-v1-cpuset-mems" + # @预置条件: 设置cpuset.cpus文件 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mems + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 设置cpuset.mems文件 + cgset -r cpuset.mems=1 cgroup-v1-cpuset-mems + + # @测试步骤:2: 启动一个进程并将其放入cgroup + { + while true; do + : + done + } & + + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mems/cgroup.procs + + sleep 3 + + # @测试步骤:3: 检查进程绑定的NUMA节点 + mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') + + kill -9 $task_pid + + # @预测结果:1: 验证进程是否只在指定的内存节点上运行 + if [ "$mems_allowed" = "1" ]; then + msg "进程绑定到NUMA节点1" + assert_true [ true ] + else + msg "进程未绑定到NUMA节点1" + return 1 # 测试失败 + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g cpuset:cgroup-v1-cpuset-mems + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" new file mode 100755 index 0000000..a7c5f23 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" @@ -0,0 +1,78 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240719-213044-128698057 +# @用例名称: cgroup-v1-cpuset-sched_load_balance +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset sched_load_balance +# @用例类型: 测试不启用sched_load_balance时,cpuset的调度策略 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-sched_load_balance-001 + # @预置条件: 设置cpuset.cpus文件 + cgset -r cpuset.cpus=0-1 cgroup-v1-cpuset-sched_load_balance-001 + # @预置条件: 设置cpuset.mems文件 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-sched_load_balance-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 禁用负载平衡 + cgset -r cpuset.sched_load_balance=0 / + cgset -r cpuset.sched_load_balance=0 cgroup-v1-cpuset-sched_load_balance-001 + + # @测试步骤:2: 启动一个进程并将其放入cgroup + taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/cgroup.procs + sleep 10 + + # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 + top -b -n 1 1 >"$TMP_FILE" + cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') + cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') + echo "CPU0 user time: $cpu0_user_time" + echo "CPU1 user time: $cpu1_user_time" + + # @预期结果:1: 验证CPU0和CPU1的使用情况 + if [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time < 10.0" | bc)" -eq 1 ]; then + assert_true [ true ] + elif [ "$(echo "$cpu0_user_time < 10.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 50.0" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgset -r cpuset.sched_load_balance=1 / + cgdelete -g cpuset:cgroup-v1-cpuset-sched_load_balance-001 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" new file mode 100755 index 0000000..5f830ce --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" @@ -0,0 +1,76 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240720-103753-359099985 +# @用例名称: cgroup-v1-cpuset-sched_load_balance-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 cpuset sched_load_balance +# @用例类型: 测试启用sched_load_balance时,cpuset的调度策略 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + + # @预置条件: 创建一个新的cgroup + cgcreate -g cpuset:cgroup-v1-cpuset-sched_load_balance-002 + # @预置条件: 设置cpuset.cpus文件 + cgset -r cpuset.cpus=0-1 cgroup-v1-cpuset-sched_load_balance-002 + # @预置条件: 设置cpuset.mems文件 + cgset -r cpuset.mems=0 cgroup-v1-cpuset-sched_load_balance-002 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启用负载平衡 + cgset -r cpuset.sched_load_balance=1 / + cgset -r cpuset.sched_load_balance=1 cgroup-v1-cpuset-sched_load_balance-001 + + # @测试步骤:2: 启动一个进程并将其放入cgroup + taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & + task_pid=$! + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/cgroup.procs + sleep 10 + + # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 + top -b -n 1 1 >"$TMP_FILE" + cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') + cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') + echo "CPU0 user time: $cpu0_user_time" + echo "CPU1 user time: $cpu1_user_time" + + # @预期结果:1: 验证CPU0和CPU1的使用情况 + if [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 80.0" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgset -r cpuset.sched_load_balance=1 / + cgdelete -g cpuset:cgroup-v1-cpuset-sched_load_balance-002 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From 942869449c55171996c24d0e022fc4d419567f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Tue, 23 Jul 2024 10:43:06 +0800 Subject: [PATCH 06/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0blkio=E5=AD=90=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 106 ++++++++++++++++ .../cgroup-v1-blkio-bfq-weight_device.sh" | 116 ++++++++++++++++++ ...roup-v1-blkio-throttle-read_bps_device.sh" | 92 ++++++++++++++ ...oup-v1-blkio-throttle-read_iops_device.sh" | 95 ++++++++++++++ ...oup-v1-blkio-throttle-write_bps_device.sh" | 92 ++++++++++++++ ...up-v1-blkio-throttle-write_iops_device.sh" | 95 ++++++++++++++ .../cgroup-v1-cpuacct-usage_percpu.sh" | 4 +- .../testcase/cgroup-v1-cpuset-cpus.sh" | 2 +- .../cgroup-v1-cpuset-mem_exclusive.sh" | 2 +- .../cgroup-v1-cpuset-mem_hardwall.sh" | 12 +- .../cgroup-v1-cpuset-memory_migrate.sh" | 10 +- .../cgroup-v1-cpuset-memory_pressure.sh" | 8 +- ...group-v1-cpuset-memory_spread_page-001.sh" | 10 +- ...group-v1-cpuset-memory_spread_page-002.sh" | 9 +- ...group-v1-cpuset-sched_load_balance-001.sh" | 7 +- ...group-v1-cpuset-sched_load_balance-002.sh" | 7 +- .../testcase/test.sh" | 80 ++++++++++++ 17 files changed, 713 insertions(+), 34 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" new file mode 100755 index 0000000..e19927a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -0,0 +1,106 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-163304-894253469 +# @用例名称: cgroup-v1-blkio-bfq-weight +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio bfq-weight +# @用例类型: 测试比例权重策略文件blkio.bfq.weight +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" +TMP_FILE2="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 + if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then + echo "CONFIG_IOSCHED_BFQ 配置未开启" + exit 1 + fi + + # @预置条件: 创建两个cgroup组 + cgcreate -g blkio:cgroup-v1-blkio-bfq-weight + cgcreate -g blkio:cgroup-v1-blkio-bfq-weight2 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="sda" + else + msg "disk is /dev/vda" + disk="vda" + fi + + # @测试步骤:2: 保存当前调度器设置 + original_scheduler=$(grep -oP '\[\K[^\]]+' /sys/block/$disk/queue/scheduler) + echo "原始调度器: $original_scheduler" + + # @测试步骤:3: 设置调度器为bfq + echo bfq > /sys/block/$disk/queue/scheduler || return 1 + + + # @测试步骤:4: 设置blkio.bfq.weight + cgset -r blkio.bfq.weight=100 cgroup-v1-blkio-bfq-weight + cgset -r blkio.bfq.weight=500 cgroup-v1-blkio-bfq-weight2 + + # @测试步骤:5: 启动两个dd进程 + sync; echo 3 > /proc/sys/vm/drop_caches + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE" & + task_pid=$! + msg "task_pid: $task_pid" + echo $task_pid > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight/cgroup.procs + + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE2" & + task_pid2=$! + msg "task_pid2: $task_pid2" + echo $task_pid2 > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight2/cgroup.procs + + sleep 15 + + # @测试步骤:5: 获取dd进程的读取速度 + read_bps1=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + msg "read_bps1: $read_bps1" + read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2"| awk '{print $1}') + msg "read_bps2: $read_bps2" + + # @预期结果:1: 400权重的cgroup2带宽要大于100权重的cgroup1 + assert_true [ "$read_bps1" -lt "$read_bps2" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # 恢复调度器设置 + echo "$original_scheduler" > /sys/block/"$disk"/queue/scheduler + cgdelete -g blkio:cgroup-v1-blkio-bfq-weight + cgdelete -g blkio:cgroup-v1-blkio-bfq-weight2 + rm "$TMP_FILE" + rm "$TMP_FILE2" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" new file mode 100755 index 0000000..e5f975b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -0,0 +1,116 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-163338-552003922 +# @用例名称: cgroup-v1-blkio-bfq-weight_device +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio bfq-weight_device +# @用例类型: 测试比例权重策略文件blkio.bfq.weight_device +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" +TMP_FILE2="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 + if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then + echo "CONFIG_IOSCHED_BFQ 配置未开启" + fi + + # @预置条件: 创建cgroup组 + cgcreate -g blkio:cgroup-v1-blkio-bfq-weight_device + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="sda" + disk_device="8:0" + else + msg "disk is /dev/vda" + disk="vda" + disk_device="253:0" + fi + + # @测试步骤:2: 获取光驱设备 + if [[ -e /dev/sr0 ]]; then + msg "disk is /dev/sda" + cd_rom="sr0" + cd_rom_device="11:0" + else + msg "错误信息: 没有光驱设备CD-ROM" + exit 1 + fi + + # @测试步骤:3: 保存当前调度器设置 + original_scheduler1=$(grep -oP '\[\K[^\]]+' /sys/block/$disk/queue/scheduler) + echo "原始调度器1: $original_scheduler1" + original_scheduler2=$(grep -oP '\[\K[^\]]+' /sys/block/$cd_rom/queue/scheduler) + echo "原始调度器2: $original_scheduler2" + + # @测试步骤:4: 设置调度器为bfq + echo bfq > /sys/block/$disk/queue/scheduler || return 1 + echo bfq > /sys/block/$cd_rom/queue/scheduler || return 1 + + # @测试步骤:5: 设置blkio.bfq.weight_device + echo "$disk_device 100" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + echo "$cd_rom_device 500" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + + # @测试步骤:6: 启动两个dd进程 + sync; echo 3 > /proc/sys/vm/drop_caches + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE" & + task_pid=$! + echo $task_pid > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs + + dd iflag=direct if=/dev/$cd_rom of=/dev/null bs=1M count=1024 &> "$TMP_FILE2" & + task_pid2=$! + echo $task_pid2 > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs + + sleep 15 + + # @测试步骤:7: 获取dd进程的读取速度 + read_bps1=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + msg "read_bps1: $read_bps1" + read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2"| awk '{print $1}') + msg "read_bps2: $read_bps2" + + # @预期结果:3: 500权重的设备带宽要大于100权重的设备带宽 + assert_true [ "$read_bps1" -lt "$read_bps2" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # 恢复调度器设置 + echo "$original_scheduler1" > /sys/block/"$disk"/queue/scheduler + echo "$original_scheduler2" > /sys/block/"$cd_rom"/queue/scheduler + cgdelete -r blkio:cgroup-v1-blkio-bfq-weight_device + rm "$TMP_FILE" + rm "$TMP_FILE2" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" new file mode 100755 index 0000000..b7eab67 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -0,0 +1,92 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-144526-288264693 +# @用例名称: cgroup-v1-blkio-throttle-read_bps_device +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio throttle.read_bps_device +# @用例类型: 测试节流策略文件blkio.throttle.read_bps_device +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_CGROUP 配置未开启" + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 + if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" + exit 1 + fi + + # @预置条件:创建cgroup组 + cgcreate -g blkio:cgroup-v1-blkio-throttle-read_bps_device + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置blkio.throttle.read_bps_device,限制速度为1MB/s + echo "$device_number 1048576" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device + + # @测试步骤:3: 启动一个dd进程 + echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/cgroup.procs + dd iflag=direct if=$disk of=/dev/null bs=1M count=5 2>&1 | tee "$TMP_FILE" + + # @测试步骤:4: 获取dd进程的读取速度 + read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + msg "read_bps: $read_bps" + up_read_bps=1.2 + down_read_bps=0.8 + + # @预期结果:1: 如果读取速率在1MB/s左右,说明限速成功 + if [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ] && [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g blkio:cgroup-v1-blkio-throttle-read_bps_device + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" new file mode 100755 index 0000000..517aa5b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -0,0 +1,95 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-144536-700486958 +# @用例名称: cgroup-v1-blkio-throttle-read_iops_device +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio throttle.read_iops_device +# @用例类型: 测试节流策略文件blkio.throttle.read_iops_device +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_CGROUP 配置未开启" + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 + if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" + exit 1 + fi + + # @预置条件: 创建cgroup组 + cgcreate -g blkio:cgroup-v1-blkio-throttle-read_iops_device + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置blkio.throttle.read_iops_device,限制速度为100 IO/s + echo "$device_number 100" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device + + # @测试步骤:3: 启动一个fio进程 + echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/cgroup.procs + dd iflag=direct if=$disk of=/dev/null bs=4k count=500 2>&1 | tee "$TMP_FILE" + time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") + msg "time: $time" + + # @测试步骤:4: 获取fio进程 的读取速度 + read_iops=$(grep "$device_number Read" /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.io_serviced | awk '{print $3}') + read_iops_per_second=$(echo "scale=2; $read_iops / $time" | bc) + msg "read_iops: $read_iops_per_second" + up_read_iops=110 + down_read_iops=90 + + # @预期结果:1: 如果读取速率在100 IO/s左右,说明限速成功 + if [ "$(echo "$read_iops_per_second > $down_read_iops" | bc)" -eq 1 ] && [ "$(echo "$read_iops_per_second < $up_read_iops" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g blkio:cgroup-v1-blkio-throttle-read_iops_device + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" new file mode 100755 index 0000000..f3f32a5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -0,0 +1,92 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-144529-920054873 +# @用例名称: cgroup-v1-blkio-throttle-write_bps_device +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio throttle.write_bps_device +# @用例类型: 测试节流策略文件blkio.throttle.write_bps_device +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_CGROUP 配置未开启" + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 + if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" + exit 1 + fi + + # @预置条件: 创建cgroup组 + cgcreate -g blkio:cgroup-v1-blkio-throttle-write_bps_device + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置blkio.throttle.write_bps_device,限制速度为1MB/s + echo "$device_number 1048576" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device + + # @测试步骤:3: 启动一个dd进程 + echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/cgroup.procs + dd if=$disk of=/tmp/testfile bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" + + # @测试步骤:4: 获取dd进程的写入速度 + write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + msg "write_bps: $write_bps" + up_write_bps=1.2 + down_write_bps=0.8 + + # @预期结果:1: 如果写入速率在1MB/s左右,说明限速成功 + if [ "$(echo "$write_bps > $down_write_bps" | bc)" -eq 1 ] && [ "$(echo "$write_bps < $up_write_bps" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g blkio:cgroup-v1-blkio-throttle-write_bps_device + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" new file mode 100755 index 0000000..f7815d4 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -0,0 +1,95 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-144539-871526222 +# @用例名称: cgroup-v1-blkio-throttle-write_iops_device +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio throttle.write_iops_device +# @用例类型: 测试节流策略文件blkio.throttle.write_iops_device +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_CGROUP 配置未开启" + exit 1 + fi + # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 + if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then + echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" + exit 1 + fi + + # @预置条件: 创建cgroup组 + cgcreate -g blkio:cgroup-v1-blkio-throttle-write_iops_device + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置blkio.throttle.write_iops_device,限制速度为100 IO/s + echo "$device_number 100" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device + + # @测试步骤:3: 启动一个dd进程 + echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/cgroup.procs + dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" + time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") + msg "time: $time" + + # @测试步骤:4: 获取fio进程的写入速度 + write_iops=$(grep "$device_number Write" /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.io_serviced | awk '{print $3}') + write_iops_per_second=$(echo "scale=2; $write_iops / $time" | bc) + msg "write_iops_per_second: $write_iops_per_second" + up_write_iops=110 + down_write_iops=90 + + # @预期结果:1: 如果写入速率在100 IO/s左右,说明限速成功 + if [ "$(echo "$write_iops_per_second > $down_write_iops" | bc)" -eq 1 ] && [ "$(echo "$write_iops_per_second < $up_write_iops" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g blkio:cgroup-v1-blkio-throttle-write_iops_device + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index c2559cf..954fc25 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -38,7 +38,7 @@ do_test() { usage_percpu_before_first=$(echo "$usage_percpu_before" | awk '{print $1}') # @测试步骤:2: 启动一个CPU密集型任务并将其放入cgroup { - for i in {1..10000}; do echo "$i" >/dev/null; done + for i in {1..10000}; do echo "$i" >/dev/null; done } & task_pid=$! taskset -cp 0 $task_pid @@ -51,7 +51,7 @@ do_test() { usage_percpu_after_first=$(echo "$usage_percpu_after" | awk '{print $1}') # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 assert_true [ "$usage_percpu_after_first" -gt "$usage_percpu_before_first" ] - return + return } tc_teardown() { diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" index c1634a4..4a8ffc2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" @@ -52,7 +52,7 @@ do_test() { kill -9 $task_pid # @预期结果:1: 验证进程是否只在指定的CPU上运行 - if [ "$cpus_allowed" = "1" ]; then + if [ "$cpus_allowed" = "1" ]; then msg "进程绑定到CPU1核心" assert_true [ true ] else diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" index 4673ff6..c3563d1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -61,7 +61,7 @@ do_test() { # @预期结果:1: 验证设置cpuset.mems失败 tmp=$(cgget -r cpuset.mems cgroup-v1-cpuset-mem_exclusive_2 | awk '{print $2}') - assert_true [ "$tmp" != "0" ] + assert_true [ "$tmp" != "0" ] # @测试步骤:3: 验证进程在独占的numa节点上运行 { diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" index 3311bb5..ff19d27 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" @@ -68,11 +68,11 @@ do_test() { # @测试步骤:4:运行测试程序 tmp=$((num0_before_free_size / 2)) vm_bytes="${tmp}M" - { - stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s + { + stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/cgroup.procs + echo $task_pid > /sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/cgroup.procs # @测试步骤:5: 不断检查numa节点的空闲内存并更新最小的空闲内存 num0_min_free_size=$num0_before_free_size @@ -82,16 +82,16 @@ do_test() { num1_current_free_size=$(numactl -H | grep "node 1 free" | awk '{print $4}') # 更新最小空闲内存值 - if [ "$num0_current_free_size" -lt "$num0_min_free_size" ]; then + if [ "$num0_current_free_size" -lt "$num0_min_free_size" ]; then num0_min_free_size=$num0_current_free_size fi if [ "$num1_current_free_size" -lt "$num1_min_free_size" ]; then num1_min_free_size=$num1_current_free_size fi - sleep 1 + sleep 1 done - + msg "num0_min_free_size: $num0_min_free_size" msg "num1_min_free_size: $num1_min_free_size" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" index c08633c..f99b934 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" @@ -38,7 +38,7 @@ tc_setup() { msg "系统NUMA节点数量小于2" exit 1 fi - + # @预置条件: 创建一个新的cgroup cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-001" # 测试迁移 cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-002" # 测试不迁移 @@ -83,10 +83,10 @@ do_test() { sleep 3 # @测试步骤:4: 检查内存页是否迁移,使用numastat命令 - memory_usage_in_numa0=$(numastat -p $task_pid0 | awk 'END{print $2}') - memory_usage_in_numa1=$(numastat -p $task_pid0 | awk 'END{print $3}') - memory_usage_in_numa2=$(numastat -p $task_pid1 | awk 'END{print $2}') - memory_usage_in_numa3=$(numastat -p $task_pid1 | awk 'END{print $3}') + memory_usage_in_numa0=$( numastat -p $task_pid0 | awk 'END{print $2}' ) + memory_usage_in_numa1=$( numastat -p $task_pid0 | awk 'END{print $3}' ) + memory_usage_in_numa2=$( numastat -p $task_pid1 | awk 'END{print $2}' ) + memory_usage_in_numa3=$( numastat -p $task_pid1 | awk 'END{print $3}' ) kill -9 $task_pid0 kill -9 $task_pid1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" index 24aae12..3dd0fa1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" @@ -52,19 +52,19 @@ do_test() { # @测试步骤:3: 模拟内存压力 { stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s - + # stress-ng --vm 1 --vm-bytes 3G -t 10s } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup.procs + echo $task_pid > /sys/fs/cgroup/cpuset/cgroup.procs { stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s # stress-ng --vm 1 --vm-bytes 3G -t 10s } & task_pid2=$! msg "task_pid: $task_pid2" - echo $task_pid2 >/sys/fs/cgroup/cpuset/cgroup.procs + echo $task_pid2 > /sys/fs/cgroup/cpuset/cgroup.procs sleep 15 # 等待内存压力生效 @@ -72,7 +72,7 @@ do_test() { msg "memory_pressure: $memory_pressure" # @预期结果:1: - assert_true [ "$memory_pressure" -gt "0" ] + assert_true [ "$memory_pressure" -gt "0" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index 3023948..fa76810 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -66,8 +66,8 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/cgroup.procs - + echo $task_pid > /sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/cgroup.procs + # @测试步骤:4: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages num1_max_file_pages=$node1_file_pages @@ -86,12 +86,12 @@ do_test() { done msg "num0_max_file_pages: $num0_max_file_pages" msg "num1_max_file_pages: $num1_max_file_pages" - + # @预期结果:1: numa node0要跟原来的FilePages有一定相差,numa node1的跟原来相差不大 num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) - abs_num0_diff=${num0_diff//-/} + abs_num0_diff=${num0_diff//-/} num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) - abs_num1_diff=${num1_diff//-/} + abs_num1_diff=${num1_diff//-/} assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff <= 50" | bc)" -eq 1 ] return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index d62703b..07b39b6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -43,7 +43,7 @@ tc_setup() { cgcreate -g cpuset:cgroup-v1-cpuset-memory_spread_page-002 # @预置条件:设置cpuset.mems和cpuset.cpus cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_spread_page-002 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-002 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-002 return 0 } @@ -69,7 +69,7 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/cgroup.procs + echo $task_pid > /sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/cgroup.procs # @测试步骤:5: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages @@ -92,11 +92,12 @@ do_test() { # @预期结果:1: numa node0和numa node1的FilePages大小跟原来都相差较大 num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) - abs_num0_diff=${num0_diff//-/} + abs_num0_diff=${num0_diff//-/} num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) - abs_num1_diff=${num1_diff//-/} + abs_num1_diff=${num1_diff//-/} assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff > 50" | bc)" -eq 1 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" index a7c5f23..d2cf0f2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" @@ -47,16 +47,17 @@ do_test() { sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 - top -b -n 1 1 >"$TMP_FILE" + top -b -n 1 1 > "$TMP_FILE" cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') echo "CPU0 user time: $cpu0_user_time" echo "CPU1 user time: $cpu1_user_time" + # @预期结果:1: 验证CPU0和CPU1的使用情况 - if [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time < 10.0" | bc)" -eq 1 ]; then + if [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time < 10.0" | bc)" -eq 1 ]; then assert_true [ true ] - elif [ "$(echo "$cpu0_user_time < 10.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 50.0" | bc)" -eq 1 ]; then + elif [ "$(echo "$cpu0_user_time < 10.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 50.0" | bc)" -eq 1 ]; then assert_true [ true ] else assert_false [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" index 5f830ce..d17695b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" @@ -19,7 +19,7 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 TMP_FILE="$(mktemp)" tc_setup() { - msg "this is tc_setup" + msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then exit 1 @@ -47,14 +47,15 @@ do_test() { sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 - top -b -n 1 1 >"$TMP_FILE" + top -b -n 1 1 > "$TMP_FILE" cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') echo "CPU0 user time: $cpu0_user_time" echo "CPU1 user time: $cpu1_user_time" + # @预期结果:1: 验证CPU0和CPU1的使用情况 - if [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 80.0" | bc)" -eq 1 ]; then + if [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 80.0" | bc)" -eq 1 ]; then assert_true [ true ] else assert_false [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" new file mode 100755 index 0000000..9d13552 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" @@ -0,0 +1,80 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240721-163304-894253469 +# @用例名称: cgroup-v1-blkio-bfq-weight +# @用例级别: 3 +# @用例标签: cgroup-v1 blkio bfq-weight +# @用例类型: 测试比例权重策略文件blkio.bfq.weight +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + exit 1 + fi + + # @预置条件: 创建两个cgroup组 + cgcreate -g blkio:test01 + cgcreate -g blkio:test02 + return 0 +} + +do_test() { + msg "this is do_test" + + mkdir -p /mnt/testdir + dd if=/dev/zero of=/mnt/testdir/testfile1 bs=1M count=512 + dd if=/dev/zero of=/mnt/testdir/testfile2 bs=1M count=512 + + # @测试步骤:1: 设置blkio.bfq.weight + cgset -r blkio.bfq.weight=500 test/test01 + cgset -r blkio.bfq.weight=1000 test/test02 + + # @测试步骤:2: 启动两个dd进程 + sync + echo 3 > /proc/sys/vm/drop_caches + dd if=/mnt/testdir/testfile1 of=/dev/null bs=1M iflag=direct & + task_pid=$! + msg "task_pid: $task_pid" + echo $task_pid > /sys/fs/cgroup/blkio/test/test01/cgroup.procs + + dd if=/mnt/testdir/testfile2 of=/dev/null bs=1M iflag=direct & + task_pid2=$! + msg "task_pid2: $task_pid2" + echo $task_pid2 > /sys/fs/cgroup/blkio/test/test02/cgroup.procs + + sleep 10 + + + # @测试步骤:3: + # @预期结果:3: + assert_true [ 1 -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + cgdelete -g blkio:test01 + cgdelete -g blkio:test02 + # cgdelete -g blkio:test + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From d5974031ce8ce8f64c34c70e6a2684f76c699fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Tue, 23 Jul 2024 20:43:22 +0800 Subject: [PATCH 07/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0memory=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cgroup-v1-memory-limit_in_bytes.sh" | 86 +++++++++++++++++ .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 88 ++++++++++++++++++ .../cgroup-v1-memory-oom_control-001.sh" | 66 +++++++++++++ .../cgroup-v1-memory-oom_control-002.sh" | 77 +++++++++++++++ .../cgroup-v1-memory-pressure_level.sh" | 79 ++++++++++++++++ .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 83 +++++++++++++++++ .../cgroup-v1-memory-swappiness-001.sh" | 76 +++++++++++++++ .../cgroup-v1-memory-swappiness-002.sh" | 75 +++++++++++++++ .../tst_lib/cgroup_event_listener" | Bin 0 -> 16624 bytes .../tst_lib/cgroup_event_listener.c" | 83 +++++++++++++++++ .../tst_lib/other_common.sh" | 68 +++++++++++++- .../tst_lib/ts_common.sh" | 31 +++++- 12 files changed, 810 insertions(+), 2 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" new file mode 100755 index 0000000..c9bf6e1 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-110114-444553088 +# @用例名称: cgroup-v1-memory-limit_in_bytes +# @用例级别: 3 +# @用例标签: cgroup-v1 memory limit_in_bytes +# @用例类型: 测试memory.limit_in_bytes控制文件以及memory.max_usage_in_bytes,memory.failcnt统计文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-limit_in_bytes + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间并设置cgroup的内存限制为50M + swapoff -a + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-limit_in_bytes + + # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + + # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.limit_in_bytes的次数 + max_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.max_usage_in_bytes) + msg "max_usage_in_bytes: $max_usage_in_bytes" + failcnt=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.failcnt) + msg "failcnt: $failcnt" + + + # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 + oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.oom_control) + oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') + msg "oom_kill: $oom_kill" + + # @预期结果:1: 最大内存使用量等于50M且oom_kill大于0 + if [ "$max_usage_in_bytes" -eq "52428800" ] && [ "$oom_kill" -gt "0" ]; then + # @预期结果:2: 内存达到memory.limit_in_bytes的次数大于0 + if [ "$failcnt" -gt "0" ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 开启系统的交换空间 + swapon -a + # @清理工作: 清空所有内存页 + cgset -r memory.force_empty=0 cgroup-v1-memory-limit_in_bytes + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-limit_in_bytes + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" new file mode 100755 index 0000000..64b35bb --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -0,0 +1,88 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-131832-170355139 +# @用例名称: cgroup-v1-memory-memsw-limit_in_bytes +# @用例级别: 3 +# @用例标签: cgroup-v1 memory memsw limit_in_bytes +# @用例类型: 测试memory.memsw.limit_in_bytes控制文件以及memory.memsw.max_usage_in_bytes, memory.memsw.failcnt统计文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_SWAP配置 + if ! grep -q CONFIG_SWAP=y /boot/config-"$(uname -r)"; then + echo "CONFIG_SWAP 配置未开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-memsw-limit_in_bytes + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cgroup的内存和交换空间限制为50M + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes + cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes + + # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + + # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.memsw.limit_in_bytes的次数 + max_memsw_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.max_usage_in_bytes) + msg "max_usage_in_bytes: $max_memsw_usage_in_bytes" + memsw_failcnt=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.failcnt) + msg "failcnt: $memsw_failcnt" + + # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 + oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.oom_control) + oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') + msg "oom_kill: $oom_kill" + + # @预期结果:1: 最大内存使用量等于50M且oom_kill大于0 + if [ "$max_memsw_usage_in_bytes" -eq "52428800" ] && [ "$oom_kill" -gt "0" ]; then + # @预期结果:2: 内存达到memory.memsw.limit_in_bytes的次数大于0 + if [ "$memsw_failcnt" -gt "0" ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清空所有内存页 + cgser -r memory.force_empty=0 cgroup-v1-memory-memsw-limit_in_bytes + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-memsw-limit_in_bytes + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" new file mode 100755 index 0000000..fce00d1 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" @@ -0,0 +1,66 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-201026-919111329 +# @用例名称: cgroup-v1-memory-oom_control-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 memory oom_control +# @用例类型: 测试默认启用oom_control +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-oom_control-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置内存限制 + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 + cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 + + # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + + # @测试步骤:3: 获取被oom_killer杀死的进程数 + oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/memory.oom_control) + oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') + msg "oom_kill: $oom_kill" + + # @预期结果:1: 被oom_killer杀死的进程数大于0 + assert_true [ "$oom_kill" -gt "0" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete memory:cgroup-v1-memory-oom_control-001 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" new file mode 100755 index 0000000..cfeb189 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" @@ -0,0 +1,77 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-201033-714742346 +# @用例名称: cgroup-v1-memory-oom_control-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 memory oom_control +# @用例类型: 测试禁用oom_control +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-oom_control-002 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 禁用oom_control + echo 1 > /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control + + # @测试步骤:2: 设置内存限制 + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 + cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 + + # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s &> "$TMP_FILE" + time=$(grep -oP '(?<=completed in )\d+\.\d+(?=s)' "$TMP_FILE") + msg "time: $time" + + # @测试步骤:4: 获取被oom_killer杀死的进程数 + oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control) + oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') + msg "oom_kill: $oom_kill" + + # @预期结果:1: 被oom_killer杀死的进程数等于0,进程会在内存紧张时睡眠直到内存充足时被唤醒,所以进程运行时间远大于5s + if [ "$oom_kill" -eq "0" ] && [ "$(echo "$time > 6" | bc)" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-oom_control-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" new file mode 100755 index 0000000..17a488b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" @@ -0,0 +1,79 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-193002-248259812 +# @用例名称: cgroup-v1-memory-pressure_level +# @用例级别: 3 +# @用例标签: cgroup-v1 memory pressure_level +# @用例类型: 测试memory.pressure_level控制文件,设置内存压力通知 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + # @预置条件: 检查是否没有开启CONFIG_PREEMPT_RT配置 + if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then + echo "CONFIG_PREEMPT_RT 配置开启" + exit 1 + fi + + # @预置条件: 新建一个cgroup + cgcreate -g memory:cgroup-v1-memory-pressure_level + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 在后台运行监听器 + "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &> "$TMP_FILE" & + + # @测试步骤:2: 设置内存限制 + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-pressure_level + cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-pressure_level + + # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M -t 1s + + # @预期结果:1: 临时文件应该非空,有内存压力通知 + if [ -s "$TMP_FILE" ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清空所有内存页 + cgset -r memory.force_empty=0 cgroup-v1-memory-pressure_level + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-pressure_level + # @清理工作:删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" new file mode 100755 index 0000000..6ef3683 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -0,0 +1,83 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-133429-048617311 +# @用例名称: cgroup-v1-memory-soft_limit_in_bytes +# @用例级别: 3 +# @用例标签: cgroup-v1 memory soft_limit_in_bytes +# @用例类型: 测试memory.soft_limit_in_bytes控制文件以及memory.max_usage_in_bytes, memory.failcnt统计文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + # @预置条件: 检查是否没有CONFIG_PREEMPT_RT配置 + if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then + echo "CONFIG_PREEMPT_RT 配置开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-soft_limit_in_bytes + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间并设置cgroup的内存限制为50M + swapoff -a + cgset -r memory.soft_limit_in_bytes=50M cgroup-v1-memory-soft_limit_in_bytes + + # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/cgroup.procs + stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s + + # @测试步骤:3: 获取cgroup的最大内存使用量 + max_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.max_usage_in_bytes) + msg "max_usage_in_bytes: $max_usage_in_bytes" + + # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 + oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.oom_control) + oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') + msg "oom_kill: $oom_kill" + + # @预期结果:1: 最大内存使用量超过了50M且oom_kill等于0 + if [ "$max_usage_in_bytes" -gt "52428800" ] && [ "$oom_kill" -eq "0" ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 开启系统的交换空间 + swapon -a + # @清理工作: 清空所有内存页 + cgset -r memory.force_empty=0 cgroup-v1-memory-soft_limit_in_bytes + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-soft_limit_in_bytes + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" new file mode 100755 index 0000000..74d76af --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" @@ -0,0 +1,76 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-142731-893019797 +# @用例名称: cgroup-v1-memory-swappiness-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 memory swappiness +# @用例类型: 测试memory.swappiness控制文件,当swappiness为0时,内存不会被交换到swap空间 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-swappiness-001 + # @预置条件: 清空swap空间内存 + sudo swapoff -a + sudo swapon -a + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cgroup的内存限制为50M + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-swappiness-001 + + # @测试步骤:2: 设置cgroup的内存swappiness为0 + cgset -r memory.swappiness=0 cgroup-v1-memory-swappiness-001 + + # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/cgroup.procs + stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s + + # @测试步骤:4: 获取swap空间内存使用量 + swap_usage=$(grep swap /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/memory.stat | head -n 1 | awk '{print $2}') + msg "swap_usage: $swap_usage" + + # @预期结果:1: swap空间内存使用量为0 + assert_true [ "$swap_usage" -eq "0" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清空所有内存页 + cgset -r memory.force_empty=0 cgroup-v1-memory-swappiness-001 + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-swappiness-001 + # @清理工作: 清理swap空间 + sudo swapoff -a + sudo swapon -a + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" new file mode 100755 index 0000000..e7123e1 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" @@ -0,0 +1,75 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-162157-535660907 +# @用例名称: cgroup-v1-memory-swappiness-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 memory swappiness +# @用例类型: 测试memory.swappiness控制文件,当swappiness为100时,内存会被交换到swap空间 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + echo "CONFIG_MEMCG 配置未开启" + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:cgroup-v1-memory-swappiness-002 + # @预置条件: 清空swap空间内存 + sudo swapoff -a + sudo swapon -a + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cgroup的内存限制为50M + cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-swappiness-002 + + # @测试步骤:2: 设置cgroup的内存swappiness为100 + cgset -r memory.swappiness=100 cgroup-v1-memory-swappiness-002 + + # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 + echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/cgroup.procs + stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s + + # @测试步骤:4: 获取swap空间内存使用量 + swap_usage=$(grep swap /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/memory.stat | head -n 1 | awk '{print $2}') + msg "swap_usage: $swap_usage" + + # @预期结果:1: swap空间内存使用量大于0 + assert_true [ "$swap_usage" -gt "0" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清空所有内存页 + cgset -r memory.force_empty=0 cgroup-v1-memory-swappiness-002 + # @清理工作: 删除cgroup + cgdelete -g memory:cgroup-v1-memory-swappiness-002 + # @清理工作: 清理swap空间 + sudo swapoff -a + sudo swapon -a + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener" new file mode 100755 index 0000000000000000000000000000000000000000..5345e91f78af2f907a23e5b47ca46a81e1f658c4 GIT binary patch literal 16624 zcmeHOeQ;I972lVD1O*Zl6tTcX#o=S}NH8FNL=r;a#_|y{8MV{)a+7zHyzza+`|iVF z9Sx0XeG}4&ZEZXKn9)BvI%Dh5PMv}?V2~=M3?O0Q{G8Ub|vWs@K$oQ_1iunK712 zgCF*(OETk+$hTW70>oCZ4RZQ{GWf_^uvqC&XnKv#Iae+53T#~__Wv0qYRcC zbx;Na+T$*QJjT%u$|!&AhM2;Tp0wVIBMl0*kU&GbKqL`>9|K$~kW@?)kYaY`2H;qm zV)9P};L!lQBLLqKfZq^+-xPqO|BID#3~&v8{_uGKipjSI;3EOJ9)SN1a1DO`5CY&v zKZv|xboQA>S2SV9qK{g_w#fOrB>DPirj5>8h{BzvudNI7;4h-KR%mFTsjkb+DfC<93(jaahNbfU=w0AQ%|A)~YB zA!Xj|?6guTfqCHIStB-WZdu=CtP0=e#_HVIs_<$zerugDTH3Z45zDr^qbbL-+qN{t zk_oHL?1*6{y5q?N728mvMFqhnWiX0D@WX#oh$@cJsWKhi7XpcI1I2!T;ksyaCXVvw zAdc7^$xjh45}%$Qg*Q&Qc$xU0J^d{hmSy4)@EG{H&(B+Njlx^$xz6|~b)t#}mCiWx zr`9PP$2_(@htnRMpFNm1=D}yNFwk)iPDPQa6CNC&FC2CdJ`DixbEwCI<8zBcuLqa! zTT1Bj;Oe=h68b$j=E31956-^8v=I+ZuX?HS9S?pb8v**P2fxaLzu>`Vc<{X*92(vY z`#gB1i^4@10@gq&phzg%7y3kfwL9* z(A0NU!gOVD)G5oK&Y)8%m@kjvid z@;Cv=WgA@{U;Mdjt;^#JKbKwX^7x|9WoNrQPMC7p5c5#`<6*4*1|jPY{1P9(z{k(^ z@iTq=R3Cq#y3qb7KK=tAf5ylE-p9Y~M8~F`plcKx4i!bpi09FMzI_Kk8>6fkce7gPy+oEKcCULFM!(TAoiSt|2ro~Ru?GI$C=3`Yjvbz`R~HXt?2otwZP z--TYMXI_KYuVn0vS8>?vgP$1t^a9u)8btg0z$gqxaS(Amb3~KX#jmZa6o!G zjV1WQB(*tM0@s68`cTc#FnVg}8Pvi&fwW}KHD->=>b?XP4&q$gE$Y|*8BpCllQP=` zqGS@?IZv{!A$@ola~T@Mn(CRiAnAjDu+ahKLs|U$Cs}NlCWgnPI+pkqe8wpo%iMyo zjb&qLusb9MCZ<$AIe~)1Qy8)-ANUw9h*3>GA~On0qyhfv_;7rpt85>L+uk0eZ?F(N}TS$?BHT!%Y7`Ry$$|3 z%+=d+(0JaF0Nn%h&Z=D0aQF>ml|2q)VkCP62lw;9zj;_bo8`OAeS1MAN}=R|k_Sp2 zD0!gdfszMG9w>RBzyl%rs^6Y6yRAF4&Tc!I?lt7@4{QvELUR(B>7 zj-8BEcSU2?-P&EI-JQByEJ=wbGm%I-8g3S8z%EIxREEOJ5UF9ttzb!Wl9W+lx)x1A zQc{Cmo^IZNTDnZbZ7M4wmP9oCpAwCBcRCKcQz;GhrJ{-M0yQd$-0=#^hl`7QV_KJ; zjBC8xRkZryPS{0rwEB821v_fVuBEn>O2?dK(vNLD7S%;dSymh?p!JwLEzP##$(>dN z*7-6N^9L3j-KO@)qOh%{nTcImJZW3tLZ~XVhng+<&5(0-sVAU~eZw*r0eTs}Vv6a(++gdW{4LVZ=C8)i(a7=fi4;&{el9_ZYH zf*YpEZH${Ciunl0LvA?Ds@gbf-aVC9JyOvx*3G|T`K>q0?MKwdJy2Y;NJZ3vfVcy{ z6M&B+KmqgG1HY#szt`})Q1h&+uaq^-yrO)6ITVScN~Gk0k_Sp2D0!gdfszMG9w>RB zwMm%4!g3pcNJQ@S1 ze{wOOM1C(F0^_q+Cn&;au1--pd`_2PHWd`M0A!d)6wh&b1E~p}&M)yKrd?&;F9HB73ks#pzNLmKTzLk1GCm z;<+AV{=Y`}e74_U4YhXz(N>~6i1rfgCptp(S)zN1juJgV^fb|NqJj>YRe2Aa`3rLy zzM?@TZfa_}LtEP3kxn>it+qB?7p|$UO-r`+@l~tBHFe7fzKk(Q!fr7|oWniCf`ILe zXDs(nLuizW!>5=$_JcA}C0c!lFb~&U^H>1>HNdOD4!0Ludj{ppW($69GXA{)J1+&`ZwBD+2H?L9z&{GW%fS!D{J9_i z4+D<%_51Bkz%{OZvn1NHZR5izp)5j z4$qyd%iwLy&rO!OuhVvF!$~+;ZgxZs$LtmWq?~kD7kvM_bO_yW;zlPPLr;NZBx!WV zk{xEuh&V|*Wtizc(V2|*#w-WE{M8hfz_a;L!?bO4mjPcf?OmeFhGY3gBpr|M0u>Ku zfTU9(8uWqEFj}`ax3xWJY;51!)Yh_Xt6|9eH*Rm-(rh$u-C)2O`3(b3kPw(UDeBarBHw{nmU+(BW z-Y+N+mLF>i5W|X?jwz(8==MQjy6>8Sn^-6BCAcgWg>NhrfOHq404ul`QILWkiVFZ} zdMKZ|eE^Oqyoz8%Qc0u7OhoXSLd!OgibNAe8b0G<;R@|oi3sR-q*7!{e&)r`=mlcx z191UFU#wm1HZTJhB)F;Z=0wr!5QW!6Ty@!I*xQ5%r*_31vjeDOE84>`xcFh&y&?=B zt*vl(A|39vp{%yE%L8?!qi|^|8X>50eM>bCCMn)yrg}s;vMT{uDC*cMWv6AQ@cxJt zBgTL<+lrZ}K(XGKBf_$nVTgvilfYsmWp#?MWAy=xqYI>yvIB*!9vV+Q5wOObvY`f+ z(%?8`WyYgmOsPY|h%k(3+-~3p#eYU|UJtJfm|LjezyHYddPn zP!8i;uH{rCOwyT3Q^`-3r@M|t&m9>-K;L85;B`vLzH=Hgs_Uav6a{CU0N zFTV-;xK?3(Ue7R{K<7fhGGdhVd0i0&45yx~&+8+mydDA(8OR*7;$ev4T7&g@eZh1& zNpksFj_Ko&j%yd@dHuq)mGu4PCs+(a1bxc-J5Ue;(^1Ls-N4E9$Mq=cuO~TPpE2e2 z9F`w_=J(%ofT2&ge(rme-lx271rZti?f-p1z4{vIG4*$NeoZrd-mg#V9gWvNDqHt2 z>oMKy)2|^trsJ-rim)Ej{XTt-CRI#d^i`Pk*sNL)T=E~!W0~@I0haff6R%VL-2Or% zNuobS=XwISA4A6>f+DQX>jS2BEJ)O!|L=VIV~dp_(;xZt{rR7P^jYx3F^GY`ckumO zzdZ9y&w)-Q{8*pAhqP9swM+d~ahG`3zW@o?cUhm;O?=;)?^V;Va{E8GM#o+5tjm79)AAf`k%}0)vs8sxaqz`&X;9zxcWq7((JWL LV!lto$BKUegRH{a literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" new file mode 100644 index 0000000..461b0a5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * cgroup_event_listener.c - Simple listener of cgroup events + * + * Copyright (C) Kirill A. Shutemov + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define USAGE_STR "Usage: cgroup_event_listener " + +int main(int argc, char **argv) +{ + int efd = -1; + int cfd = -1; + int event_control = -1; + char event_control_path[4096]; + char line[256]; + int ret; + + if (argc != 3) + errx(1, "%s", USAGE_STR); + + cfd = open(argv[1], O_RDONLY); + if (cfd == -1) + err(1, "Cannot open %s", argv[1]); + + ret = snprintf(event_control_path, 4096, "%s/cgroup.event_control", + dirname(argv[1])); + if (ret >= 256) + errx(1, "Path to cgroup.event_control is too long"); + + event_control = open(event_control_path, O_WRONLY); + if (event_control == -1) + err(1, "Cannot open %s", event_control_path); + + efd = eventfd(0, 0); + if (efd == -1) + err(1, "eventfd() failed"); + + ret = snprintf(line, 63, "%d %d %s", efd, cfd, argv[2]); + if (ret >= 256) + errx(1, "Arguments string is too long"); + + ret = write(event_control, line, strlen(line) + 1); + if (ret == -1) + err(1, "Cannot write to cgroup.event_control"); + + while (1) { + uint64_t result; + + ret = read(efd, &result, sizeof(result)); + if (ret == -1) { + if (errno == EINTR) + continue; + err(1, "Cannot read from eventfd"); + } + assert(ret == sizeof(result)); + + ret = access(event_control_path, W_OK); + if ((ret == -1) && (errno == ENOENT)) { + puts("The cgroup seems to have removed."); + break; + } + + if (ret == -1) + err(1, "cgroup.event_control is not accessible any more"); + + printf("%s %s: crossed\n", argv[1], argv[2]); + } + + return 0; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" index e63ac90..3c4c980 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" @@ -1,5 +1,71 @@ #!/bin/bash -my_func() { +# 检查是否以root用户运行 +is_root() { + if [ "$EUID" -ne 0 ]; then + return 1 + fi return 0 } + +# 检查是否安装了libcgroup工具 +is_cgroup_tools_installed() { + if ! command -v cgcreate &> /dev/null; then + return 1 + fi + return 0 +} + +# 检查是否安装了taskset工具 +is_taskset_installed() { + if ! command -v taskset &> /dev/null; then + return 1 + fi + return 0 +} + +# 检查是否安装了numactl工具 +is_numactl_installed() { + if ! command -v numactl &> /dev/null; then + return 1 + fi + return 0 +} + +# 检查是否安装了stress-ng工具 +is_stress-ng_installed() { + if ! command -v stress-ng &> /dev/null; then + return 1 + fi + return 0 +} + +# 检查是否安装了dd工具 +is_dd_installed() { + if ! command -v dd &> /dev/null; then + msg "错误信息: 没有安装dd工具" + return 1 + fi + return 0 +} + +# 检查cgroup版本是否为cgroup v1 +check_cgroup_version_is_v1() { + if [ "$(stat -fc %T /sys/fs/cgroup)" = "tmpfs" ]; then + msg "cgroup 版本为cgroup v1" + return 0 + else + msg "错误信息: cgroup 版本不是cgroup v1" + return 1 + fi +} +# 检查cgroup版本是否为cgroup v2 +check_cgroup_version_is_v2() { + if [ "$(stat -fc %T /sys/fs/cgroup)" = "cgroup2fs" ]; then + msg "cgroup 版本为cgroup v2" + return 0 + else + msg "错误信息: cgroup 版本不是cgroup v2" + return 1 + fi +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" index 0516a9e..0479225 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" @@ -14,7 +14,36 @@ ts_setup() { tc_setup_common() { msg "this is tc_setup_common" - return 0 + # 检查是否是ROOT用户 + if ! is_root; then + msg "错误原因:脚本需要 root 权限运行, 尝试在root shell环境下运行" + return 1 + fi + # 检查是否开启了CONFIG_CGROUPS + if ! grep -q CONFIG_CGROUPS=y /boot/config-"$(uname -r)"; then + msg "错误原因: CONFIG_CGROUPS 配置未开启" + return 1 + fi + # 检查是否安装了libcgroup + if ! is_cgroup_tools_installed; then + msg "错误原因: 未安装cgroup工具" + return 1 + fi + # 检查是否安装了taskset + if ! is_taskset_installed; then + msg "错误原因: 未安装taskset工具" + return 1 + fi + # 检查是否安装了numactl + if ! is_numactl_installed; then + msg "错误原因: 未安装numactl工具" + return 1 + fi + # 检查是否安装了stress-ng + if ! is_stress-ng_installed; then + msg "错误原因: 未安装stress-ng工具" + return 1 + fi } tc_teardown_common() { -- Gitee From 555301638c7e83d43d269c38e4a6bbbdbfd28ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 24 Jul 2024 14:40:04 +0800 Subject: [PATCH 08/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0deivces=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-devices-001.sh" | 94 +++++++++++-------- .../testcase/cgroup-v1-devices-002.sh" | 88 +++++++++++++++++ 2 files changed, 145 insertions(+), 37 deletions(-) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" (35%) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" similarity index 35% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" index 9d13552..e1f6a67 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/test.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### -# @用例ID: 20240721-163304-894253469 -# @用例名称: cgroup-v1-blkio-bfq-weight +# @用例ID: 20240724-140024-496158227 +# @用例名称: cgroup-v1-devices-001 # @用例级别: 3 -# @用例标签: cgroup-v1 blkio bfq-weight -# @用例类型: 测试比例权重策略文件blkio.bfq.weight +# @用例标签: cgroup-v1 devices +# @用例类型: 测试允许特定设备访问 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -22,56 +22,76 @@ tc_setup() { if ! check_cgroup_version_is_v1; then exit 1 fi - # @预置条件: 检查是否安装了dd工具 - if ! is_dd_installed; then - exit 1 - fi - # @预置条件: 创建两个cgroup组 - cgcreate -g blkio:test01 - cgcreate -g blkio:test02 + # @预置条件: 创建一个cgroup + cgcreate -g devices:cgroup-v1-devices-001 return 0 } do_test() { msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="vda" + device_number="253:0" + fi + + # @测试步骤:2: 获取光驱设备 + if [[ -e /dev/sr0 ]]; then + msg "disk is /dev/sda" + disk="sr0" + else + msg "错误信息: 没有光驱设备CD-ROM" + exit 1 + fi - mkdir -p /mnt/testdir - dd if=/dev/zero of=/mnt/testdir/testfile1 bs=1M count=512 - dd if=/dev/zero of=/mnt/testdir/testfile2 bs=1M count=512 + # @测试步骤:3: 限制所有设备访问 + echo "a *:* rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.deny - # @测试步骤:1: 设置blkio.bfq.weight - cgset -r blkio.bfq.weight=500 test/test01 - cgset -r blkio.bfq.weight=1000 test/test02 + # @测试步骤:4: 查看允许访问设备的白名单 + whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.list) + msg "whitelist: $whitelist" - # @测试步骤:2: 启动两个dd进程 - sync - echo 3 > /proc/sys/vm/drop_caches - dd if=/mnt/testdir/testfile1 of=/dev/null bs=1M iflag=direct & - task_pid=$! - msg "task_pid: $task_pid" - echo $task_pid > /sys/fs/cgroup/blkio/test/test01/cgroup.procs + # @测试步骤:5: 允许访问设备 + echo "b $device_number rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.allow - dd if=/mnt/testdir/testfile2 of=/dev/null bs=1M iflag=direct & - task_pid2=$! - msg "task_pid2: $task_pid2" - echo $task_pid2 > /sys/fs/cgroup/blkio/test/test02/cgroup.procs + # @测试步骤:6: 查看允许访问设备的白名单 + whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.list) + msg "whitelist: $whitelist" - sleep 10 - - - # @测试步骤:3: - # @预期结果:3: - assert_true [ 1 -eq 1 ] + # @预期结果:1: 允许访问设备的白名单包含设备号 + if [ "$(echo "$whitelist" | grep -c "$device_number")" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + # @预期结果:2: 验证设备访问限制 + # 访问被允许的设备 + if cat /dev/"$disk" &> /dev/null; then + assert_true [ true ] + else + assert_false [ true ] + fi + # 访问不被允许的设备 + if ! cat /dev/"$disk" &> /dev/null; then + assert_false [ true ] + else + assert_true [ true ] + fi return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g blkio:test01 - cgdelete -g blkio:test02 - # cgdelete -g blkio:test + # @清理工作: 删除cgroup + cgdelete -g devices:cgroup-v1-devices-001 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" new file mode 100755 index 0000000..fedaa84 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" @@ -0,0 +1,88 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240724-142029-165605406 +# @用例名称: cgroup-v1-devices-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 devices +# @用例类型: 测试deivces的层级结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + + # @预置条件: 创建两个cgroup + cgcreate -g devices:cgroup-v1-devices-002 + cgcreate -g devices:cgroup-v1-devices-002/subcgroup + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + device_number_major="8" + device_number_minor="0" + else + msg "disk is /dev/vda" + device_number_major="253" + device_number_minor="0" + fi + + # @测试步骤:2: 限制subcgroup的所有设备访问 + echo "a *:* rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.deny + + # @测试步骤:3: 允许subcgroup的硬盘设备访问 + echo "b $device_number_major:$device_number_minor rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.allow + + # @测试步骤:4: 查看subcgroup的允许访问设备的白名单 + whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.list) + msg "whitelist_before: $whitelist" + + # @预期结果:1: subcgroup白名单中包硬盘设备 + if [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 1 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + # @测试步骤:5: 在父cgroup中禁用块设备访问(包含了硬盘设备) + echo "b *:* rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-002/devices.deny + + # @测试步骤:6: 查看subcgroup的允许访问设备的白名单 + whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.list) + msg "whitelist_after: $whitelist" + + # @预期结果:6: 此时subcgroup白名单将不再包含硬盘设备 + if [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g devices:cgroup-v1-devices-002/subcgroup + cgdelete -g devices:cgroup-v1-devices-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From e5cb0b9ab810a0049fe39cf7bc48045ec6081287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 24 Jul 2024 17:12:01 +0800 Subject: [PATCH 09/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0freezer=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-freezer-001.sh" | 114 ++++++++++++++++++ .../testcase/cgroup-v1-freezer-002.sh" | 88 ++++++++++++++ 2 files changed, 202 insertions(+) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" new file mode 100755 index 0000000..a51f0b2 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" @@ -0,0 +1,114 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240724-155849-953242621 +# @用例名称: cgroup-v1-freezer-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 freezer +# @用例类型: 测试freezxr的正常使用 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + + # @预置条件: 创建一个cgroup + cgcreate -g freezer:cgroup-v1-freezer-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 查看当前的freezer状态 + freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state) + + # @预期结果:1: 当前cgroup状态为THAWED + if [ "$freezer_state" == "THAWED" ]; then + assert_true [ true ] + else + msg "测试失败: cgroup状态为$freezer_state, 而不是THAWED" + assert_false [ true ] + fi + + # @测试步骤:2: 创建一个后台进程,定期输出到文件 + { + while true; do + echo "$(date +%s): Runnnig..." >> "$TMP_FILE"; + sleep 1; + done + } & + task_pid=$! + echo $task_pid > /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/tasks + sleep 5 + + # @测试步骤:3: 将cgroup状态设置为FROZEN + echo "FROZEN" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state + + # @测试步骤:4: 进程再睡眠5秒 + sleep 5 + + # @测试步骤:5: 获取文件最后更新 + last_update=$(tail -n 1 "$TMP_FILE" | cut -d ':' -f 1) + msg "last_update: $last_update" + current_time=$(date +%s) + msg "current_time: $current_time" + diff=$((current_time - last_update)) + msg "diff: $diff" + + # @预期结果:2: 文件最后更新时间比现在时间至少差5s + if [ $diff -ge 5 ]; then + assert_true [ true ] + else + msg "测试失败: 进程没有被冻结" + assert_false [ true ] + fi + + # @测试步骤:6: 将cgroup状态设置为THAWED + echo "THAWED" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state + sleep 1 + + # @测试步骤:7: 获取文件最后更新 + last_update=$(tail -n 1 "$TMP_FILE" | cut -d ':' -f 1) + msg "last_update: $last_update" + current_time=$(date +%s) + msg "current_time: $current_time" + diff=$((current_time - last_update)) + msg "diff: $diff" + + # @预期结果:3: 文件最后更新时间跟当前时间一致, 误差最大为1s + if [ $diff -le 1 ]; then + assert_true [ true ] + else + msg "测试失败: 进程没有被解冻" + assert_false [ true ] + fi + + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g freezer:cgroup-v1-freezer-001 + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" new file mode 100755 index 0000000..8d00fca --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" @@ -0,0 +1,88 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240724-155852-472494491 +# @用例名称: cgroup-v1-freezer-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 freezer +# @用例类型: 测试freezer的层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + + # @预置条件: 创建两个cgroup + cgcreate -g freezer:cgroup-v1-freezer-002 + cgcreate -g freezer:cgroup-v1-freezer-002/subcgroup + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 查看父cgroup和subcgroup的状态 + freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state) + sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + + # @预期结果:1: 父cgroup状态和subcgroup状态为THAWED + if [ "$freezer_state" == "THAWED" ] && [ "$sub_freezer_state" == "THAWED" ]; then + assert_true [ true ] + else + msg "测试失败: cgroup状态为$freezer_state, subcgroup状态为$sub_freezer_state, 而不是THAWED" + assert_false [ true ] + fi + + # @测试步骤:2: 冻结父cgroup + echo "FROZEN" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state + + # @测试步骤:3: 查看父cgroup和subcgroup的状态 + freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state) + sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + + # @预期结果:2: 父cgroup状态和subcgroup状态都为FROZEN + if [ "$freezer_state" == "FROZEN" ] && [ "$sub_freezer_state" == "FROZEN" ]; then + assert_true [ true ] + else + msg "测试失败: cgroup状态为$freezer_state, subcgroup状态为$sub_freezer_state, 而不是FROZEN" + assert_false [ true ] + fi + + # @测试步骤:4: 解冻subcgroup + echo "THAWED" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state + + # @测试步骤:5: 查看subcgroup状态 + sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + + # @预期结果:3: subcgroup状态仍为FROZEN,因为此时父cgroup仍为FROZEN状态, subcgroup状态不会被有效更改 + if [ "$sub_freezer_state" == "FROZEN" ]; then + assert_true [ true ] + else + msg "测试失败: subcgroup状态为$sub_freezer_state, 而不是FROZEN" + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g freezer:cgroup-v1-freezer-002/subcgroup + cgdelete -g freezer:cgroup-v1-freezer-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From 2b1f316ab4dc64a4d28ffc34ffea9b5d883558c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Fri, 26 Jul 2024 15:22:56 +0800 Subject: [PATCH 10/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0net=5Fcls=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cgroup-v1-blkio-bfq-weight_device.sh" | 31 +++--- ...roup-v1-blkio-throttle-read_bps_device.sh" | 14 +-- ...oup-v1-blkio-throttle-read_iops_device.sh" | 10 +- ...oup-v1-blkio-throttle-write_bps_device.sh" | 8 +- ...up-v1-blkio-throttle-write_iops_device.sh" | 6 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 4 +- .../testcase/cgroup-v1-cpuset-cpus.sh" | 2 +- .../cgroup-v1-cpuset-mem_exclusive.sh" | 2 +- .../cgroup-v1-cpuset-mem_hardwall.sh" | 12 +- .../cgroup-v1-cpuset-memory_migrate.sh" | 10 +- .../cgroup-v1-cpuset-memory_pressure.sh" | 8 +- ...group-v1-cpuset-memory_spread_page-001.sh" | 10 +- ...group-v1-cpuset-memory_spread_page-002.sh" | 9 +- ...group-v1-cpuset-sched_load_balance-001.sh" | 7 +- ...group-v1-cpuset-sched_load_balance-002.sh" | 7 +- .../testcase/cgroup-v1-devices-001.sh" | 10 +- .../testcase/cgroup-v1-devices-002.sh" | 8 +- .../testcase/cgroup-v1-freezer-001.sh" | 11 +- .../testcase/cgroup-v1-freezer-002.sh" | 4 +- .../cgroup-v1-memory-limit_in_bytes.sh" | 7 +- .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 2 +- .../cgroup-v1-memory-oom_control-001.sh" | 2 +- .../cgroup-v1-memory-oom_control-002.sh" | 8 +- .../cgroup-v1-memory-pressure_level.sh" | 6 +- .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 4 +- .../cgroup-v1-memory-swappiness-001.sh" | 7 +- .../cgroup-v1-memory-swappiness-002.sh" | 4 +- .../testcase/cgroup-v1-net_cls-001.sh" | 103 ++++++++++++++++++ .../testcase/cgroup-v1-net_cls-002.sh" | 86 +++++++++++++++ .../tst_lib/other_common.sh" | 18 +++ 30 files changed, 311 insertions(+), 109 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index e5f975b..e514aed 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -46,7 +46,7 @@ do_test() { msg "disk is /dev/sda" disk="sda" disk_device="8:0" - else + else msg "disk is /dev/vda" disk="vda" disk_device="253:0" @@ -69,29 +69,30 @@ do_test() { echo "原始调度器2: $original_scheduler2" # @测试步骤:4: 设置调度器为bfq - echo bfq > /sys/block/$disk/queue/scheduler || return 1 - echo bfq > /sys/block/$cd_rom/queue/scheduler || return 1 + echo bfq >/sys/block/$disk/queue/scheduler || return 1 + echo bfq >/sys/block/$cd_rom/queue/scheduler || return 1 # @测试步骤:5: 设置blkio.bfq.weight_device - echo "$disk_device 100" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device - echo "$cd_rom_device 500" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + echo "$disk_device 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + echo "$cd_rom_device 500" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device # @测试步骤:6: 启动两个dd进程 - sync; echo 3 > /proc/sys/vm/drop_caches - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE" & + sync + echo 3 >/proc/sys/vm/drop_caches + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE" & task_pid=$! - echo $task_pid > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs - - dd iflag=direct if=/dev/$cd_rom of=/dev/null bs=1M count=1024 &> "$TMP_FILE2" & + echo $task_pid >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs + + dd iflag=direct if=/dev/$cd_rom of=/dev/null bs=1M count=1024 &>"$TMP_FILE2" & task_pid2=$! - echo $task_pid2 > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs + echo $task_pid2 >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs sleep 15 # @测试步骤:7: 获取dd进程的读取速度 - read_bps1=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + read_bps1=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') msg "read_bps1: $read_bps1" - read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2"| awk '{print $1}') + read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2" | awk '{print $1}') msg "read_bps2: $read_bps2" # @预期结果:3: 500权重的设备带宽要大于100权重的设备带宽 @@ -103,8 +104,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # 恢复调度器设置 - echo "$original_scheduler1" > /sys/block/"$disk"/queue/scheduler - echo "$original_scheduler2" > /sys/block/"$cd_rom"/queue/scheduler + echo "$original_scheduler1" >/sys/block/"$disk"/queue/scheduler + echo "$original_scheduler2" >/sys/block/"$cd_rom"/queue/scheduler cgdelete -r blkio:cgroup-v1-blkio-bfq-weight_device rm "$TMP_FILE" rm "$TMP_FILE2" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" index b7eab67..88dd490 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240721-144526-288264693 # @用例名称: cgroup-v1-blkio-throttle-read_bps_device -# @用例级别: 3 +# @用例级别: 3 # @用例标签: cgroup-v1 blkio throttle.read_bps_device # @用例类型: 测试节流策略文件blkio.throttle.read_bps_device ############################################################################### @@ -36,7 +36,7 @@ tc_setup() { # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" - exit 1 + exit 1 fi # @预置条件:创建cgroup组 @@ -51,25 +51,25 @@ do_test() { msg "disk is /dev/sda" disk="/dev/sda" device_number="8:0" - else + else msg "disk is /dev/vda" disk="/dev/vda" device_number="253:0" fi # @测试步骤:2: 设置blkio.throttle.read_bps_device,限制速度为1MB/s - echo "$device_number 1048576" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device + echo "$device_number 1048576" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/cgroup.procs dd iflag=direct if=$disk of=/dev/null bs=1M count=5 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 - read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') msg "read_bps: $read_bps" up_read_bps=1.2 down_read_bps=0.8 - + # @预期结果:1: 如果读取速率在1MB/s左右,说明限速成功 if [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ] && [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ]; then assert_true [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index 517aa5b..41aa5e9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -31,14 +31,14 @@ tc_setup() { # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then echo "CONFIG_BLK_CGROUP 配置未开启" - exit 1 + exit 1 fi # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" exit 1 fi - + # @预置条件: 创建cgroup组 cgcreate -g blkio:cgroup-v1-blkio-throttle-read_iops_device return 0 @@ -51,17 +51,17 @@ do_test() { msg "disk is /dev/sda" disk="/dev/sda" device_number="8:0" - else + else msg "disk is /dev/vda" disk="/dev/vda" device_number="253:0" fi # @测试步骤:2: 设置blkio.throttle.read_iops_device,限制速度为100 IO/s - echo "$device_number 100" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device + echo "$device_number 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device # @测试步骤:3: 启动一个fio进程 - echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/cgroup.procs dd iflag=direct if=$disk of=/dev/null bs=4k count=500 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index f3f32a5..f9bdb07 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -51,21 +51,21 @@ do_test() { msg "disk is /dev/sda" disk="/dev/sda" device_number="8:0" - else + else msg "disk is /dev/vda" disk="/dev/vda" device_number="253:0" fi # @测试步骤:2: 设置blkio.throttle.write_bps_device,限制速度为1MB/s - echo "$device_number 1048576" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device + echo "$device_number 1048576" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/cgroup.procs dd if=$disk of=/tmp/testfile bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 - write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') + write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') msg "write_bps: $write_bps" up_write_bps=1.2 down_write_bps=0.8 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index f7815d4..4ed8b49 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -51,17 +51,17 @@ do_test() { msg "disk is /dev/sda" disk="/dev/sda" device_number="8:0" - else + else msg "disk is /dev/vda" disk="/dev/vda" device_number="253:0" fi # @测试步骤:2: 设置blkio.throttle.write_iops_device,限制速度为100 IO/s - echo "$device_number 100" > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device + echo "$device_number 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device # @测试步骤:3: 启动一个dd进程 - echo $$ > /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/cgroup.procs dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index 954fc25..c2559cf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -38,7 +38,7 @@ do_test() { usage_percpu_before_first=$(echo "$usage_percpu_before" | awk '{print $1}') # @测试步骤:2: 启动一个CPU密集型任务并将其放入cgroup { - for i in {1..10000}; do echo "$i" >/dev/null; done + for i in {1..10000}; do echo "$i" >/dev/null; done } & task_pid=$! taskset -cp 0 $task_pid @@ -51,7 +51,7 @@ do_test() { usage_percpu_after_first=$(echo "$usage_percpu_after" | awk '{print $1}') # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 assert_true [ "$usage_percpu_after_first" -gt "$usage_percpu_before_first" ] - return + return } tc_teardown() { diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" index 4a8ffc2..c1634a4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" @@ -52,7 +52,7 @@ do_test() { kill -9 $task_pid # @预期结果:1: 验证进程是否只在指定的CPU上运行 - if [ "$cpus_allowed" = "1" ]; then + if [ "$cpus_allowed" = "1" ]; then msg "进程绑定到CPU1核心" assert_true [ true ] else diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" index c3563d1..4673ff6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -61,7 +61,7 @@ do_test() { # @预期结果:1: 验证设置cpuset.mems失败 tmp=$(cgget -r cpuset.mems cgroup-v1-cpuset-mem_exclusive_2 | awk '{print $2}') - assert_true [ "$tmp" != "0" ] + assert_true [ "$tmp" != "0" ] # @测试步骤:3: 验证进程在独占的numa节点上运行 { diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" index ff19d27..3311bb5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" @@ -68,11 +68,11 @@ do_test() { # @测试步骤:4:运行测试程序 tmp=$((num0_before_free_size / 2)) vm_bytes="${tmp}M" - { - stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s + { + stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/cgroup.procs # @测试步骤:5: 不断检查numa节点的空闲内存并更新最小的空闲内存 num0_min_free_size=$num0_before_free_size @@ -82,16 +82,16 @@ do_test() { num1_current_free_size=$(numactl -H | grep "node 1 free" | awk '{print $4}') # 更新最小空闲内存值 - if [ "$num0_current_free_size" -lt "$num0_min_free_size" ]; then + if [ "$num0_current_free_size" -lt "$num0_min_free_size" ]; then num0_min_free_size=$num0_current_free_size fi if [ "$num1_current_free_size" -lt "$num1_min_free_size" ]; then num1_min_free_size=$num1_current_free_size fi - sleep 1 + sleep 1 done - + msg "num0_min_free_size: $num0_min_free_size" msg "num1_min_free_size: $num1_min_free_size" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" index f99b934..c08633c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" @@ -38,7 +38,7 @@ tc_setup() { msg "系统NUMA节点数量小于2" exit 1 fi - + # @预置条件: 创建一个新的cgroup cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-001" # 测试迁移 cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-002" # 测试不迁移 @@ -83,10 +83,10 @@ do_test() { sleep 3 # @测试步骤:4: 检查内存页是否迁移,使用numastat命令 - memory_usage_in_numa0=$( numastat -p $task_pid0 | awk 'END{print $2}' ) - memory_usage_in_numa1=$( numastat -p $task_pid0 | awk 'END{print $3}' ) - memory_usage_in_numa2=$( numastat -p $task_pid1 | awk 'END{print $2}' ) - memory_usage_in_numa3=$( numastat -p $task_pid1 | awk 'END{print $3}' ) + memory_usage_in_numa0=$(numastat -p $task_pid0 | awk 'END{print $2}') + memory_usage_in_numa1=$(numastat -p $task_pid0 | awk 'END{print $3}') + memory_usage_in_numa2=$(numastat -p $task_pid1 | awk 'END{print $2}') + memory_usage_in_numa3=$(numastat -p $task_pid1 | awk 'END{print $3}') kill -9 $task_pid0 kill -9 $task_pid1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" index 3dd0fa1..24aae12 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" @@ -52,19 +52,19 @@ do_test() { # @测试步骤:3: 模拟内存压力 { stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s - + # stress-ng --vm 1 --vm-bytes 3G -t 10s } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid > /sys/fs/cgroup/cpuset/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup.procs { stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s # stress-ng --vm 1 --vm-bytes 3G -t 10s } & task_pid2=$! msg "task_pid: $task_pid2" - echo $task_pid2 > /sys/fs/cgroup/cpuset/cgroup.procs + echo $task_pid2 >/sys/fs/cgroup/cpuset/cgroup.procs sleep 15 # 等待内存压力生效 @@ -72,7 +72,7 @@ do_test() { msg "memory_pressure: $memory_pressure" # @预期结果:1: - assert_true [ "$memory_pressure" -gt "0" ] + assert_true [ "$memory_pressure" -gt "0" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index fa76810..3023948 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -66,8 +66,8 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid > /sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/cgroup.procs - + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/cgroup.procs + # @测试步骤:4: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages num1_max_file_pages=$node1_file_pages @@ -86,12 +86,12 @@ do_test() { done msg "num0_max_file_pages: $num0_max_file_pages" msg "num1_max_file_pages: $num1_max_file_pages" - + # @预期结果:1: numa node0要跟原来的FilePages有一定相差,numa node1的跟原来相差不大 num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) - abs_num0_diff=${num0_diff//-/} + abs_num0_diff=${num0_diff//-/} num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) - abs_num1_diff=${num1_diff//-/} + abs_num1_diff=${num1_diff//-/} assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff <= 50" | bc)" -eq 1 ] return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index 07b39b6..d62703b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -43,7 +43,7 @@ tc_setup() { cgcreate -g cpuset:cgroup-v1-cpuset-memory_spread_page-002 # @预置条件:设置cpuset.mems和cpuset.cpus cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_spread_page-002 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-002 + cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-002 return 0 } @@ -69,7 +69,7 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid > /sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/cgroup.procs # @测试步骤:5: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages @@ -92,12 +92,11 @@ do_test() { # @预期结果:1: numa node0和numa node1的FilePages大小跟原来都相差较大 num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) - abs_num0_diff=${num0_diff//-/} + abs_num0_diff=${num0_diff//-/} num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) - abs_num1_diff=${num1_diff//-/} + abs_num1_diff=${num1_diff//-/} assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff > 50" | bc)" -eq 1 ] - return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" index d2cf0f2..a7c5f23 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" @@ -47,17 +47,16 @@ do_test() { sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 - top -b -n 1 1 > "$TMP_FILE" + top -b -n 1 1 >"$TMP_FILE" cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') echo "CPU0 user time: $cpu0_user_time" echo "CPU1 user time: $cpu1_user_time" - # @预期结果:1: 验证CPU0和CPU1的使用情况 - if [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time < 10.0" | bc)" -eq 1 ]; then + if [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time < 10.0" | bc)" -eq 1 ]; then assert_true [ true ] - elif [ "$(echo "$cpu0_user_time < 10.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 50.0" | bc)" -eq 1 ]; then + elif [ "$(echo "$cpu0_user_time < 10.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 50.0" | bc)" -eq 1 ]; then assert_true [ true ] else assert_false [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" index d17695b..5f830ce 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" @@ -19,7 +19,7 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 TMP_FILE="$(mktemp)" tc_setup() { - msg "this is tc_setup" + msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then exit 1 @@ -47,15 +47,14 @@ do_test() { sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 - top -b -n 1 1 > "$TMP_FILE" + top -b -n 1 1 >"$TMP_FILE" cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') echo "CPU0 user time: $cpu0_user_time" echo "CPU1 user time: $cpu1_user_time" - # @预期结果:1: 验证CPU0和CPU1的使用情况 - if [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 80.0" | bc)" -eq 1 ]; then + if [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 80.0" | bc)" -eq 1 ]; then assert_true [ true ] else assert_false [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" index e1f6a67..28017fd 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" @@ -35,7 +35,7 @@ do_test() { msg "disk is /dev/sda" disk="sda" device_number="8:0" - else + else msg "disk is /dev/vda" disk="vda" device_number="253:0" @@ -51,14 +51,14 @@ do_test() { fi # @测试步骤:3: 限制所有设备访问 - echo "a *:* rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.deny + echo "a *:* rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.deny # @测试步骤:4: 查看允许访问设备的白名单 whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.list) msg "whitelist: $whitelist" # @测试步骤:5: 允许访问设备 - echo "b $device_number rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.allow + echo "b $device_number rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.allow # @测试步骤:6: 查看允许访问设备的白名单 whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.list) @@ -73,13 +73,13 @@ do_test() { # @预期结果:2: 验证设备访问限制 # 访问被允许的设备 - if cat /dev/"$disk" &> /dev/null; then + if cat /dev/"$disk" &>/dev/null; then assert_true [ true ] else assert_false [ true ] fi # 访问不被允许的设备 - if ! cat /dev/"$disk" &> /dev/null; then + if ! cat /dev/"$disk" &>/dev/null; then assert_false [ true ] else assert_true [ true ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" index fedaa84..90ade80 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" @@ -36,17 +36,17 @@ do_test() { msg "disk is /dev/sda" device_number_major="8" device_number_minor="0" - else + else msg "disk is /dev/vda" device_number_major="253" device_number_minor="0" fi # @测试步骤:2: 限制subcgroup的所有设备访问 - echo "a *:* rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.deny + echo "a *:* rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.deny # @测试步骤:3: 允许subcgroup的硬盘设备访问 - echo "b $device_number_major:$device_number_minor rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.allow + echo "b $device_number_major:$device_number_minor rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.allow # @测试步骤:4: 查看subcgroup的允许访问设备的白名单 whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.list) @@ -60,7 +60,7 @@ do_test() { fi # @测试步骤:5: 在父cgroup中禁用块设备访问(包含了硬盘设备) - echo "b *:* rwm" > /sys/fs/cgroup/devices/cgroup-v1-devices-002/devices.deny + echo "b *:* rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-002/devices.deny # @测试步骤:6: 查看subcgroup的允许访问设备的白名单 whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.list) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" index a51f0b2..7967116 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" @@ -46,16 +46,16 @@ do_test() { # @测试步骤:2: 创建一个后台进程,定期输出到文件 { while true; do - echo "$(date +%s): Runnnig..." >> "$TMP_FILE"; - sleep 1; + echo "$(date +%s): Runnnig..." >>"$TMP_FILE" + sleep 1 done } & task_pid=$! - echo $task_pid > /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/tasks + echo $task_pid >/sys/fs/cgroup/freezer/cgroup-v1-freezer-001/tasks sleep 5 # @测试步骤:3: 将cgroup状态设置为FROZEN - echo "FROZEN" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state + echo "FROZEN" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state # @测试步骤:4: 进程再睡眠5秒 sleep 5 @@ -77,7 +77,7 @@ do_test() { fi # @测试步骤:6: 将cgroup状态设置为THAWED - echo "THAWED" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state + echo "THAWED" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state sleep 1 # @测试步骤:7: 获取文件最后更新 @@ -96,7 +96,6 @@ do_test() { assert_false [ true ] fi - return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" index 8d00fca..9f3a23f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" @@ -44,7 +44,7 @@ do_test() { fi # @测试步骤:2: 冻结父cgroup - echo "FROZEN" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state + echo "FROZEN" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state # @测试步骤:3: 查看父cgroup和subcgroup的状态 freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state) @@ -59,7 +59,7 @@ do_test() { fi # @测试步骤:4: 解冻subcgroup - echo "THAWED" > /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state + echo "THAWED" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state # @测试步骤:5: 查看subcgroup状态 sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" index c9bf6e1..9cf25ad 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -17,7 +17,7 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### tc_setup() { - msg "this is tc_setup" + msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then exit 1 @@ -40,8 +40,8 @@ do_test() { cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/cgroup.procs - stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.limit_in_bytes的次数 max_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.max_usage_in_bytes) @@ -49,7 +49,6 @@ do_test() { failcnt=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.failcnt) msg "failcnt: $failcnt" - # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" index 64b35bb..371c449 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -45,7 +45,7 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/cgroup.procs stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.memsw.limit_in_bytes的次数 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" index fce00d1..087fe91 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" @@ -40,7 +40,7 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/cgroup.procs stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取被oom_killer杀死的进程数 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" index cfeb189..ed68c35 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" @@ -38,18 +38,18 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 禁用oom_control - echo 1 > /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control + echo 1 >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control # @测试步骤:2: 设置内存限制 cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/cgroup.procs - stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s &> "$TMP_FILE" + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/cgroup.procs + stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s &>"$TMP_FILE" time=$(grep -oP '(?<=completed in )\d+\.\d+(?=s)' "$TMP_FILE") msg "time: $time" - + # @测试步骤:4: 获取被oom_killer杀死的进程数 oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" index 17a488b..d0ccd5a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" @@ -43,14 +43,14 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 在后台运行监听器 - "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &> "$TMP_FILE" & + "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &>"$TMP_FILE" & # @测试步骤:2: 设置内存限制 cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-pressure_level cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-pressure_level # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/cgroup.procs stress-ng --vm 1 --vm-bytes 51M -t 1s # @预期结果:1: 临时文件应该非空,有内存压力通知 @@ -59,7 +59,7 @@ do_test() { else assert_false [ true ] fi - + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" index 6ef3683..68620a2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -28,7 +28,7 @@ tc_setup() { exit 1 fi # @预置条件: 检查是否没有CONFIG_PREEMPT_RT配置 - if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then + if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then echo "CONFIG_PREEMPT_RT 配置开启" exit 1 fi @@ -45,7 +45,7 @@ do_test() { cgset -r memory.soft_limit_in_bytes=50M cgroup-v1-memory-soft_limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/cgroup.procs stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" index 74d76af..30befd0 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" @@ -16,9 +16,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### - tc_setup() { - msg "this is tc_setup" + msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then exit 1 @@ -46,8 +45,8 @@ do_test() { cgset -r memory.swappiness=0 cgroup-v1-memory-swappiness-001 # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/cgroup.procs - stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/cgroup.procs + stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s # @测试步骤:4: 获取swap空间内存使用量 swap_usage=$(grep swap /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/memory.stat | head -n 1 | awk '{print $2}') diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" index e7123e1..330f5bb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" @@ -45,13 +45,13 @@ do_test() { cgset -r memory.swappiness=100 cgroup-v1-memory-swappiness-002 # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ > /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/cgroup.procs stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s # @测试步骤:4: 获取swap空间内存使用量 swap_usage=$(grep swap /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/memory.stat | head -n 1 | awk '{print $2}') msg "swap_usage: $swap_usage" - + # @预期结果:1: swap空间内存使用量大于0 assert_true [ "$swap_usage" -gt "0" ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" new file mode 100755 index 0000000..25dbf2f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" @@ -0,0 +1,103 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240726-114714-002803899 +# @用例名称: cgroup-v1-net_cls-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 net_cls +# @用例类型: 测试设置带宽限制的情况 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了tc工具 + if ! is_tc_installed; then + exit 1 + fi + # @预置条件: 检查是否安装了iperf3工具 + if ! is_iperf3_installed; then + exit 1 + fi + + # @预置条件: 创建cgroup + cgcreate -g net_cls:cgroup-v1-net_cls-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 检查是否有回环接口 + if ! ip addr show lo &>/dev/null; then + msg "错误信息: 没有找到回环接口lo" + exit 1 + fi + + # @测试步骤:2: 获取lo接口的ip地址 + lo_ip=$(ip -4 addr show lo | grep -oP '(?<=inet\s)\d+(\.\d+){3}') + msg "lo接口的IP地址是: $lo_ip" + + # @测试步骤:3: 设置net_cls.classid + cgset -r net_cls.classid=0x100001 cgroup-v1-net_cls-001 + + # @预期结果:1: 检查是否设置成功 + classid=$(cat /sys/fs/cgroup/net_cls/cgroup-v1-net_cls-001/net_cls.classid) + assert_true [ "$classid" = "1048577" ] + + # @测试步骤:4: 给lo接口添加新的队列规则 + tc qdisc add dev lo root handle 10: htb + + # @测试步骤:5: 给lo接口添加新的类 + tc class add dev lo parent 10: classid 10:1 htb rate 5mbit + + # @测试步骤:6: 创建过滤器 + tc filter add dev lo parent 10: protocol ip prio 10 handle 1: cgroup + + # @测试步骤:7: 使用ipef3启动服务端 + iperf3 -s &>/dev/null & + task_pid=$! + + # @测试步骤:8: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 + echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-001/cgroup.procs + iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" + + # @测试步骤:9: 获取iperf3的接收数据端的bitrate + bitrate=$(grep 'receiver' "$TMP_FILE" | awk '{print $7}') + msg "reciever bitrate: $bitrate" + up_bitrate=6 + down_bitrate=4 + + # @预期结果:2: 在误差允许范围内,检查是否限制了带宽 + kill -9 "$task_pid" + assert_true [ "$(echo "$bitrate > $down_bitrate" | bc)" -eq 1 -a "$(echo "$bitrate < $up_bitrate" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g net_cls:cgroup-v1-net_cls-001 + # @清理工作: 删除队列规则 + tc qdisc del dev lo root + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" new file mode 100755 index 0000000..bf3c8af --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240726-114715-271502110 +# @用例名称: cgroup-v1-net_cls-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 net_cls +# @用例类型: 测试不设置带宽限制的情况 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了tc工具 + if ! is_tc_installed; then + exit 1 + fi + # @预置条件: 检查是否安装了iperf3工具 + if ! is_iperf3_installed; then + exit 1 + fi + + # @预置条件: 创建cgroup + cgcreate -g net_cls:cgroup-v1-net_cls-002 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 检查是否有回环接口 + if ! ip addr show lo &>/dev/null; then + msg "错误信息: 没有找到回环接口lo" + exit 1 + fi + + # @测试步骤:2: 获取lo接口的ip地址 + lo_ip=$(ip -4 addr show lo | grep -oP '(?<=inet\s)\d+(\.\d+){3}') + msg "lo接口的IP地址是: $lo_ip" + + # @测试步骤:3: 使用ipef3启动服务端 + iperf3 -s &>/dev/null & + task_pid=$! + + # @测试步骤:4: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 + echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-002/cgroup.procs + iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" + + # @测试步骤:5: 获取iperf3的接收数据端的bitrate + bitrate=$(grep 'receiver' "$TMP_FILE" | awk '{print $7}') + msg "reciever bitrate: $bitrate" + up_bitrate=6 + + # @预期结果:1: 检查是否没有限制带宽 + kill -9 "$task_pid" + assert_true [ "$(echo "$bitrate > $up_bitrate" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g net_cls:cgroup-v1-net_cls-002 + # @清理工作: 删除队列规则 + tc qdisc del dev lo root + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" index 3c4c980..be44a52 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" @@ -49,6 +49,24 @@ is_dd_installed() { return 0 } +# 检查是否安装了tc工具 +is_tc_installed() { + if ! command -v tc &> /dev/null; then + msg "错误信息: 没有安装tc工具" + return 1 + fi + return 0 +} + +# 检查是否安装了iperf3工具 +is_iperf3_installed() { + if ! command -v iperf3 &> /dev/null; then + msg "错误信息: 没有安装iperf3工具" + return 1 + fi + return 0 +} + # 检查cgroup版本是否为cgroup v1 check_cgroup_version_is_v1() { if [ "$(stat -fc %T /sys/fs/cgroup)" = "tmpfs" ]; then -- Gitee From 0a5525aeef69b3d753845a26c5332fe94fac6251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Fri, 26 Jul 2024 21:19:09 +0800 Subject: [PATCH 11/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0net=5Fprio=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-net_prio.sh" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" new file mode 100755 index 0000000..62648d5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" @@ -0,0 +1,62 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240726-211229-939897776 +# @用例名称: cgroup-v1-net_prio +# @用例级别: 3 +# @用例标签: cgroup-v1 net_prio +# @用例类型: 测试net_prio.ifpriomap是否能成功设置 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + + # @预置条件: 创建cgroup + cgcreate -g net_prio:cgroup-v1-net_prio + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 检查是否有回环接口 + if ! ip addr show lo &>/dev/null; then + msg "错误信息: 没有找到回环接口lo" + exit 1 + fi + + # @测试步骤:2: 设置net_prio.ifpriomap + echo "lo 5" > /sys/fs/cgroup/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap + + # @测试步骤:3: 获取net_prio.ifpriomap配置 + ifpriomap=$(cat /sys/fs/cgroup/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap) + io_ifpriomap=$(echo "$ifpriomap" | grep "lo" | awk '{print $2}') + msg "io_ifpriomap: $io_ifpriomap" + + # @预期结果:1: 检查是否设置成功 + assert_true [ "$io_ifpriomap" -eq "5" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g net_prio:cgroup-v1-net_prio + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From 8a2235fc652dc81ed6aa01fdbc3b4cee2325aa7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Tue, 30 Jul 2024 16:37:38 +0800 Subject: [PATCH 12/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0perf=5Fevent=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 4 +- .../cgroup-v1-blkio-bfq-weight_device.sh" | 4 +- ...roup-v1-blkio-throttle-read_bps_device.sh" | 2 +- ...oup-v1-blkio-throttle-read_iops_device.sh" | 2 +- ...oup-v1-blkio-throttle-write_bps_device.sh" | 2 +- ...up-v1-blkio-throttle-write_iops_device.sh" | 2 +- .../testcase/cgroup-v1-cpu-cfs.sh" | 2 +- .../testcase/cgroup-v1-cpu-shares.sh" | 4 +- .../testcase/cgroup-v1-cpuacct-stat.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 2 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 2 +- .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 2 +- .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 2 +- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 2 +- .../cgroup-v1-cpuset-cpu_exclusive.sh" | 2 +- .../testcase/cgroup-v1-cpuset-cpus.sh" | 2 +- .../cgroup-v1-cpuset-mem_exclusive.sh" | 2 +- .../cgroup-v1-cpuset-mem_hardwall.sh" | 2 +- .../cgroup-v1-cpuset-memory_migrate.sh" | 4 +- .../cgroup-v1-cpuset-memory_pressure.sh" | 4 +- ...group-v1-cpuset-memory_spread_page-001.sh" | 2 +- ...group-v1-cpuset-memory_spread_page-002.sh" | 2 +- .../testcase/cgroup-v1-cpuset-mems.sh" | 2 +- ...group-v1-cpuset-sched_load_balance-001.sh" | 2 +- ...group-v1-cpuset-sched_load_balance-002.sh" | 2 +- .../cgroup-v1-memory-limit_in_bytes.sh" | 2 +- .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 2 +- .../cgroup-v1-memory-oom_control-001.sh" | 2 +- .../cgroup-v1-memory-oom_control-002.sh" | 2 +- .../cgroup-v1-memory-pressure_level.sh" | 2 +- .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 2 +- .../cgroup-v1-memory-swappiness-001.sh" | 2 +- .../cgroup-v1-memory-swappiness-002.sh" | 2 +- .../testcase/cgroup-v1-net_cls-001.sh" | 2 +- .../testcase/cgroup-v1-net_cls-002.sh" | 2 +- .../testcase/cgroup-v1-perf_event.sh" | 65 +++++++++++++++++++ .../tst_lib/other_common.sh" | 9 +++ 39 files changed, 116 insertions(+), 42 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" index e19927a..09cd077 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -69,12 +69,12 @@ do_test() { dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE" & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight/cgroup.procs + echo $task_pid > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight/tasks dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE2" & task_pid2=$! msg "task_pid2: $task_pid2" - echo $task_pid2 > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight2/cgroup.procs + echo $task_pid2 > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight2/tasks sleep 15 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index e514aed..7304422 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -81,11 +81,11 @@ do_test() { echo 3 >/proc/sys/vm/drop_caches dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE" & task_pid=$! - echo $task_pid >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs + echo $task_pid >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/tasks dd iflag=direct if=/dev/$cd_rom of=/dev/null bs=1M count=1024 &>"$TMP_FILE2" & task_pid2=$! - echo $task_pid2 >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/cgroup.procs + echo $task_pid2 >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/tasks sleep 15 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" index 88dd490..7ea3627 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -61,7 +61,7 @@ do_test() { echo "$device_number 1048576" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/tasks dd iflag=direct if=$disk of=/dev/null bs=1M count=5 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index 41aa5e9..9991f42 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -61,7 +61,7 @@ do_test() { echo "$device_number 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device # @测试步骤:3: 启动一个fio进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/tasks dd iflag=direct if=$disk of=/dev/null bs=4k count=500 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index f9bdb07..0d33b1f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -61,7 +61,7 @@ do_test() { echo "$device_number 1048576" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/tasks dd if=$disk of=/tmp/testfile bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index 4ed8b49..ff3a48a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -61,7 +61,7 @@ do_test() { echo "$device_number 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device # @测试步骤:3: 启动一个dd进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/cgroup.procs + echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/tasks dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" index 9611130..c0c17dc 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" @@ -43,7 +43,7 @@ do_test() { while true; do :; done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpu/"${cgroup}"/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpu/"${cgroup}"/tasks sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" index 5bb2050..47fc260 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" @@ -42,11 +42,11 @@ do_test() { # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 taskset 0x1 sh -c 'while true; do :; done' & task_pid1=$! - echo $task_pid1 >/sys/fs/cgroup/cpu/"$cgroup1"/cgroup.procs + echo $task_pid1 >/sys/fs/cgroup/cpu/"$cgroup1"/tasks taskset 0x1 sh -c 'while true; do :; done' & task_pid2=$! - echo $task_pid2 >/sys/fs/cgroup/cpu/"$cgroup2"/cgroup.procs + echo $task_pid2 >/sys/fs/cgroup/cpu/"$cgroup2"/tasks sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" index c813994..e8d4e67 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" @@ -45,7 +45,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的stat值 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" index 8456374..2e26075 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" @@ -34,7 +34,7 @@ do_test() { msg "Running test" # @测试步骤:1: 将脚本自身进程放入cgroup - echo $$ >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $$ >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks # @测试步骤:2: 运行一个CPU密集型任务 for i in {1..10000}; do echo "$i" >/dev/null; done diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" index 0fdf363..fbfa3de 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -46,7 +46,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的usage_all值 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index c2559cf..af8ceff 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -42,7 +42,7 @@ do_test() { } & task_pid=$! taskset -cp 0 $task_pid - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的每CPU使用时间 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index 7bb3827..5db772f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -45,7 +45,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用内核态CPU的时间 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index 0bebf2c..0acad4a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -45,7 +45,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # 等待任务结束 # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用用户态CPU的时间 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 59e32eb..1f15497 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -45,7 +45,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的内核态CPU使用时间 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" index b76f8f9..8a72e41 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -45,7 +45,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的用户态CPU使用时间 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" index 400ed6a..59597f9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" @@ -54,7 +54,7 @@ do_test() { done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpu_exclusive_1/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpu_exclusive_1/tasks sleep 3 # @测试步骤:4: 检查进程绑定的CPU diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" index c1634a4..66e6544 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" @@ -42,7 +42,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpus/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpus/tasks sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" index 4673ff6..1c5ca90 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -70,7 +70,7 @@ do_test() { done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_exclusive_1/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_exclusive_1/tasks sleep 3 # @测试步骤:4: 检查进程绑定的NUMA节点 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" index 3311bb5..d0dedfb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" @@ -72,7 +72,7 @@ do_test() { stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/tasks # @测试步骤:5: 不断检查numa节点的空闲内存并更新最小的空闲内存 num0_min_free_size=$num0_before_free_size diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" index c08633c..2a46c01 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" @@ -66,7 +66,7 @@ do_test() { done } & task_pid0=$! - echo $task_pid0 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-001/cgroup.procs + echo $task_pid0 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-001/tasks msg "task_pid0: $task_pid0" { while true; do @@ -74,7 +74,7 @@ do_test() { done } & task_pid1=$! - echo $task_pid1 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-002/cgroup.procs + echo $task_pid1 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-002/tasks msg "task_pid1: $task_pid1" # @测试步骤:3: 修改cpuset.mems diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" index 24aae12..90faae9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" @@ -57,14 +57,14 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/tasks { stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s # stress-ng --vm 1 --vm-bytes 3G -t 10s } & task_pid2=$! msg "task_pid: $task_pid2" - echo $task_pid2 >/sys/fs/cgroup/cpuset/cgroup.procs + echo $task_pid2 >/sys/fs/cgroup/cpuset/tasks sleep 15 # 等待内存压力生效 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index 3023948..75b4b2c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -66,7 +66,7 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/tasks # @测试步骤:4: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index d62703b..fae2493 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -69,7 +69,7 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/tasks # @测试步骤:5: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" index 8e64037..cc35ebb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" @@ -60,7 +60,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mems/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mems/tasks sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" index a7c5f23..0616c34 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" @@ -43,7 +43,7 @@ do_test() { # @测试步骤:2: 启动一个进程并将其放入cgroup taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" index 5f830ce..a84edbe 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" @@ -43,7 +43,7 @@ do_test() { # @测试步骤:2: 启动一个进程并将其放入cgroup taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/cgroup.procs + echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" index 9cf25ad..e6bff50 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -40,7 +40,7 @@ do_test() { cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.limit_in_bytes的次数 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" index 371c449..c037fb6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -45,7 +45,7 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.memsw.limit_in_bytes的次数 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" index 087fe91..1264ba1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" @@ -40,7 +40,7 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取被oom_killer杀死的进程数 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" index ed68c35..7b4821a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" @@ -45,7 +45,7 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s &>"$TMP_FILE" time=$(grep -oP '(?<=completed in )\d+\.\d+(?=s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" index d0ccd5a..fa40ce5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" @@ -50,7 +50,7 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-pressure_level # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/tasks stress-ng --vm 1 --vm-bytes 51M -t 1s # @预期结果:1: 临时文件应该非空,有内存压力通知 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" index 68620a2..cb917bc 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -45,7 +45,7 @@ do_test() { cgset -r memory.soft_limit_in_bytes=50M cgroup-v1-memory-soft_limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/tasks stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" index 30befd0..c6b6b43 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" @@ -45,7 +45,7 @@ do_test() { cgset -r memory.swappiness=0 cgroup-v1-memory-swappiness-001 # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/tasks stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s # @测试步骤:4: 获取swap空间内存使用量 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" index 330f5bb..2f66368 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" @@ -45,7 +45,7 @@ do_test() { cgset -r memory.swappiness=100 cgroup-v1-memory-swappiness-002 # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/cgroup.procs + echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/tasks stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s # @测试步骤:4: 获取swap空间内存使用量 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" index 25dbf2f..d1e3789 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" @@ -71,7 +71,7 @@ do_test() { task_pid=$! # @测试步骤:8: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 - echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-001/cgroup.procs + echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-001/tasks iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" # @测试步骤:9: 获取iperf3的接收数据端的bitrate diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" index bf3c8af..1f73329 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" @@ -55,7 +55,7 @@ do_test() { task_pid=$! # @测试步骤:4: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 - echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-002/cgroup.procs + echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-002/tasks iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" # @测试步骤:5: 获取iperf3的接收数据端的bitrate diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" new file mode 100755 index 0000000..32d919a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" @@ -0,0 +1,65 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240730-141048-321945091 +# @用例名称: cgroup-v1-perf_event +# @用例级别: 3 +# @用例标签: cgroup-v1 perf_event +# @用例类型: 测试perf_event子系统 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + exit 1 + fi + # @预置条件: 检查是否安装了perf工具 + if ! is_perf_installed; then + exit 1 + fi + + # @预置条件: 创建cgroup + cgcreate -g perf_event:cgroup-v1-perf_event + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启动一个进程并将其加入cgroup + echo $$ > /sys/fs/cgroup/perf_event/cgroup-v1-perf_event/tasks + stress-ng --cpu 1 --timeout 5s & + sleep 3 + + # @测试步骤:2: 使用perf工具监控进程 + perf stat -e cpu-clock -a -G cgroup-v1-perf_event sleep 1 &> "$TMP_FILE" + cpu_clock=$(grep "cpu-clock" "$TMP_FILE" | awk '{print $1}') + msg "cpu_clock: $cpu_clock" + + # @预期结果:1: + assert_false [ "$cpu_clock" == " /dev/null; then + msg "错误信息: 没有安装perf工具" + return 1 + fi + return 0 +} + # 检查cgroup版本是否为cgroup v1 check_cgroup_version_is_v1() { if [ "$(stat -fc %T /sys/fs/cgroup)" = "tmpfs" ]; then -- Gitee From a85b40ccb8ec0a15991a198d881fce089ddb8eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 1 Aug 2024 14:03:15 +0800 Subject: [PATCH 13/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0hugetlb=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst-cgroup/.gitignore" | 15 +++ .../tst-cgroup/.gitmodules" | 3 + .../tst-cgroup/LICENSE" | 0 .../tst-cgroup/Makefile" | 0 .../tst-cgroup/Makefile.common" | 0 .../tst-cgroup/README.md" | 0 .../tst-cgroup/cmd/Makefile" | 0 .../tst-cgroup/cmd/hello.c" | 0 .../tst-cgroup/kmod/Makefile" | 0 .../tst-cgroup/kmod/ts_kcommon.c" | 0 .../tst-cgroup/nohup.out" | 0 .../tst-cgroup/perf.data" | Bin 0 -> 2470886 bytes .../tst-cgroup/testcase/Makefile" | 0 .../tst-cgroup/testcase/allocate_hugepage" | Bin 0 -> 16240 bytes .../tst-cgroup/testcase/allocate_hugepage.c" | 24 +++++ .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 9 +- .../cgroup-v1-blkio-bfq-weight_device.sh" | 6 +- ...roup-v1-blkio-throttle-read_bps_device.sh" | 10 +- ...oup-v1-blkio-throttle-read_iops_device.sh" | 10 +- ...oup-v1-blkio-throttle-write_bps_device.sh" | 10 +- ...up-v1-blkio-throttle-write_iops_device.sh" | 10 +- .../testcase/cgroup-v1-blkio-weight.sh" | 0 .../tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" | 2 +- .../tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" | 5 +- .../testcase/cgroup-v1-cpu-shares.sh" | 3 +- .../testcase/cgroup-v1-cpuacct-stat.sh" | 3 +- .../testcase/cgroup-v1-cpuacct-usage.sh" | 3 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 3 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 3 +- .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 3 +- .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 3 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 3 +- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 3 +- .../cgroup-v1-cpuset-cpu_exclusive.sh" | 3 +- .../testcase/cgroup-v1-cpuset-cpus.sh" | 3 +- .../cgroup-v1-cpuset-mem_exclusive.sh" | 13 +-- .../cgroup-v1-cpuset-mem_hardwall.sh" | 13 +-- .../cgroup-v1-cpuset-memory_migrate.sh" | 13 +-- .../cgroup-v1-cpuset-memory_pressure.sh" | 10 +- ...group-v1-cpuset-memory_spread_page-001.sh" | 13 +-- ...group-v1-cpuset-memory_spread_page-002.sh" | 13 +-- .../testcase/cgroup-v1-cpuset-mems.sh" | 13 +-- ...group-v1-cpuset-sched_load_balance-001.sh" | 3 +- ...group-v1-cpuset-sched_load_balance-002.sh" | 2 +- .../testcase/cgroup-v1-devices-001.sh" | 2 +- .../testcase/cgroup-v1-devices-002.sh" | 2 +- .../testcase/cgroup-v1-freezer-001.sh" | 2 +- .../testcase/cgroup-v1-freezer-002.sh" | 2 +- .../cgroup-v1-hugetlb-limit_in_bytes-001.sh" | 98 ++++++++++++++++++ .../cgroup-v1-hugetlb-limit_in_bytes-002.sh" | 97 +++++++++++++++++ .../cgroup-v1-hugetlb-limit_in_bytes-003.sh" | 95 +++++++++++++++++ .../cgroup-v1-hugetlb-limit_in_bytes-004.sh" | 97 +++++++++++++++++ ...oup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" | 96 +++++++++++++++++ ...oup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" | 97 +++++++++++++++++ ...oup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" | 96 +++++++++++++++++ ...oup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" | 98 ++++++++++++++++++ .../cgroup-v1-memory-limit_in_bytes.sh" | 5 +- .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 8 +- .../cgroup-v1-memory-oom_control-001.sh" | 5 +- .../cgroup-v1-memory-oom_control-002.sh" | 5 +- .../cgroup-v1-memory-pressure_level.sh" | 14 +-- .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 8 +- .../cgroup-v1-memory-swappiness-001.sh" | 5 +- .../cgroup-v1-memory-swappiness-002.sh" | 5 +- .../testcase/cgroup-v1-net_cls-001.sh" | 6 +- .../testcase/cgroup-v1-net_cls-002.sh" | 6 +- .../testcase/cgroup-v1-net_prio.sh" | 2 +- .../testcase/cgroup-v1-perf_event.sh" | 4 +- .../tst-cgroup/tst_common/.gitignore" | 0 .../tst-cgroup/tst_common/LICENSE" | 0 .../tst-cgroup/tst_common/Makefile" | 0 .../tst-cgroup/tst_common/Makefile.common" | 0 .../tst-cgroup/tst_common/README.md" | 0 .../tst-cgroup/tst_common/cmd/Makefile" | 0 .../tst-cgroup/tst_common/cmd/tsuite.c" | 0 .../tst-cgroup/tst_common/docs/API-C.md" | 0 .../tst-cgroup/tst_common/docs/API-Python.md" | 0 .../tst-cgroup/tst_common/docs/API-Shell.md" | 0 .../tst-cgroup/tst_common/kmod/Makefile" | 0 .../tst-cgroup/tst_common/kmod/kmod_common.c" | 0 .../tst-cgroup/tst_common/lib/Makefile" | 0 .../tst-cgroup/tst_common/lib/benchmark.c" | 0 .../tst-cgroup/tst_common/lib/benchmark.h" | 0 .../tst-cgroup/tst_common/lib/benchmark.py" | 0 .../tst-cgroup/tst_common/lib/common.c" | 0 .../tst-cgroup/tst_common/lib/common.h" | 0 .../tst-cgroup/tst_common/lib/common.py" | 0 .../tst-cgroup/tst_common/lib/common.sh" | 0 .../tst-cgroup/tst_common/lib/common_func.sh" | 0 .../tst-cgroup/tst_common/lib/main.h" | 0 .../tst-cgroup/tst_common/lib/sched.py" | 0 .../tst-cgroup/tst_common/lib/tst_ts_setup" | 0 .../tst_common/lib/tst_ts_teardown" | 0 .../tst_common/lib/tsuite-completion.bash" | 0 .../tst-cgroup/tst_common/lib/tsuite_func.sh" | 0 .../tst-cgroup/tst_common/testcase/Makefile" | 0 .../tst_common/testcase/test_c_testcase.c" | 0 .../tst_common/testcase/test_perf_tools.py" | 0 .../testcase/test_python_testcase.py" | 0 .../testcase/test_shell_testcase.sh" | 0 .../tst-cgroup/tst_common/tsuite" | 0 .../tst-cgroup/tst_lib/Makefile" | 0 .../tst-cgroup/tst_lib/cgroup_event_listener" | Bin .../tst_lib/cgroup_event_listener.c" | 0 .../tst-cgroup/tst_lib/hugetlb_test_01" | Bin 0 -> 16520 bytes .../tst-cgroup/tst_lib/hugetlb_test_01.c" | 73 +++++++++++++ .../tst-cgroup/tst_lib/hugetlb_test_02" | Bin 0 -> 16448 bytes .../tst-cgroup/tst_lib/hugetlb_test_02.c" | 51 +++++++++ .../tst-cgroup/tst_lib/other_common.sh" | 24 ++--- .../tst-cgroup/tst_lib/ts_common.c" | 0 .../tst-cgroup/tst_lib/ts_common.h" | 0 .../tst-cgroup/tst_lib/ts_common.py" | 0 .../tst-cgroup/tst_lib/ts_common.sh" | 0 .../tst-cgroup/tst_lib/ts_setup" | 0 .../tst-cgroup/tst_lib/ts_teardown" | 0 .../tst-cgroup/tsuite" | 0 116 files changed, 1070 insertions(+), 163 deletions(-) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitmodules" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/LICENSE" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/Makefile.common" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/README.md" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/cmd/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/cmd/hello.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/kmod/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/kmod/ts_kcommon.c" (100%) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/nohup.out" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/perf.data" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/Makefile" (100%) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/allocate_hugepage" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/allocate_hugepage.c" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" (95%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" (93%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" (93%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" (97%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" (93%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" (93%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" (94%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" (91%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" (98%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" (98%) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" (97%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" (88%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" (95%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" (96%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" (95%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" (97%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" (95%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/Makefile" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" (100%) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02.c" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" (80%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.c" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.h" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.py" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_setup" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_teardown" (100%) rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tsuite" (100%) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" new file mode 100644 index 0000000..d9510fe --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" @@ -0,0 +1,15 @@ +.idea/ +logs/ +__pycache__/ +*.o +*.a +*.d +*.cmd +*.test +*.ko +*.mod +*.mod.c +Module.symvers +modules.order +compile_commands.json + diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitmodules" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitmodules" new file mode 100644 index 0000000..eb26ca3 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitmodules" @@ -0,0 +1,3 @@ +[submodule "tst_common"] + path = tst_common + url = https://gitee.com/opencloudos-stream/test-suite-base.git diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/LICENSE" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/LICENSE" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/LICENSE" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/Makefile.common" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/Makefile.common" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/Makefile.common" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/README.md" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/README.md" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/README.md" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/cmd/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/cmd/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/cmd/hello.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/cmd/hello.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/cmd/hello.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/kmod/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/kmod/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/kmod/ts_kcommon.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/kmod/ts_kcommon.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/kmod/ts_kcommon.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/nohup.out" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/nohup.out" new file mode 100644 index 0000000..e69de29 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/perf.data" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/perf.data" new file mode 100644 index 0000000000000000000000000000000000000000..ed7a71ed8c47ff39b3283ccf00f344feccbfcb13 GIT binary patch literal 2470886 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%0Dgp$5yXJ$g;pFDl0xqWtUzw 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

qu~olEd|_9({xCP4HvxLs6@J$$ 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¡ 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 + #include + #include + #include + #include + + int main() { + size_t size = 2 * 1024 * 1024; // 2MB + void *ptr; + + ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); + if (ptr == MAP_FAILED) { + printf("mmap failed: %s\n", strerror(errno)); + return 1; + } + + printf("mmap succeeded, writing to the allocated memory...\n"); + memset(ptr, 0, size); + printf("Memory write succeeded.\n"); + + munmap(ptr, size); + return 0; + } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" similarity index 95% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" index 09cd077..ed84056 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -23,16 +23,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了dd工具 if ! is_dd_installed; then - exit 1 - fi + skip_test "未安装dd命令" + fi # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then - echo "CONFIG_IOSCHED_BFQ 配置未开启" - exit 1 + skip_test "内核CONFIG_IOSCHED_BFQ配置未开启" fi # @预置条件: 创建两个cgroup组 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index 7304422..364dfb8 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -23,15 +23,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了dd工具 if ! is_dd_installed; then - exit 1 + skip_test "未安装dd命令" fi # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then - echo "CONFIG_IOSCHED_BFQ 配置未开启" + skip_test "内核CONFIG_IOSCHED_BFQ配置未开启" fi # @预置条件: 创建cgroup组 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" similarity index 93% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" index 7ea3627..773cdaf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -22,21 +22,19 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了dd工具 if ! is_dd_installed; then - exit 1 + skip_test "未安装dd命令" fi # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_CGROUP 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_CGROUP配置未开启" fi # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_DEV_THROTTLING配置未开启" fi # @预置条件:创建cgroup组 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index 9991f42..c27abb6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -22,21 +22,19 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了dd工具 if ! is_dd_installed; then - exit 1 + skip_test "未安装dd命令" fi # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_CGROUP 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_CGROUP配置未开启" fi # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_DEV_THROTTLING配置未开启" fi # @预置条件: 创建cgroup组 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" similarity index 93% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index 0d33b1f..d56b847 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -22,21 +22,19 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了dd工具 if ! is_dd_installed; then - exit 1 + skip_test "未安装dd命令" fi # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_CGROUP 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_CGROUP配置未开启" fi # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_DEV_THROTTLING配置未开启" fi # @预置条件: 创建cgroup组 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index ff3a48a..e6df89f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -22,21 +22,19 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了dd工具 if ! is_dd_installed; then - exit 1 + skip_test "未安装dd命令" fi # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_CGROUP 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_CGROUP配置未开启" fi # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" - exit 1 + skip_test "内核CONFIG_BLK_DEV_THROTTLING配置未开启" fi # @预置条件: 创建cgroup组 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-blkio-weight.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" index c0c17dc..3b62477 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-cfs.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" @@ -24,7 +24,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建一个新的cgroup cgcreate -g cpu:/"${cgroup}" || return 1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" index af1e22d..92b209e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-rt.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" @@ -21,12 +21,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查是否启用了CONFIG_RT_GROUP_SCHED配置 if ! grep -q "^CONFIG_RT_GROUP_SCHED=y" "/boot/config-$(uname -r)"; then - echo "错误信息: cgroup-v1-cpu-rt脚本需要启用CONFIG_RT_GROUP_SCHED配置" - exit 1 + skip_test "内核CONFIG_RT_GROUP_SCHED配置未开启" fi # @预置条件: 创建一个新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" index 47fc260..8c204f4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpu-shares.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" @@ -24,8 +24,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件:创建两个新的cgroup cgcreate -g cpu:"$cgroup1" cgcreate -g cpu:"$cgroup2" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" index e8d4e67..9bd59ef 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" index 2e26075..8535e1f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" @@ -23,8 +23,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件:创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" index fbfa3de..4718084 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index af8ceff..b5739f9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index 5db772f..2baeb43 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index 0acad4a..51a83e9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 1f15497..7a76cf5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" index 8a72e41..771afdc 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -22,8 +22,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" index 59597f9..6e62d0c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" @@ -20,8 +20,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建两个新的cgroup cgcreate -g cpuset:cgroup-v1-cpuset-cpu_exclusive_1 cgcreate -g cpuset:cgroup-v1-cpuset-cpu_exclusive_2 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" similarity index 97% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" index 66e6544..1b283d6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" @@ -20,8 +20,9 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuset:"cgroup-v1-cpuset-cpus" # @预置条件: 设置cpuset.mems文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" similarity index 93% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" index 1c5ca90..e72e833 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -20,23 +20,20 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi # @预置条件:检查NUMA节点数量是否大于1 if [ "$numa_nodes" -lt 2 ]; then - msg "系统NUMA节点数量小于2" - exit 1 + skip_test "系统NUMA节点数量小于2" fi # @预置条件: 创建两个新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" index d0dedfb..1a36c19 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mem_hardwall.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" @@ -20,23 +20,20 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi # @预置条件:检查NUMA节点数量是否大于1 if [ "$numa_nodes" -lt 2 ]; then - msg "系统NUMA节点数量小于2" - exit 1 + skip_test "系统NUMA节点数量小于2" fi # @预置条件: 创建两个新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" index 2a46c01..cfeeb2d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_migrate.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" @@ -20,23 +20,20 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi # @预置条件:检查NUMA节点数量是否大于1 if [ "$numa_nodes" -lt 2 ]; then - msg "系统NUMA节点数量小于2" - exit 1 + skip_test "系统NUMA节点数量小于2" fi # @预置条件: 创建一个新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" similarity index 93% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" index 90faae9..6fa0dd9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" @@ -20,18 +20,16 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index 75b4b2c..4d3ff7e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -20,23 +20,20 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi # @预置条件:检查NUMA节点数量是否大于1 if [ "$numa_nodes" -lt 2 ]; then - msg "系统NUMA节点数量小于2" - exit 1 + skip_test "系统NUMA节点数量小于2" fi # @预置条件: 创建新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" similarity index 94% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index fae2493..bd5a593 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -20,23 +20,20 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi # @预置条件:检查NUMA节点数量是否大于1 if [ "$numa_nodes" -lt 2 ]; then - msg "系统NUMA节点数量小于2" - exit 1 + skip_test "系统NUMA节点数量小于2" fi # @预置条件: 创建新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" similarity index 91% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" index cc35ebb..1861d35 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" @@ -20,23 +20,20 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件:检查numactl命令是否存在 - if ! command -v numactl &>/dev/null; then - msg "numactl 未安装, 请先安装numactl" - exit 1 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" fi # @预置条件:检查是否支持NUMA numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) if [ "$numa_nodes" = "0" ]; then - msg "系统不支持NUMA" - exit 1 + skip_test "系统不支持NUMA架构" fi # @预置条件:检查NUMA节点数量是否大于1 if [ "$numa_nodes" -lt 2 ]; then - msg "系统NUMA节点数量小于2" - exit 1 + skip_test "系统NUMA节点数量小于2" fi # @预置条件: 创建一个新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" index 0616c34..b393a48 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" @@ -22,9 +22,10 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi + # @预置条件: 创建一个新的cgroup cgcreate -g cpuset:cgroup-v1-cpuset-sched_load_balance-001 # @预置条件: 设置cpuset.cpus文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" index a84edbe..590dfc5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" @@ -22,7 +22,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建一个新的cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" index 28017fd..923a808 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" @@ -20,7 +20,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" index 90ade80..4f3446b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-devices-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" @@ -20,7 +20,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建两个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" index 7967116..8038684 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" @@ -22,7 +22,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" similarity index 98% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" index 9f3a23f..4110c00 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-freezer-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" @@ -20,7 +20,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建两个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" new file mode 100755 index 0000000..b05f325 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" @@ -0,0 +1,98 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240731-141907-292150738 +# @用例名称: cgroup-v1-hugetlb-limit_in_bytes-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl limit_in_bytes +# @用例类型: 测试设置hugetlb.limit_in_bytes并分配高于该限制的内存,hugepage大小为2MB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条l件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 2 ]; then + skip_test "hugepage的大小不等于2MB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 2 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt + MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.max_usage_in_bytes) + msg "max usage: $MAX_USAGE" + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: max_usage_in_bytes等于2MB, failcnt大于0 + if [ "$MAX_USAGE" -eq 2097152 ] && [ "$FAILCNT" -gt 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-001 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" new file mode 100755 index 0000000..5bb72ca --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" @@ -0,0 +1,97 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-115350-763429803 +# @用例名称: cgroup-v1-hugetlb-limit_in_bytes-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetlb limit_in_bytes +# @用例类型: 测试设置hugetlb.limit_in_bytes并分配低于该限制的内存,hugepage大小为2MB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup"是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-002 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 2 ]; then + skip_test "hugepage的大小不等于2MB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt + MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.max_usage_in_bytes) + msg "max usage: $MAX_USAGE" + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 + if [ "$MAX_USAGE" -eq 2097152 ] && [ "$FAILCNT" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" new file mode 100755 index 0000000..392499a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" @@ -0,0 +1,95 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-115938-131086948 +# @用例名称: cgroup-v1-hugetlb-limit_in_bytes-003 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl limit_in_bytes +# @用例类型: 测试设置hugetlb.limit_in_bytes并分配高于该限制的内存,hugepage大小为1GB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-003 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 1024 ]; then + skip_test "hugepage的大小不等于1GB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为512MB + echo 512M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.1GB.failcnt + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: failcnt大于0 + if [ "$FAILCNT" -gt 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-003 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" new file mode 100755 index 0000000..11da570 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" @@ -0,0 +1,97 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-115940-264647997 +# @用例名称: cgroup-v1-hugetlb-limit_in_bytes-004 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl limit_in_bytes +# @用例类型: 测试设置hugetlb.limit_in_bytes并分配小于或等于该限制的内存,hugepage大小为1GB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-004 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 1024 ]; then + skip_test "hugepage的大小不等于1GB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为1024MB + echo 1024M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.1GB.max_usage_in_bytes和hugetlb.1GB.failcnt + MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.max_usage_in_bytes) + msg "max usage: $MAX_USAGE" + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: max_usage_in_bytes等于1GB, failcnt等于0 + if [ "$MAX_USAGE" -eq 1073741824 ] && [ "$FAILCNT" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-004 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" new file mode 100755 index 0000000..89194bb --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" @@ -0,0 +1,96 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-130244-196477079 +# @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes +# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配高于该限制的内存,hugepage大小为2MB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条l件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-001 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 2 ]; then + skip_test "hugepage的大小不等于2MB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 2 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.failcnt + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: failcnt大于0 + if [ "$FAILCNT" -gt 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-001 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" new file mode 100755 index 0000000..9fa8af8 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" @@ -0,0 +1,97 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-130248-928221366 +# @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes +# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配低于该限制的内存,hugepage大小为2MB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条l件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-002 + return 0 +} +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 2 ]; then + skip_test "hugepage的大小不等于2MB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.max_usage_in_bytes和hugetlb.2MB.rsvd.failcnt + MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.max_usage_in_bytes) + msg "max usage: $MAX_USAGE" + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 + if [ "$MAX_USAGE" -eq 2097152 ] && [ "$FAILCNT" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-002 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" new file mode 100755 index 0000000..db9af0b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" @@ -0,0 +1,96 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-130249-962716187 +# @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes +# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配高于该限制的内存,hugepage大小为1GB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条l件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 1024 ]; then + skip_test "hugepage的大小不等于1GB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + echo 512M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: failcnt大于0 + if [ "$FAILCNT" -gt 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" new file mode 100755 index 0000000..1a7c9f3 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" @@ -0,0 +1,98 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-130251-278577040 +# @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 +# @用例级别: 3 +# @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes +# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配低于该限制的内存,hugepage大小为1GB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条l件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 查看是否有CONFIG_CGROUP_HUGETLB配置 + if ! grep -q "CONFIG_CGROUP_HUGETLB=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_HUGETLB配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLB_PAGE配置 + if ! grep -q "CONFIG_HUGETLB_PAGE=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLB_PAGE配置未开启" + fi + # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 + if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then + skip_test "内核CONFIG_HUGETLBFS配置未开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统本来的hugepage的数量 + HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:2: 获取hugepage的大小 + HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $HUGEPAGE_SIZE_KB" + HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + if [ "$HUGEPAGE_SIZE_MB" -ne 1024 ]; then + skip_test "hugepage的大小不等于1GB" + fi + + # @测试步骤:3: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + echo 1024M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.limit_in_bytes + + # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/tasks + "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + + # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt + MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.max_usage_in_bytes) + msg "max usage: $MAX_USAGE" + FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.failcnt) + msg "failcnt: $FAILCNT" + + # @预期结果:1: failcnt等于0 + if [ "$MAX_USAGE" -eq 1073741824 ] && [ "$FAILCNT" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" similarity index 97% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" index e6bff50..9e48940 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -20,12 +20,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "CONFIG_MEMCG 配置未开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" index c037fb6..bb91626 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -20,17 +20,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "CONFIG_MEMCG 配置未开启" fi # @预置条件: 检查是否开启了CONFIG_SWAP配置 if ! grep -q CONFIG_SWAP=y /boot/config-"$(uname -r)"; then - echo "CONFIG_SWAP 配置未开启" - exit 1 + skip_test "内核CONFIG_SWAP配置未开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" index 1264ba1..e7d7cfb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" @@ -20,12 +20,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "CONFIG_MEMCG 配置未开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" index 7b4821a..323d438 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-oom_control-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" @@ -22,12 +22,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "CONFIG_MEMCG 配置未开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" similarity index 88% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" index fa40ce5..2ecbc95 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-pressure_level.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" @@ -22,17 +22,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "CONFIG_MEMCG 配置未开启" fi # @预置条件: 检查是否没有开启CONFIG_PREEMPT_RT配置 if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then - echo "CONFIG_PREEMPT_RT 配置开启" - exit 1 + skip_test "内核CONFIG_PREEMPT_RT配置开启" fi # @预置条件: 新建一个cgroup @@ -43,8 +41,11 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 在后台运行监听器 + if ! [ -f "${TST_TS_TOPDIR}/tst_lib/cgroup_event_listener" ]; then + skip_test "cgroup_event_listener文件不存在, 请先在tst_lib目录下编译" + fi "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &>"$TMP_FILE" & - + # @测试步骤:2: 设置内存限制 cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-pressure_level cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-pressure_level @@ -54,6 +55,7 @@ do_test() { stress-ng --vm 1 --vm-bytes 51M -t 1s # @预期结果:1: 临时文件应该非空,有内存压力通知 + msg "file content: $(cat "$TMP_FILE")" if [ -s "$TMP_FILE" ]; then assert_true [ true ] else diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" similarity index 95% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" index cb917bc..03bea50 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -20,17 +20,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "内核CONFIG_MEMCG配置未开启" fi # @预置条件: 检查是否没有CONFIG_PREEMPT_RT配置 if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then - echo "CONFIG_PREEMPT_RT 配置开启" - exit 1 + skip_test "内核CONFIG_PREEMPT_RT配置开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" index c6b6b43..ac0de1f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" @@ -20,12 +20,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "内核CONFIG_MEMCG配置未开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" index 2f66368..509686c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-memory-swappiness-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" @@ -20,12 +20,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否开启了CONFIG_MEMCG配置 if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - echo "CONFIG_MEMCG 配置未开启" - exit 1 + skip_test "CONFIG_MEMCG 配置未开启" fi # @预置条件: 创建一个cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" similarity index 96% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" index d1e3789..3c3448e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" @@ -22,15 +22,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了tc工具 if ! is_tc_installed; then - exit 1 + skip_test "没有安装tc工具" fi # @预置条件: 检查是否安装了iperf3工具 if ! is_iperf3_installed; then - exit 1 + skip_test "没有安装iperf3工具" fi # @预置条件: 创建cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" similarity index 95% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" index 1f73329..1005c42 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_cls-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" @@ -22,15 +22,15 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了tc工具 if ! is_tc_installed; then - exit 1 + skip_test "没有安装tc工具" fi # @预置条件: 检查是否安装了iperf3工具 if ! is_iperf3_installed; then - exit 1 + skip_test "没有安装iperf3工具" fi # @预置条件: 创建cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" similarity index 97% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" index 62648d5..d3006b8 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-net_prio.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" @@ -20,7 +20,7 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 创建cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" similarity index 95% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" index 32d919a..3515e5e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/testcase/cgroup-v1-perf_event.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" @@ -22,11 +22,11 @@ tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then - exit 1 + skip_test "cgroup版本不是v1" fi # @预置条件: 检查是否安装了perf工具 if ! is_perf_installed; then - exit 1 + skip_test "没有安装perf工具" fi # @预置条件: 创建cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/.gitignore" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/LICENSE" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/Makefile.common" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/README.md" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/cmd/tsuite.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-C.md" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Python.md" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/docs/API-Shell.md" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/kmod/kmod_common.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.h" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/benchmark.py" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.h" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.py" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/common_func.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/main.h" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/sched.py" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_setup" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tst_ts_teardown" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite-completion.bash" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/lib/tsuite_func.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_c_testcase.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_perf_tools.py" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_python_testcase.py" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/testcase/test_shell_testcase.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_common/tsuite" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/Makefile" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/Makefile" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/Makefile" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/cgroup_event_listener.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01" new file mode 100755 index 0000000000000000000000000000000000000000..162350e1309cb21e1ad9aeaacb258bc4c9129376 GIT binary patch literal 16520 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 Mw#5REgGUtq09~;zg8%>k literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" new file mode 100644 index 0000000..6c150b5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include + +#define FILE_NAME "/mnt/huge/hugepagefile" +#define PROTECTION (PROT_READ | PROT_WRITE) +#define ADDR (void *)(0x0UL) +#define FLAGS (MAP_SHARED) + +size_t size = 0; + +static void write_bytes(char *addr) +{ + unsigned long i; + + for (i = 0; i < size; i++) + *(addr + i) = (char)i; +} + +static int read_bytes(char *addr) +{ + unsigned long i; + + for (i = 0; i < size; i++) + if (*(addr + i) != (char)i) { + printf("Mismatch at %lu\n", i); + return 1; + } + return 0; +} + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "用法: %s \n", argv[0]); + exit(1); + } + + int hugepage_count = atoi(argv[1]); + int hugepage_size = atoi(argv[2]); + size = hugepage_count * hugepage_size * 1024 * 1024UL; + + void *addr; + int fd, ret; + fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); + if (fd < 0) { + perror("打开文件失败"); + exit(1); + } + + // 申请hugepage内存 + addr = mmap(ADDR, size, PROTECTION, FLAGS, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + unlink(FILE_NAME); + exit(1); + } + + printf("内存映射起始地址: %p\n", addr); + write_bytes(addr); + ret = read_bytes(addr); + + sleep(5); + + // 释放hugepage内存 + munmap(addr, size); + close(fd); + unlink(FILE_NAME); + + return ret; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02" new file mode 100755 index 0000000000000000000000000000000000000000..e453dc87d0542654aa030fd890b4cf3bec9c69d6 GIT binary patch literal 16448 zcmeHOeQX@X6`!*)n2^K{A&>-`TvI>^kn`C%X`nTnV_&kSNg#KI`_)`@N5ueLK6J*`4`fc*D9HpHDE=ifaT)`{yYnM2h?xDgXPCv{|bfr{_Xj?fyKzSJ_&VDGO-vIdykRS7Ds*gG6 z6Pu5}HIz>`4}uPfx!W&Fes12W+yry118M7o75OOj-9Uaj{W6Sj^Hv25=3L)q@WZ_P zyTq4y3)NTcI_#tTGpF>5rg*Gpb!$^RvN9e^<_1;{tXaKsb!#A-3be>3V7vVA!#=fs z(>4KN#t@@4ikiHVIUefHBR$#&$8&F;cO>qA#6^C9OVTSgDxEC82kI zLG;E`SyQCaW>RG1rkNI5D`I9cA`ORBMwkOJOC&HH2E#tQTCCsDwYEcV3A6-O+2t!+ zh2GV@Q3qeMKbE!3O!vl)cq(aj8$EFo+R~p$C8;gCGOcKcy|fm3aV`DLlx9#L*z`dP z@OmQU7RS!U-kydsVoyA<7rJ+ixC50y{QTs6U`$4`ZfM+u!?{LXE zmz;3Prc1urC2w=d8(nhPCAYccRZhA2ovy->&ufL(wV^krZ|Dv;k2SxnjkNs~&a$*% zK3JaY3p6a<2_js;k+!P<(MIZ8kX?1kS^$^!J$Rddm-g(^v4*92w0nU#*q<%!SJfa} zaat=(YX|>yt#!zV9XV~C2LWEB0QIF~eKK$CkJmrn_B(uAk-L1GHq`bFENX=b zYqmDr_AL-52TzwulM%QWhw7dL*>^Me+V!LV)a{_e!Zz@O&KNB0cugzh#)o#iR%G2BViI?*ph1ew$E; zBGKCihfy<9x0l2&5LNJ3Q85fIg+ri!MCnx$I?)L4qseEb(Sohe0%iLvjM)w7 zaQGyYE<^oD-5QGi*56Ad8RF#^@Dj*pfqnO5Lp|~`;AOzefR_O;16~Ha40svvGT>$4 ze9R}%-Up{dB2Vc3`e@WK=>1eLsOdI{C-kZuLt!o@W7Cuc~GfOljl2#L1$pf19 z#ozi57T3vvATc^LdIMT5?>Vg z+3VmgB$;Ozi%I77a5yhPV*OuEmr^K?(&9E=JGPq&yk_hu>3Qwf&(R5p*L*EhqF6wj z8M%olt?yE^N~oVslukqN8Z=yoij*gS@dMNlZue1TCU}h+*S~~tw) zc*S+|TYEEBb07t)(~X{(ZW;XofUK44>kIUXnU(CimC#|CeA3K$bFS4C~=dojNS0@BHkh_KjT~0K?7?J*<&d>)ayr^&75V+rB}+ ze%-pQ;cmUVeeH%Yc(`{4gm_6mEaO-E0&D~q`G45TetfMfbTeXDhLEQz-`keC%Pj_F z2&570)ph{hmEbZc-!Gs?vMD`kBqO+&pzC_@jKq?9E^9`h?j#)ao@|!lsqGJC;pFZI z+~ZJ&sx1y>5blg9191OC8KCR1v4Jy>J02=-V~|@ZTz<|y8s#dy z0Jk!VN4W$WIm}F21d=Js4D=^+fpi8=Fk=lmpq^X|HX+3#1hud2T8W)pnn#UnR0JY} zNvJ|`E2A{GnVD=Xl`Io<&}GcHfeutk$1M?%Ee}93(4PVk3t6*Q1T1p^MC|ooosyj+ zU`DB*Mt?k@)|al7zs0Q%-;P{yF^a;3WS4z!;88oc=s6V(w={;%@&N z0e=t1uH1ee-!orMel*Per}i75$FV*8^Z1|nC?*#O+lWOze;$X&0K=gi`}2H)InN)! zL=uH#QQQh89GkO0kH?vF{q?+9A=LU>G0dva!JpW+M^AE1y zeg0o1|Fsk_j}-wi=lKu%W6s?E4*`Zb;rRCdJ^KI0^E@z-N!JO?l0L#orUH;RgV2*kxu^)3a4xTxG9v3l>^M#=x?8h;2Ev57Pc^t`{ z=h1BM&fkmVZ&%|dOX7Ev$c(Qa%fEmE*3bSs{Yt~URf+b|UH@-E +#include +#include +#include +#include + +#define FILE_NAME "/mnt/huge/hugepagefile" +#define PROTECTION (PROT_READ | PROT_WRITE) +#define ADDR (void *)(0x0UL) +#define FLAGS (MAP_SHARED) + +size_t size = 0; + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "用法: %s \n", argv[0]); + exit(1); + } + + int hugepage_count = atoi(argv[1]); + int hugepage_size = atoi(argv[2]); + size = hugepage_count * hugepage_size * 1024 * 1024UL; + + void *addr; + int fd, ret; + fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); + if (fd < 0) { + perror("打开文件失败"); + exit(1); + } + + // 申请hugepage内存 + addr = mmap(ADDR, size, PROTECTION, FLAGS, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + unlink(FILE_NAME); + exit(1); + } + + printf("内存映射起始地址: %p\n", addr); + + sleep(5); + + // 释放hugepage内存 + munmap(addr, size); + close(fd); + unlink(FILE_NAME); + + return 0; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" similarity index 80% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" index 38ed51d..4859c05 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/other_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" @@ -24,14 +24,6 @@ is_taskset_installed() { return 0 } -# 检查是否安装了numactl工具 -is_numactl_installed() { - if ! command -v numactl &> /dev/null; then - return 1 - fi - return 0 -} - # 检查是否安装了stress-ng工具 is_stress-ng_installed() { if ! command -v stress-ng &> /dev/null; then @@ -43,7 +35,6 @@ is_stress-ng_installed() { # 检查是否安装了dd工具 is_dd_installed() { if ! command -v dd &> /dev/null; then - msg "错误信息: 没有安装dd工具" return 1 fi return 0 @@ -52,7 +43,6 @@ is_dd_installed() { # 检查是否安装了tc工具 is_tc_installed() { if ! command -v tc &> /dev/null; then - msg "错误信息: 没有安装tc工具" return 1 fi return 0 @@ -61,7 +51,6 @@ is_tc_installed() { # 检查是否安装了iperf3工具 is_iperf3_installed() { if ! command -v iperf3 &> /dev/null; then - msg "错误信息: 没有安装iperf3工具" return 1 fi return 0 @@ -70,7 +59,14 @@ is_iperf3_installed() { # 检查是否安装了perf工具 is_perf_installed() { if ! command -v perf &> /dev/null; then - msg "错误信息: 没有安装perf工具" + return 1 + fi + return 0 +} + +# 检查是否安装了numactl工具 +is_numactl_installed() { + if ! command -v numactl &> /dev/null; then return 1 fi return 0 @@ -79,20 +75,16 @@ is_perf_installed() { # 检查cgroup版本是否为cgroup v1 check_cgroup_version_is_v1() { if [ "$(stat -fc %T /sys/fs/cgroup)" = "tmpfs" ]; then - msg "cgroup 版本为cgroup v1" return 0 else - msg "错误信息: cgroup 版本不是cgroup v1" return 1 fi } # 检查cgroup版本是否为cgroup v2 check_cgroup_version_is_v2() { if [ "$(stat -fc %T /sys/fs/cgroup)" = "cgroup2fs" ]; then - msg "cgroup 版本为cgroup v2" return 0 else - msg "错误信息: cgroup 版本不是cgroup v2" return 1 fi } \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.c" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.h" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.h" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.h" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.py" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.py" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.py" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_common.sh" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_setup" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_setup" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_setup" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_teardown" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst_lib/ts_teardown" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_teardown" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tsuite" similarity index 100% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux Kernel Cgroup V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tsuite" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tsuite" -- Gitee From 3bea105928f698d2b421dca582a7d01c150ed998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 1 Aug 2024 20:11:40 +0800 Subject: [PATCH 14/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0pids=E5=AD=90=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-pids-001.sh" | 69 ++++++++++++++++ .../testcase/cgroup-v1-pids-002.sh" | 67 ++++++++++++++++ .../testcase/cgroup-v1-pids-003.sh" | 80 +++++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" new file mode 100755 index 0000000..bac9295 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" @@ -0,0 +1,69 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-154850-001570487 +# @用例名称: cgroup-v1-pids-001 +# @用例级别: 3 +# @用例标签: cgroup-v1 pids +# @用例类型: 测试pids.max控制文件, 进程数超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_PIDS配置 + if ! grep -q CONFIG_CGROUP_PIDS=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_PIDS配置未开启" + fi + + # @预置条件: 创建cgroup + cgcreate -g pids:cgroup-v1-pids-001 + return 0 +} + +TMP_FILE=$(mktemp) + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置pids.max为2 + echo 2 > /sys/fs/cgroup/pids/cgroup-v1-pids-001/pids.max + + # @测试步骤:2: 将当前shell加入cgroup + echo $$ > /sys/fs/cgroup/pids/cgroup-v1-pids-001/tasks + + # @测试步骤:3: 运行两个子进程 + (echo "Here's some processes for you." | cat) &> "$TMP_FILE" + msg "file content: $(cat "$TMP_FILE")" + + # @预期结果:1: 运行失败 + echo $$ > /sys/fs/cgroup/pids/tasks + if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g pids:cgroup-v1-pids-001 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" new file mode 100755 index 0000000..c616a24 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" @@ -0,0 +1,67 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-191404-256040067 +# @用例名称: cgroup-v1-pids-002 +# @用例级别: 3 +# @用例标签: cgroup-v1 pids +# @用例类型: 测试pids.max控制文件, 进程数不超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_PIDS配置 + if ! grep -q CONFIG_CGROUP_PIDS=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_PIDS配置未开启" + fi + + # @预置条件: 创建cgroup + cgcreate -g pids:cgroup-v1-pids-002 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置pids.max为2 + echo 2 > /sys/fs/cgroup/pids/cgroup-v1-pids-002/pids.max + + # @测试步骤:2: 将当前shell加入cgroup + echo $$ > /sys/fs/cgroup/pids/cgroup-v1-pids-002/tasks + + # @测试步骤:3: 运行进程并获取pids.current + PID_NUM=$(cat /sys/fs/cgroup/pids/cgroup-v1-pids-002/pids.current) + msg "pids.current: $PID_NUM" + + # @预期结果:1: PID_NUM为2 + echo $$ > /sys/fs/cgroup/pids/tasks + assert_true [ "$PID_NUM" -eq 2 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g pids:cgroup-v1-pids-002 + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" new file mode 100755 index 0000000..e0c88db --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" @@ -0,0 +1,80 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240801-191225-778933447 +# @用例名称: cgroup-v1-pids-003 +# @用例级别: 3 +# @用例标签: cgroup-v1 pids +# @用例类型: 测试pids的层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_PIDS配置 + if ! grep -q CONFIG_CGROUP_PIDS=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_PIDS配置未开启" + fi + + # @预置条件: 创建cgroup + cgcreate -g pids:cgroup-v1-pids-003 + cgcreate -g pids:cgroup-v1-pids-003/subcgroup + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置pids.max为2 + echo 2 > /sys/fs/cgroup/pids/cgroup-v1-pids-003/pids.max + + # @测试步骤:2: 获取subcgroup的pids.max + PID_MAX=$(cat /sys/fs/cgroup/pids/cgroup-v1-pids-003/subcgroup/pids.max) + msg "subcgroup pids.max: $PID_MAX" + + # @预期结果:1: subcgroup的pids.max为max + assert_true [ "$PID_MAX" = "max" ] + + # @测试步骤:3: 将当前shell加入subcgroup + echo $$ > /sys/fs/cgroup/pids/cgroup-v1-pids-003/subcgroup/tasks + + # @测试步骤:4: 运行了两个子进程 + (echo "Here's some processes for you." | cat) &> "$TMP_FILE" + msg "file content: $(cat "$TMP_FILE")" + + # @预期结果:2: 运行失败 + echo $$ > /sys/fs/cgroup/pids/tasks + if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g pids:cgroup-v1-pids-003/subcgroup + cgdelete -g pids:cgroup-v1-pids-003 + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From 2a05a70ad14d908637fc4dae1a28742ac54e8529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Mon, 5 Aug 2024 22:58:32 +0800 Subject: [PATCH 15/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84cpu?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 8 +- .../cgroup-v1-blkio-bfq-weight_device.sh" | 12 +- ...roup-v1-blkio-throttle-read_bps_device.sh" | 8 +- ...oup-v1-blkio-throttle-read_iops_device.sh" | 10 +- ...oup-v1-blkio-throttle-write_bps_device.sh" | 8 +- ...up-v1-blkio-throttle-write_iops_device.sh" | 10 +- .../tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" | 32 +++-- .../tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" | 12 +- .../testcase/cgroup-v1-cpu-shares.sh" | 40 +++--- .../testcase/cgroup-v1-cpuacct-stat.sh" | 10 +- .../testcase/cgroup-v1-cpuacct-usage.sh" | 10 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 10 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 10 +- .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 10 +- .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 10 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 10 +- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 10 +- .../cgroup-v1-cpuset-cpu_exclusive.sh" | 6 +- .../testcase/cgroup-v1-cpuset-cpus.sh" | 6 +- .../cgroup-v1-cpuset-mem_exclusive.sh" | 6 +- .../cgroup-v1-cpuset-mem_hardwall.sh" | 6 +- .../cgroup-v1-cpuset-memory_migrate.sh" | 8 +- .../cgroup-v1-cpuset-memory_pressure.sh" | 10 +- ...group-v1-cpuset-memory_spread_page-001.sh" | 6 +- ...group-v1-cpuset-memory_spread_page-002.sh" | 6 +- .../testcase/cgroup-v1-cpuset-mems.sh" | 6 +- ...group-v1-cpuset-sched_load_balance-001.sh" | 6 +- ...group-v1-cpuset-sched_load_balance-002.sh" | 6 +- .../testcase/cgroup-v1-devices-001.sh" | 12 +- .../testcase/cgroup-v1-devices-002.sh" | 14 ++- .../testcase/cgroup-v1-freezer-001.sh" | 12 +- .../testcase/cgroup-v1-freezer-002.sh" | 18 +-- .../cgroup-v1-hugetlb-limit_in_bytes-001.sh" | 12 +- .../cgroup-v1-hugetlb-limit_in_bytes-002.sh" | 12 +- .../cgroup-v1-hugetlb-limit_in_bytes-003.sh" | 10 +- .../cgroup-v1-hugetlb-limit_in_bytes-004.sh" | 12 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" | 10 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" | 12 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" | 10 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" | 12 +- .../cgroup-v1-memory-limit_in_bytes.sh" | 12 +- .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 12 +- .../cgroup-v1-memory-oom_control-001.sh" | 8 +- .../cgroup-v1-memory-oom_control-002.sh" | 10 +- .../cgroup-v1-memory-pressure_level.sh" | 8 +- .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 10 +- .../cgroup-v1-memory-swappiness-001.sh" | 8 +- .../cgroup-v1-memory-swappiness-002.sh" | 8 +- .../testcase/cgroup-v1-net_cls-001.sh" | 8 +- .../testcase/cgroup-v1-net_cls-002.sh" | 6 +- .../testcase/cgroup-v1-net_prio.sh" | 8 +- .../testcase/cgroup-v1-perf_event.sh" | 6 +- .../testcase/cgroup-v1-pids-001.sh" | 23 ++-- .../testcase/cgroup-v1-pids-002.sh" | 22 +++- .../testcase/cgroup-v1-pids-003.sh" | 19 ++- .../testcase/cgroup-v2-cpu-idle-001.sh" | 90 +++++++++++++ .../testcase/cgroup-v2-cpu-idle-002.sh" | 86 +++++++++++++ .../testcase/cgroup-v2-cpu-max-001.sh" | 86 +++++++++++++ .../testcase/cgroup-v2-cpu-max-002.sh" | 84 +++++++++++++ .../testcase/cgroup-v2-cpu-max-burst-001.sh" | 88 +++++++++++++ .../testcase/cgroup-v2-cpu-max-burst-002.sh" | 84 +++++++++++++ .../testcase/cgroup-v2-cpu-pressure-001.sh" | 77 ++++++++++++ .../testcase/cgroup-v2-cpu-pressure-002.sh" | 80 ++++++++++++ .../testcase/cgroup-v2-cpu-uclamp-min-001.sh" | 118 ++++++++++++++++++ .../testcase/cgroup-v2-cpu-uclamp-min-002.sh" | 102 +++++++++++++++ .../testcase/cgroup-v2-cpu-weight-001.sh" | 99 +++++++++++++++ .../testcase/cgroup-v2-cpu-weight-002.sh" | 96 ++++++++++++++ .../cgroup-v2-cpu-weight-nice-001.sh" | 93 ++++++++++++++ .../testcase/cgroup-v2-memory-max-001.sh" | 47 +++++++ .../testcase/cgroup-v2-memory-max-002.sh" | 47 +++++++ .../tst-cgroup/tst_lib/cpu_pressure_listener" | Bin 0 -> 16296 bytes .../tst_lib/cpu_pressure_listener.c" | 56 +++++++++ .../tst-cgroup/tst_lib/other_common.sh" | 16 ++- 73 files changed, 1768 insertions(+), 187 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" index ed84056..15c7a06 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -68,12 +72,12 @@ do_test() { dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE" & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight/tasks + echo $task_pid > "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight/tasks dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE2" & task_pid2=$! msg "task_pid2: $task_pid2" - echo $task_pid2 > /sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight2/tasks + echo $task_pid2 > "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight2/tasks sleep 15 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index 364dfb8..635ad3f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -73,19 +77,19 @@ do_test() { echo bfq >/sys/block/$cd_rom/queue/scheduler || return 1 # @测试步骤:5: 设置blkio.bfq.weight_device - echo "$disk_device 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device - echo "$cd_rom_device 500" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + echo "$disk_device 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + echo "$cd_rom_device 500" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device # @测试步骤:6: 启动两个dd进程 sync echo 3 >/proc/sys/vm/drop_caches dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE" & task_pid=$! - echo $task_pid >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/tasks + echo $task_pid >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/tasks dd iflag=direct if=/dev/$cd_rom of=/dev/null bs=1M count=1024 &>"$TMP_FILE2" & task_pid2=$! - echo $task_pid2 >/sys/fs/cgroup/blkio/cgroup-v1-blkio-bfq-weight_device/tasks + echo $task_pid2 >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/tasks sleep 15 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" index 773cdaf..00acccf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -56,10 +60,10 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.read_bps_device,限制速度为1MB/s - echo "$device_number 1048576" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device + echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_bps_device/tasks + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_bps_device/tasks dd iflag=direct if=$disk of=/dev/null bs=1M count=5 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index c27abb6..d6df4e5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -56,16 +60,16 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.read_iops_device,限制速度为100 IO/s - echo "$device_number 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device + echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device # @测试步骤:3: 启动一个fio进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/tasks + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/tasks dd iflag=direct if=$disk of=/dev/null bs=4k count=500 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" # @测试步骤:4: 获取fio进程 的读取速度 - read_iops=$(grep "$device_number Read" /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.io_serviced | awk '{print $3}') + read_iops=$(grep "$device_number Read" "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.io_serviced | awk '{print $3}') read_iops_per_second=$(echo "scale=2; $read_iops / $time" | bc) msg "read_iops: $read_iops_per_second" up_read_iops=110 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index d56b847..62d1500 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -56,10 +60,10 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.write_bps_device,限制速度为1MB/s - echo "$device_number 1048576" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device + echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_bps_device/tasks + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_bps_device/tasks dd if=$disk of=/tmp/testfile bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index e6df89f..62e9830 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -56,16 +60,16 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.write_iops_device,限制速度为100 IO/s - echo "$device_number 100" >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device + echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device # @测试步骤:3: 启动一个dd进程 - echo $$ >/sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/tasks + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/tasks dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" # @测试步骤:4: 获取fio进程的写入速度 - write_iops=$(grep "$device_number Write" /sys/fs/cgroup/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.io_serviced | awk '{print $3}') + write_iops=$(grep "$device_number Write" "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.io_serviced | awk '{print $3}') write_iops_per_second=$(echo "scale=2; $write_iops / $time" | bc) msg "write_iops_per_second: $write_iops_per_second" up_write_iops=110 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" index 3b62477..4bebaf5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" @@ -11,14 +11,17 @@ export TST_TS_T OPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" -cgroup="${g_tmpdir}/test_cgroup" +CGROUP="cgroup-v1-cpu-cfs" tc_setup() { msg "this is tc_setup" @@ -27,7 +30,7 @@ tc_setup() { skip_test "cgroup版本不是v1" fi # @预置条件: 创建一个新的cgroup - cgcreate -g cpu:/"${cgroup}" || return 1 + cgcreate -g cpu:/"${CGROUP}" || return 1 return 0 } @@ -35,24 +38,24 @@ do_test() { msg "this is do_test" # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us - echo 500000 >/sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_period_us - echo 400000 >/sys/fs/cgroup/cpu/"${cgroup}"/cpu.cfs_quota_us + echo 500000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_period_us + echo 400000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_quota_us # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup { while true; do :; done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpu/"${cgroup}"/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpu/$CGROUP/tasks sleep 3 # @测试步骤:3: 读取cpu.stat文件 - cpu_stat=$(cat /sys/fs/cgroup/cpu/"${cgroup}"/cpu.stat) + cpu_stat=$(cat "$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.stat) msg "cpu_stat: " msg "$cpu_stat" - # @预期结果:1: 验证cpu.stat文件中的nr_periods和nr_throttled,throttled_time + # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_time均不为零 nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') throttled_time=$(echo "$cpu_stat" | grep throttled_time | awk '{print $2}') @@ -63,16 +66,19 @@ do_test() { kill -9 $task_pid - assert_true [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ] && [ "$throttled_time" -gt 0 ] - + if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then + assert_true [ "$throttled_time" -gt 0 ] + else + assert_false [ true ] + fi + return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpu:/"${cgroup}" || return 1 - cgdelete -g cpu:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" index 92b209e..7eb16f4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" @@ -11,6 +11,10 @@ _TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -37,12 +41,12 @@ do_test() { msg "this is do_test" # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us - echo 1000000 >/sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us || return 1 - echo 800000 >/sys/fs/cgroup/cpu/test_cgroup/cpu.rt_runtime_us || return 1 + echo 1000000 >"$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_period_us || return 1 + echo 800000 >"$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_runtime_us || return 1 # @测试步骤:2: 验证设置 - period=$(cat /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_period_us) - runtime=$(cat /sys/fs/cgroup/cpu/test_cgroup/cpu.rt_runtime_us) + period=$(cat "$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_period_us) + runtime=$(cat "$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_runtime_us) # @预期结果:1:验证cpu.rt_period_us和cpu.rt_runtime_us是否正确设置 assert_true [ "$period" -eq 1000000 ] && [ "$runtime" -eq 800000 ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" index 8c204f4..6a79633 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" @@ -3,22 +3,26 @@ # @用例ID: 20240711-102849-220066922 # @用例名称: cgroup-v1-cpu-shares # @用例级别: 3 -# @用例标签:cgroup-v1 cpu shares +# @用例标签: cgroup-v1 cpu shares # @用例类型: 测试cpu.shares是否能完成按权重设定CPU分配 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" -cgroup1="${g_tmpdir}/cgroup1" -cgroup2="${g_tmpdir}/cgroup2" +PARENT_CGROUP="cgroup-v1-cpu-shares" +SUB_CGROUP1="cgroup-v1-cpu-shares/sub_cgroup01" +SUB_CGROUP2="cgroup-v1-cpu-shares/sub_cgroup02" tc_setup() { msg "this is tc_setup" @@ -27,33 +31,33 @@ tc_setup() { skip_test "cgroup版本不是v1" fi - # @预置条件:创建两个新的cgroup - cgcreate -g cpu:"$cgroup1" - cgcreate -g cpu:"$cgroup2" + # @预置条件:创建cgroup + cgcreate -g cpu:$PARENT_CGROUP + cgcreate -g cpu:$SUB_CGROUP1 + cgcreate -g cpu:$SUB_CGROUP2 return 0 } do_test() { msg "this is do_test" - # 测试步骤:1: 对不同的cgroup设置不同的cpu.shares值 - echo 2048 >/sys/fs/cgroup/cpu/"$cgroup1"/cpu.shares - echo 512 >/sys/fs/cgroup/cpu/"$cgroup2"/cpu.shares + echo 2048 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP1"/cpu.shares + echo 512 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP2"/cpu.shares # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 taskset 0x1 sh -c 'while true; do :; done' & task_pid1=$! - echo $task_pid1 >/sys/fs/cgroup/cpu/"$cgroup1"/tasks + echo $task_pid1 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP1"/tasks taskset 0x1 sh -c 'while true; do :; done' & task_pid2=$! - echo $task_pid2 >/sys/fs/cgroup/cpu/"$cgroup2"/tasks + echo $task_pid2 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP2"/tasks sleep 3 # @测试步骤:3: 获取两个cgroup的CPU使用时间 - usage1=$(cat /sys/fs/cgroup/cpu/"$cgroup1"/cpuacct.usage) - usage2=$(cat /sys/fs/cgroup/cpu/"$cgroup2"/cpuacct.usage) + usage1=$(cat "$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP1"/cpuacct.usage) + usage2=$(cat "$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP2"/cpuacct.usage) msg "usage1: $usage1" msg "usage2: $usage2" @@ -75,10 +79,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpu:/"$cgroup1" || return 1 - cgdelete -g cpu:/"$cgroup2" || return 1 - cgdelete -g cpu:/"$g_tmpdir" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + cgdelete -g cpu:/"$SUB_CGROUP1" || return 1 + cgdelete -g cpu:/"$SUB_CGROUP2" || return 1 + cgdelete -g cpu:/"$PARENT_CGROUP" || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" index 9bd59ef..3c6ce61 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前stat值,单位为USER_HZ - stat_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) + stat_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) msg "stat_before: $stat_before" # @测试步骤:2: 启动一个用户态和内核态混合任务并将其加入cgroup @@ -46,11 +50,11 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的stat值 - stat_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) + stat_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) msg "stat_after: $stat_after" # @预期结果:1: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" index 8535e1f..7ae9f39 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -35,20 +39,20 @@ do_test() { msg "Running test" # @测试步骤:1: 将脚本自身进程放入cgroup - echo $$ >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $$ >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks # @测试步骤:2: 运行一个CPU密集型任务 for i in {1..10000}; do echo "$i" >/dev/null; done # @测试步骤:3: 获取cpuacct.usage统计数据 - usage_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) + usage_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) msg "usage_before: $usage_before ns" # @测试步骤:4: 再运行一个CPU密集型任务 for i in {1..10000}; do echo "$i" >/dev/null; done # @测试步骤:5: 获取cpuacct.usage统计数据 - usage_after=$(sudo cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) + usage_after=$(sudo cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) msg "usage_after: $usage_after ns" # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况,即CPU使用时间增加 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" index 4718084..36d1516 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的usage_all值 - usage_all_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) + usage_all_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) msg "usage_all_before: " msg "$usage_all_before" @@ -47,11 +51,11 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的usage_all值 - usage_all_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) + usage_all_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) msg "usage_all_after: " msg "$usage_all_after" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index b5739f9..b67d73d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的每个CPU使用时间 - usage_percpu_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + usage_percpu_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_before: $usage_percpu_before" usage_percpu_before_first=$(echo "$usage_percpu_before" | awk '{print $1}') # @测试步骤:2: 启动一个CPU密集型任务并将其放入cgroup @@ -43,11 +47,11 @@ do_test() { } & task_pid=$! taskset -cp 0 $task_pid - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的每CPU使用时间 - usage_percpu_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + usage_percpu_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_after: $usage_percpu_after" usage_percpu_after_first=$(echo "$usage_percpu_after" | awk '{print $1}') # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index 2baeb43..ffcde1a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的所有任务在每个CPU上使用内核态CPU的时间 - usage_percpu_sys_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) + usage_percpu_sys_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) msg "usege_percpu_sys_before: $usage_percpu_sys_before" # @测试步骤:2: 启动一个内核态CPU密集型任务并将其放入cgroup @@ -46,11 +50,11 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用内核态CPU的时间 - usage_percpu_sys_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) + usage_percpu_sys_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) msg "usage_percpu_sys_after: $usage_percpu_sys_after" # @预期结果:1: diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index 51a83e9..b1f5049 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的所有任务在每个CPU上使用用户态CPU的时间 - usage_percpu_user_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + usage_percpu_user_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usege_percpu_user_before: $usage_percpu_user_before" # @测试步骤:2: 启动一个用户态CPU密集型任务并将其放入cgroup @@ -46,11 +50,11 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # 等待任务结束 # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用用户态CPU的时间 - usage_percpu_user_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + usage_percpu_user_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) msg "usage_percpu_user_after: $usage_percpu_user_after" # @预期结果:1: diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 7a76cf5..370504e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的内核态CPU使用时间 - usage_sys_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) + usage_sys_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) msg "usege_sys_before: $usage_sys_before ns" # @测试步骤:2: 启动一个内核态CPU密集型任务并将其放入cgroup @@ -46,11 +50,11 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的内核态CPU使用时间 - usage_sys_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) + usage_sys_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) msg "usage_sys_after: $usage_sys_after ns" # @预期结果:1: 验证统计数据是否正确反映了内核态CPU使用情况,即内核态CPU使用时间增加 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" index 771afdc..096d109 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -34,7 +38,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的用户态CPU使用时间 - usage_user_before=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) + usage_user_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) msg "usage_user_before: $usage_user_before ns" # @测试步骤:2: 启用一个用户态CPU密集型任务并将其放入cgroup @@ -46,11 +50,11 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks wait $task_pid # @测试步骤:3: 记录运行任务后的用户态CPU使用时间 - usage_user_after=$(cat /sys/fs/cgroup/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) + usage_user_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) msg "usage_user_after: $usage_user_after ns" # @预期结果:1: 验证统计数据是否正确反映了用户态CPU使用情况,即用户态CPU使用时间增加 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" index 6e62d0c..47bfd98 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -55,7 +59,7 @@ do_test() { done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpu_exclusive_1/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-cpu_exclusive_1/tasks sleep 3 # @测试步骤:4: 检查进程绑定的CPU diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" index 1b283d6..b79215a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -43,7 +47,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-cpus/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-cpus/tasks sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" index e72e833..9aeffe1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -67,7 +71,7 @@ do_test() { done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_exclusive_1/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mem_exclusive_1/tasks sleep 3 # @测试步骤:4: 检查进程绑定的NUMA节点 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" index 1a36c19..fc4b2f9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -69,7 +73,7 @@ do_test() { stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mem_hardwall/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mem_hardwall/tasks # @测试步骤:5: 不断检查numa节点的空闲内存并更新最小的空闲内存 num0_min_free_size=$num0_before_free_size diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" index cfeeb2d..1e62850 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -63,7 +67,7 @@ do_test() { done } & task_pid0=$! - echo $task_pid0 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-001/tasks + echo $task_pid0 >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_migrate-001/tasks msg "task_pid0: $task_pid0" { while true; do @@ -71,7 +75,7 @@ do_test() { done } & task_pid1=$! - echo $task_pid1 >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_migrate-002/tasks + echo $task_pid1 >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_migrate-002/tasks msg "task_pid1: $task_pid1" # @测试步骤:3: 修改cpuset.mems diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" index 6fa0dd9..47ae75c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -55,18 +59,18 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/tasks { stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s # stress-ng --vm 1 --vm-bytes 3G -t 10s } & task_pid2=$! msg "task_pid: $task_pid2" - echo $task_pid2 >/sys/fs/cgroup/cpuset/tasks + echo $task_pid2 >"$CGROUP_TOPDIR"/cpuset/tasks sleep 15 # 等待内存压力生效 - memory_pressure=$(cat /sys/fs/cgroup/cpuset/cpuset.memory_pressure) + memory_pressure=$(cat "$CGROUP_TOPDIR"/cpuset/cpuset.memory_pressure) msg "memory_pressure: $memory_pressure" # @预期结果:1: diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index 4d3ff7e..4daa0b5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -63,7 +67,7 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-001/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_spread_page-001/tasks # @测试步骤:4: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index bd5a593..0b084c2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -66,7 +70,7 @@ do_test() { } & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-memory_spread_page-002/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_spread_page-002/tasks # @测试步骤:5: 不断检查numa节点的FilePages大小 num0_max_file_pages=$node0_file_pages diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" index 1861d35..f655241 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -57,7 +61,7 @@ do_test() { } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-mems/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mems/tasks sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" index b393a48..f1f2a4b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -44,7 +48,7 @@ do_test() { # @测试步骤:2: 启动一个进程并将其放入cgroup taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" index 590dfc5..5d10b31 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -43,7 +47,7 @@ do_test() { # @测试步骤:2: 启动一个进程并将其放入cgroup taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & task_pid=$! - echo $task_pid >/sys/fs/cgroup/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks sleep 10 # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" index 923a808..23c8b99 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -51,17 +55,17 @@ do_test() { fi # @测试步骤:3: 限制所有设备访问 - echo "a *:* rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.deny + echo "a *:* rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.deny # @测试步骤:4: 查看允许访问设备的白名单 - whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.list) + whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.list) msg "whitelist: $whitelist" # @测试步骤:5: 允许访问设备 - echo "b $device_number rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.allow + echo "b $device_number rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.allow # @测试步骤:6: 查看允许访问设备的白名单 - whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-001/devices.list) + whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.list) msg "whitelist: $whitelist" # @预期结果:1: 允许访问设备的白名单包含设备号 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" index 4f3446b..5d0c057 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -43,13 +47,13 @@ do_test() { fi # @测试步骤:2: 限制subcgroup的所有设备访问 - echo "a *:* rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.deny + echo "a *:* rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.deny # @测试步骤:3: 允许subcgroup的硬盘设备访问 - echo "b $device_number_major:$device_number_minor rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.allow + echo "b $device_number_major:$device_number_minor rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.allow # @测试步骤:4: 查看subcgroup的允许访问设备的白名单 - whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.list) + whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.list) msg "whitelist_before: $whitelist" # @预期结果:1: subcgroup白名单中包硬盘设备 @@ -60,10 +64,10 @@ do_test() { fi # @测试步骤:5: 在父cgroup中禁用块设备访问(包含了硬盘设备) - echo "b *:* rwm" >/sys/fs/cgroup/devices/cgroup-v1-devices-002/devices.deny + echo "b *:* rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/devices.deny # @测试步骤:6: 查看subcgroup的允许访问设备的白名单 - whitelist=$(cat /sys/fs/cgroup/devices/cgroup-v1-devices-002/subcgroup/devices.list) + whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.list) msg "whitelist_after: $whitelist" # @预期结果:6: 此时subcgroup白名单将不再包含硬盘设备 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" index 8038684..53a9a0f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -33,7 +37,7 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 查看当前的freezer状态 - freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state) + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/freezer.state) # @预期结果:1: 当前cgroup状态为THAWED if [ "$freezer_state" == "THAWED" ]; then @@ -51,11 +55,11 @@ do_test() { done } & task_pid=$! - echo $task_pid >/sys/fs/cgroup/freezer/cgroup-v1-freezer-001/tasks + echo $task_pid >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/tasks sleep 5 # @测试步骤:3: 将cgroup状态设置为FROZEN - echo "FROZEN" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state + echo "FROZEN" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/freezer.state # @测试步骤:4: 进程再睡眠5秒 sleep 5 @@ -77,7 +81,7 @@ do_test() { fi # @测试步骤:6: 将cgroup状态设置为THAWED - echo "THAWED" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-001/freezer.state + echo "THAWED" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/freezer.state sleep 1 # @测试步骤:7: 获取文件最后更新 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" index 4110c00..4fd618c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -32,8 +36,8 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 查看父cgroup和subcgroup的状态 - freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state) - sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/freezer.state) + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) # @预期结果:1: 父cgroup状态和subcgroup状态为THAWED if [ "$freezer_state" == "THAWED" ] && [ "$sub_freezer_state" == "THAWED" ]; then @@ -44,11 +48,11 @@ do_test() { fi # @测试步骤:2: 冻结父cgroup - echo "FROZEN" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state + echo "FROZEN" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/freezer.state # @测试步骤:3: 查看父cgroup和subcgroup的状态 - freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/freezer.state) - sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/freezer.state) + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) # @预期结果:2: 父cgroup状态和subcgroup状态都为FROZEN if [ "$freezer_state" == "FROZEN" ] && [ "$sub_freezer_state" == "FROZEN" ]; then @@ -59,10 +63,10 @@ do_test() { fi # @测试步骤:4: 解冻subcgroup - echo "THAWED" >/sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state + echo "THAWED" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state # @测试步骤:5: 查看subcgroup状态 - sub_freezer_state=$(cat /sys/fs/cgroup/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) # @预期结果:3: subcgroup状态仍为FROZEN,因为此时父cgroup仍为FROZEN状态, subcgroup状态不会被有效更改 if [ "$sub_freezer_state" == "FROZEN" ]; then diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" index b05f325..80f39df 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -59,16 +63,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.limit_in_bytes + echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 2 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt - MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt大于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" index 5bb72ca..8854da6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -58,16 +62,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.limit_in_bytes + echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt - MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" index 392499a..88d41a4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -59,14 +63,14 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为512MB - echo 512M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.limit_in_bytes + echo 512M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.failcnt - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" index 11da570..20774d1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -59,16 +63,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为1024MB - echo 1024M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.limit_in_bytes + echo 1024M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.max_usage_in_bytes和hugetlb.1GB.failcnt - MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于1GB, failcnt等于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" index 89194bb..8a2f6f5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -59,14 +63,14 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.limit_in_bytes + echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 2 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.failcnt - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" index 9fa8af8..32f51fb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -58,16 +62,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.limit_in_bytes + echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.max_usage_in_bytes和hugetlb.2MB.rsvd.failcnt - MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" index db9af0b..3cbf83d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -59,14 +63,14 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 512M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.limit_in_bytes + echo 512M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" index 1a7c9f3..38de399 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -59,16 +63,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 1024M > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.limit_in_bytes + echo 1024M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/tasks + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/tasks "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt - MAX_USAGE=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat /sys/fs/cgroup/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt等于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" index 9e48940..b7e685b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -39,17 +43,17 @@ do_test() { cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.limit_in_bytes的次数 - max_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.max_usage_in_bytes) + max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/memory.max_usage_in_bytes) msg "max_usage_in_bytes: $max_usage_in_bytes" - failcnt=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.failcnt) + failcnt=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/memory.failcnt) msg "failcnt: $failcnt" # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-limit_in_bytes/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" index bb91626..4050b3d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -43,17 +47,17 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.memsw.limit_in_bytes的次数 - max_memsw_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.max_usage_in_bytes) + max_memsw_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.max_usage_in_bytes) msg "max_usage_in_bytes: $max_memsw_usage_in_bytes" - memsw_failcnt=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.failcnt) + memsw_failcnt=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.failcnt) msg "failcnt: $memsw_failcnt" # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" index e7d7cfb..70ababb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -39,11 +43,11 @@ do_test() { cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-001/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s # @测试步骤:3: 获取被oom_killer杀死的进程数 - oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-001/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-001/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" index 323d438..9bdb7ba 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -37,20 +41,20 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 禁用oom_control - echo 1 >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control + echo 1 >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-002/memory.oom_control # @测试步骤:2: 设置内存限制 cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-002/tasks stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s &>"$TMP_FILE" time=$(grep -oP '(?<=completed in )\d+\.\d+(?=s)' "$TMP_FILE") msg "time: $time" # @测试步骤:4: 获取被oom_killer杀死的进程数 - oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-oom_control-002/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-002/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" index 2ecbc95..3b79082 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -44,14 +48,14 @@ do_test() { if ! [ -f "${TST_TS_TOPDIR}/tst_lib/cgroup_event_listener" ]; then skip_test "cgroup_event_listener文件不存在, 请先在tst_lib目录下编译" fi - "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener /sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &>"$TMP_FILE" & + "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &>"$TMP_FILE" & # @测试步骤:2: 设置内存限制 cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-pressure_level cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-pressure_level # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-pressure_level/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-pressure_level/tasks stress-ng --vm 1 --vm-bytes 51M -t 1s # @预期结果:1: 临时文件应该非空,有内存压力通知 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" index 03bea50..bcf8d5e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -43,15 +47,15 @@ do_test() { cgset -r memory.soft_limit_in_bytes=50M cgroup-v1-memory-soft_limit_in_bytes # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-soft_limit_in_bytes/tasks stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s # @测试步骤:3: 获取cgroup的最大内存使用量 - max_usage_in_bytes=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.max_usage_in_bytes) + max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.max_usage_in_bytes) msg "max_usage_in_bytes: $max_usage_in_bytes" # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat /sys/fs/cgroup/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" index ac0de1f..665dc45 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -44,11 +48,11 @@ do_test() { cgset -r memory.swappiness=0 cgroup-v1-memory-swappiness-001 # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-001/tasks stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s # @测试步骤:4: 获取swap空间内存使用量 - swap_usage=$(grep swap /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-001/memory.stat | head -n 1 | awk '{print $2}') + swap_usage=$(grep swap "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-001/memory.stat | head -n 1 | awk '{print $2}') msg "swap_usage: $swap_usage" # @预期结果:1: swap空间内存使用量为0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" index 509686c..b0bde84 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -44,11 +48,11 @@ do_test() { cgset -r memory.swappiness=100 cgroup-v1-memory-swappiness-002 # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ >/sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/tasks + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-002/tasks stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s # @测试步骤:4: 获取swap空间内存使用量 - swap_usage=$(grep swap /sys/fs/cgroup/memory/cgroup-v1-memory-swappiness-002/memory.stat | head -n 1 | awk '{print $2}') + swap_usage=$(grep swap "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-002/memory.stat | head -n 1 | awk '{print $2}') msg "swap_usage: $swap_usage" # @预期结果:1: swap空间内存使用量大于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" index 3c3448e..a99732b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -54,7 +58,7 @@ do_test() { cgset -r net_cls.classid=0x100001 cgroup-v1-net_cls-001 # @预期结果:1: 检查是否设置成功 - classid=$(cat /sys/fs/cgroup/net_cls/cgroup-v1-net_cls-001/net_cls.classid) + classid=$(cat "$CGROUP_TOPDIR"/net_cls/cgroup-v1-net_cls-001/net_cls.classid) assert_true [ "$classid" = "1048577" ] # @测试步骤:4: 给lo接口添加新的队列规则 @@ -71,7 +75,7 @@ do_test() { task_pid=$! # @测试步骤:8: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 - echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-001/tasks + echo $$ >"$CGROUP_TOPDIR"/net_cls/cgroup-v1-net_cls-001/tasks iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" # @测试步骤:9: 获取iperf3的接收数据端的bitrate diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" index 1005c42..0284688 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -55,7 +59,7 @@ do_test() { task_pid=$! # @测试步骤:4: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 - echo $$ >/sys/fs/cgroup/net_cls/cgroup-v1-net_cls-002/tasks + echo $$ >"$CGROUP_TOPDIR"/net_cls/cgroup-v1-net_cls-002/tasks iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" # @测试步骤:5: 获取iperf3的接收数据端的bitrate diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" index d3006b8..799795c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -37,10 +41,10 @@ do_test() { fi # @测试步骤:2: 设置net_prio.ifpriomap - echo "lo 5" > /sys/fs/cgroup/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap + echo "lo 5" > "$CGROUP_TOPDIR"/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap # @测试步骤:3: 获取net_prio.ifpriomap配置 - ifpriomap=$(cat /sys/fs/cgroup/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap) + ifpriomap=$(cat "$CGROUP_TOPDIR"/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap) io_ifpriomap=$(echo "$ifpriomap" | grep "lo" | awk '{print $2}') msg "io_ifpriomap: $io_ifpriomap" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" index 3515e5e..341b52a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -37,7 +41,7 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 启动一个进程并将其加入cgroup - echo $$ > /sys/fs/cgroup/perf_event/cgroup-v1-perf_event/tasks + echo $$ > "$CGROUP_TOPDIR"/perf_event/cgroup-v1-perf_event/tasks stress-ng --cpu 1 --timeout 5s & sleep 3 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" index bac9295..8519220 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" @@ -10,12 +10,18 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +TMP_FILE=$(mktemp) + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -32,24 +38,25 @@ tc_setup() { return 0 } -TMP_FILE=$(mktemp) - do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > /sys/fs/cgroup/pids/cgroup-v1-pids-001/pids.max + echo 2 > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-001/pids.max # @测试步骤:2: 将当前shell加入cgroup - echo $$ > /sys/fs/cgroup/pids/cgroup-v1-pids-001/tasks + echo $$ > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-001/tasks # @测试步骤:3: 运行两个子进程 (echo "Here's some processes for you." | cat) &> "$TMP_FILE" - msg "file content: $(cat "$TMP_FILE")" + echo $$ > "$CGROUP_TOPDIR"/pids/tasks + + # @测试步骤:4: 获取超过最大进程数的次数 + FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-001/pids.events | awk '{print $2}') + msg "failcnt: $FAILCNT" # @预期结果:1: 运行失败 - echo $$ > /sys/fs/cgroup/pids/tasks - if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then - assert_true [ true ] + if grep -q "Resource temporarily unavailable" "$TMP_FILE" ; then + assert_true [ "$FAILCNT" -gt 0 ] else assert_false [ true ] fi diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" index c616a24..7a67125 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -37,18 +41,26 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > /sys/fs/cgroup/pids/cgroup-v1-pids-002/pids.max + echo 2 > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.max # @测试步骤:2: 将当前shell加入cgroup - echo $$ > /sys/fs/cgroup/pids/cgroup-v1-pids-002/tasks + echo $$ > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/tasks # @测试步骤:3: 运行进程并获取pids.current - PID_NUM=$(cat /sys/fs/cgroup/pids/cgroup-v1-pids-002/pids.current) + PID_NUM=$(cat "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.current) msg "pids.current: $PID_NUM" + echo $$ > "$CGROUP_TOPDIR"/pids/tasks + + # @测试步骤:4: 获取超过最大进程数的次数 + FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.events | awk '{print $2}') + msg "failcnt: $FAILCNT" # @预期结果:1: PID_NUM为2 - echo $$ > /sys/fs/cgroup/pids/tasks - assert_true [ "$PID_NUM" -eq 2 ] + if [ "$PID_NUM" -eq 2 ]; then + assert_true [ "$FAILCNT" -eq 0 ] + else + assert_false [ true ] + fi return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" index e0c88db..719e90c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" @@ -10,6 +10,10 @@ TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null @@ -38,26 +42,29 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > /sys/fs/cgroup/pids/cgroup-v1-pids-003/pids.max + echo 2 > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/pids.max # @测试步骤:2: 获取subcgroup的pids.max - PID_MAX=$(cat /sys/fs/cgroup/pids/cgroup-v1-pids-003/subcgroup/pids.max) + PID_MAX=$(cat "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/subcgroup/pids.max) msg "subcgroup pids.max: $PID_MAX" # @预期结果:1: subcgroup的pids.max为max assert_true [ "$PID_MAX" = "max" ] # @测试步骤:3: 将当前shell加入subcgroup - echo $$ > /sys/fs/cgroup/pids/cgroup-v1-pids-003/subcgroup/tasks + echo $$ > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/subcgroup/tasks # @测试步骤:4: 运行了两个子进程 (echo "Here's some processes for you." | cat) &> "$TMP_FILE" - msg "file content: $(cat "$TMP_FILE")" + echo $$ > "$CGROUP_TOPDIR"/pids/tasks + + # @测试步骤:5: 获取超过最大进程数的次数 + FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/subcgroup/pids.events | awk '{print $2}') + msg "failcnt: $FAILCNT" # @预期结果:2: 运行失败 - echo $$ > /sys/fs/cgroup/pids/tasks if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then - assert_true [ true ] + assert_true [ "$FAILCNT" -gt 0 ] else assert_false [ true ] fi diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" new file mode 100755 index 0000000..8c60618 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" @@ -0,0 +1,90 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-223037-169024376 +# @用例名称: cgroup-v2-cpu-idle-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu idle +# @用例类型: 测试cpu.idle接口文件,设置SCHD_IDLE调度策略 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-idle-001" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpu.idle值 + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cpu.idle + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo $task_pid1 > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + # @测试步骤:3: 启动另一个占用CPU的进程 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + + # @测试步骤:4: 使用top命令循环获取task_pid的cpu利用率 + total_cpu_usage=0 + for _ in $(seq 1 10); do + top -b -n 1 -p $task_pid1 > "$TMP_FILE" + cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') + msg "CPU usage: $cpu_usage" + total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) + sleep 1 + done + aver_cpu_usage=$(echo "scale=2; $total_cpu_usage / 10" | bc) + msg "average CPU usage: $aver_cpu_usage" + + # @预期结果:1: 在误差范围内,task_pid的cpu利用率应该为0 + kill -9 $task_pid1 $task_pid2 + aver_cpu_usage_max=5 + assert_true [ "$(echo "$aver_cpu_usage <= $aver_cpu_usage_max" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" new file mode 100755 index 0000000..c84cddb --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-223054-480591007 +# @用例名称: cgroup-v2-cpu-idle-002.sh +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu idle +# @用例类型: 测试cpu.idle接口文件,不设置SCHD_IDLE调度策略 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-idle-002" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启动一个占用CPU的进程,并将其放入cgroup + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo $task_pid1 > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + # @测试步骤:2: 启动另一个占用CPU的进程 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + + # @测试步骤:3: 使用top命令循环获取task_pid的cpu利用率 + total_cpu_usage=0 + for _ in $(seq 1 10); do + top -b -n 1 -p $task_pid1 > "$TMP_FILE" + cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') + msg "CPU usage: $cpu_usage" + total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) + sleep 1 + done + aver_cpu_usage=$(echo "scale=2; $total_cpu_usage / 10" | bc) + msg "average CPU usage: $aver_cpu_usage" + + # @预期结果:1: 在误差范围内,task_pid1的cpu利用率不为0 + kill -9 $task_pid1 $task_pid2 + assert_true [ "$(echo "$aver_cpu_usage > 0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" new file mode 100755 index 0000000..9f181e0 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-180942-698874070 +# @用例名称: cgroup-v2-cpu-max-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu max +# @用例类型: 测试cpu.max接口文件,设置限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-max-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpu.max值 + echo "500000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + sleep 3 + + # @测试步骤:3: 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) + msg "cpu_stat: " + msg "$cpu_stat" + nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') + nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') + throttled_usec=$(echo "$cpu_stat" | grep throttled_usec | awk '{print $2}') + kill -9 $task_pid + + # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_usec均不为零 + if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then + assert_true [ "$throttled_usec" -gt 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" new file mode 100755 index 0000000..550ff84 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" @@ -0,0 +1,84 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-223009-206912194 +# @用例名称: cgroup-v2-cpu-max-002 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu max +# @用例类型: 测试cpu.max接口文件,不设置限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-max-002" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + sleep 3 + + # @测试步骤:2: 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) + msg "cpu_stat: " + msg "$cpu_stat" + nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') + nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') + throttled_usec=$(echo "$cpu_stat" | grep throttled_usec | awk '{print $2}') + kill -9 $task_pid + + # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_usec均等于零 + if [ "$nr_periods" -eq 0 ] && [ "$nr_throttled" -eq 0 ]; then + assert_true [ "$throttled_usec" -eq 0 ] + else + assert_false [ true ] + fi + + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" new file mode 100755 index 0000000..14e3226 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" @@ -0,0 +1,88 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-223507-640719663 +# @用例名称: cgroup-v2-cpu-max-burst-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu max burst +# @用例类型: 测试cpu.max.burst接口文件,设置限制,并设置burst时间 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-max-burst-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpu.max值 + echo "500000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max + + # @测试步骤:2: 设置cpu.max.burst值 + echo "200000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max.burst + + # @测试步骤:3: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 3 + + # @测试步骤:4: 读取cpu.stat文件 + 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) + msg "cpu_stat: " + msg "$cpu_stat" + nr_bursts=$(echo "$cpu_stat" | grep nr_bursts | awk '{print $2}') + burst_usec=$(echo "$cpu_stat" | grep burst_usec | awk '{print $2}') + kill -9 $task_pid + + # @预期结果:1: cpu.stat文件中的burst_usec和nr_bursts均大于0 + if [ "$nr_bursts" -gt 0 ] ; then + assert_true [ "$burst_usec" -eq 200000 ] + else + assert_false [ true ] + fi + + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" new file mode 100755 index 0000000..b6ec3d4 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" @@ -0,0 +1,84 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-224758-298815496 +# @用例名称: cgroup-v2-cpu-max-burst-002 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu max burst +# @用例类型: 测试cpu.max.burst接口文件,设置限制,不设置burst时间 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-max-burst-002" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpu.max值 + echo "500000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 3 + + # @测试步骤:3: 读取cpu.stat文件 + 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) + msg "cpu_stat: " + msg "$cpu_stat" + nr_bursts=$(echo "$cpu_stat" | grep nr_bursts | awk '{print $2}') + burst_usec=$(echo "$cpu_stat" | grep burst_usec | awk '{print $2}') + kill -9 $task_pid + + # @预期结果:1: cpu.stat文件中的burst_usec和nr_bursts均等于0 + if [ "$nr_bursts" -eq 0 ] ; then + assert_true [ "$burst_usec" -eq 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" new file mode 100755 index 0000000..defc719 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" @@ -0,0 +1,77 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-225021-343953847 +# @用例名称: cgroup-v2-cpu-pressure-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu pressure +# @用例类型: 测试cpu.pressure接口文件,读取压力状态 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-pressure-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 运行两个压力测试并将其运行在一个CPU核心上 + taskset -c 0 stress-ng --cpu 1 --timeout 10 & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + taskset -c 0 stress-ng --cpu 1 --timeout 10 & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 5 + + # @测试步骤:2: 读取cpu.pressure文件 + cpu_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure) + msg "cpu_pressure: " + msg "$cpu_pressure" + avg10=$(echo "$cpu_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') + msg "avg10: $avg10" + + # @预期结果:1: avg10值应该大于0 + assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" new file mode 100755 index 0000000..917ada4 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" @@ -0,0 +1,80 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-234007-224181376 +# @用例名称: cgroup-v2-cpu-pressure-002 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu pressure +# @用例类型: 测试cpu.pressure接口文件,注册触发器 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +TMP_FILE=$(mktemp) +CGROUP="cgroup-v2-cpu-pressure-002" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 注册触发器 + stdbuf -oL "${TST_TS_TOPDIR}"/tst_lib/cpu_pressure_listener &> "$TMP_FILE" & + + # @测试步骤:2: 运行两个压力测试并将其运行在一个CPU核心上 + taskset -c 0 stress-ng --cpu 1 --timeout 10 & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + taskset -c 0 stress-ng --cpu 1 --timeout 10 & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 5 + + # @预期结果:1: 触发器应该被触发 + if grep -q "event triggered" "$TMP_FILE"; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" new file mode 100755 index 0000000..7e3556d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" @@ -0,0 +1,118 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-132549-636092226 +# @用例名称: cgroup-v2-cpu-uclamp-min-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu uclamp min +# @用例类型: 测试cpu.uclamp.min接口文件,设置了最小利用率 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +PARENT_CGROUP="cgroup-v2-cpu-uclamp-min-001" +CGROUP="cgroup-v2-cpu-uclamp-min-001-pare" +SUB_CGROUP1="cgroup-v2-cpu-uclamp-min-001/sub_cgroup01" +SUB_CGROUP2="cgroup-v2-cpu-uclamp-min-001/sub_cgroup02" +TMP_FILE=$(mktemp) + + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置sub_cgroup1的cpu.uclamp.min为50% + echo 50 > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cpu.uclamp.min + + # @测试步骤:2: sub_cgroup1运行一个占用CPU1的进程,sub_cgroup2运行两个占用CPU1的进程 + echo $$ > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.procs + taskset 0x1 sh -c 'while true; do :; done' & + + # echo "$task_pid1" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.procs + # echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + # taskset 0x1 sh -c 'while true; do :; done' & + # task_pid2=$! + + # taskset 0x1 sh -c 'while true; do :; done' & + # task_pid2=$! + # echo $task_pid2 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs + # taskset 0x1 sh -c 'while true; do :; done' & + # task_pid3=$! + # echo $task_pid3 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs + # taskset 0x1 sh -c 'while true; do :; done' & + # task_pid4=$! + # echo $task_pid4 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs + + # @测试步骤:3: 使用top命令循环获取task_pid的cpu利用率 + # total_cpu_usage=0 + # for _ in $(seq 1 10); do + # top -b -n 1 -p $task_pid1 > "$TMP_FILE" + # cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') + # msg "CPU usage: $cpu_usage" + # total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) + # sleep 1 + # done + # aver_cpu_usage=$(echo "scale=2; $total_cpu_usage / 10" | bc) + # msg "average CPU usage: $aver_cpu_usage" + + # @预期结果:1: 在误差范围内,task_pid1的cpu利用率为50% + # kill -9 $task_pid1 + # sleep 3 + # aver_cpu_usage_max=55 + # aver_cpu_usage_min=45 + # if [ "$(echo "$aver_cpu_usage >= $aver_cpu_usage_min" | bc)" -eq 1 ] && [ "$(echo "$aver_cpu_usage <= $aver_cpu_usage_max" | bc)" -eq 1 ]; then + # assert_true [ true ] + # else + # assert_false [ true ] + # fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" new file mode 100755 index 0000000..304c681 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" @@ -0,0 +1,102 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-205424-093934808 +# @用例名称: cgroup-v2-cpu-uclamp-min-002 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu uclamp min +# @用例类型: 测试cpu.uclamp.min接口文件,不设置最小利用率 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +PARENT_CGROUP="cgroup-v2-cpu-uclamp-min-002" +SUB_CGROUP1="cgroup-v2-cpu-uclamp-min-002/sub_cgroup01" +SUB_CGROUP2="cgroup-v2-cpu-uclamp-min-002/sub_cgroup02" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: sub_cgroup1运行一个占用CPU1的进程,sub_cgroup2运行两个占用CPU1的进程 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo "$task_pid1" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.procs + + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + echo $task_pid2 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs + taskset 0x1 sh -c 'while true; do :; done' & + task_pid3=$! + echo $task_pid3 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs + + # @测试步骤:2: 使用top命令循环获取task_pid的cpu利用率 + total_cpu_usage=0 + for _ in $(seq 1 10); do + top -b -n 1 -p $task_pid1 > "$TMP_FILE" + cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') + msg "CPU usage: $cpu_usage" + total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) + sleep 1 + done + aver_cpu_usage=$(echo "scale=2; $total_cpu_usage / 10" | bc) + msg "average CPU usage: $aver_cpu_usage" + + # @预期结果:1: 在误差范围内,task_pid1的cpu利用率为50% + kill -9 $task_pid1 $task_pid2 $task_pid3 + # aver_cpu_usage_max=55 + # aver_cpu_usage_min=45 + # if [ "$(echo "$aver_cpu_usage >= $aver_cpu_usage_min" | bc)" -eq 1 ] && [ "$(echo "$aver_cpu_usage <= $aver_cpu_usage_max" | bc)" -eq 1 ]; then + # assert_true [ true ] + # else + # assert_false [ true ] + # fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" new file mode 100755 index 0000000..56600ce --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" @@ -0,0 +1,99 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-155658-686144114 +# @用例名称: cgroup-v2-cpu-weight-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu weight +# @用例类型: 测试cpu.weight接口文件,设置了权重 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +PARENT_CGROUP="cgroup-v2-cpu-weight-001" +SUB_CGROUP1="cgroup-v2-cpu-weight-001/sub_cgroup01" +SUB_CGROUP2="cgroup-v2-cpu-weight-001/sub_cgroup02" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 对不同的cgroup设置不同的cpu.weight值 + echo 2048 >"$CGROUP_TOPDIR"/$SUB_CGROUP1/cpu.weight + echo 512 >"$CGROUP_TOPDIR"/$SUB_CGROUP2/cpu.weight + + # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cgroup.procs + + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cgroup.procs + + sleep 3 + + # @测试步骤:3: 获取两个sub_cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cpu.stat | awk '{print $2}') + msg "cpu usage usec1: $cpu_usage_usec1" + msg "cpu usage usec2: $cpu_usage_usec2" + kill -9 $task_pid1 + kill -9 $task_pid2 + + # @预期结果:1: 验证CPU使用时间比例是否符合预期,4:1 + usage_ratio=$(echo "scale=2; $cpu_usage_usec1 / $cpu_usage_usec2 + 0.5" | bc) + usage_ratio=$(printf "%.0f" "$usage_ratio") + msg "usage_ratio: $usage_ratio" + + expected_ratio=$(echo "2048 / 512" | bc) + msg "expected_ratio: $expected_ratio" + + assert_true [ "$(echo "$usage_ratio == $expected_ratio" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" new file mode 100755 index 0000000..1fe32c8 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" @@ -0,0 +1,96 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-174805-982987650 +# @用例名称: cgroup-v2-cpu-weight-002 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu weight +# @用例类型: 测试cpu.weight接口文件,不设置权重 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +PARENT_CGROUP="cgroup-v2-cpu-weight-002" +SUB_CGROUP1="cgroup-v2-cpu-weight-002/sub_cgroup01" +SUB_CGROUP2="cgroup-v2-cpu-weight-002/sub_cgroup02" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cgroup.procs + + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cgroup.procs + + sleep 3 + + # @测试步骤:2: 获取两个cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cpu.stat | awk '{print $2}') + msg "cpu usage usec1: $cpu_usage_usec1" + msg "cpu usage usec2: $cpu_usage_usec2" + kill -9 $task_pid1 + kill -9 $task_pid2 + + # @预期结果:1: 验证CPU使用时间比例是否符合预期,不为4:1 + usage_ratio=$(echo "scale=2; $cpu_usage_usec1 / $cpu_usage_usec2 + 0.5" | bc) + usage_ratio=$(printf "%.0f" "$usage_ratio") + msg "usage_ratio: $usage_ratio" + + unexpected_ratio=$(echo "2048 / 512" | bc) + msg "expected_ratio: $unexpected_ratio" + + assert_true [ "$(echo "$usage_ratio != $unexpected_ratio" | bc)" -eq 1 ] + + return 0 +} + + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" new file mode 100755 index 0000000..6a6bd7c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" @@ -0,0 +1,93 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-175245-433198185 +# @用例名称: cgroup-v2-cpu-weight-nice-001 +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu weight nice +# @用例类型: 测试cpu.weight.nice接口文件,设置了优先级 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +PARENT_CGROUP="cgroup-v2-cpu-weight-nice-001" +SUB_CGROUP1="cgroup-v2-cpu-weight-nice-001/sub_cgroup01" +SUB_CGROUP2="cgroup-v2-cpu-weight-nice-001/sub_cgroup02" + + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 对不同的cgroup设置不同的cpu.weight.nice值 + echo 10 >"$CGROUP_TOPDIR"/$SUB_CGROUP1/cpu.weight.nice + echo 0 >"$CGROUP_TOPDIR"/$SUB_CGROUP2/cpu.weight.nice + + # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 + taskset 0x1 sh -c 'while true; do :; done' & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cgroup.procs + + taskset 0x1 sh -c 'while true; do :; done' & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cgroup.procs + + sleep 3 + + # @测试步骤:3: 获取两个cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cpu.stat | awk '{print $2}') + msg "cpu usage usec1: $cpu_usage_usec1" + msg "cpu usage usec2: $cpu_usage_usec2" + kill -9 $task_pid1 + kill -9 $task_pid2 + + # @预期结果:1: 验证CPU使用时间比例是否符合预期,cgroup1小于cgroup2 + assert_true [ "$cpu_usage_usec1" -lt "$cpu_usage_usec2" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 + rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" new file mode 100755 index 0000000..ba4c24d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" @@ -0,0 +1,47 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-225552-969242515 +# @用例名称: cgroup-v2-memory-max-001 +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: + # @预置条件: + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: + + # @测试步骤:2: + + # @测试步骤:3: + # @预期结果:3: + assert_true [ 1 -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" new file mode 100755 index 0000000..3c085a9 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" @@ -0,0 +1,47 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-225554-315839228 +# @用例名称: cgroup-v2-memory-max-002 +# @用例级别: 3 +# @用例标签: +# @用例类型: 功能 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: + # @预置条件: + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: + + # @测试步骤:2: + + # @测试步骤:3: + # @预期结果:3: + assert_true [ 1 -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener" new file mode 100755 index 0000000000000000000000000000000000000000..01a18eaf033313e767addeb045e9a22374ba9f42 GIT binary patch literal 16296 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" new file mode 100644 index 0000000..503451e --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include + +int main() +{ + const char trig[] = "some 500000 1000000"; + struct pollfd fds; + int n; + + fds.fd = open("/sys/fs/cgroup/cgroup-v2-cpu-pressure-002/cpu.pressure", O_RDWR | O_NONBLOCK); + if (fds.fd < 0) + { + printf("/sys/fs/cgroup/cgroup-v2-cpu-pressure-002/cpu.pressure open error: %s\n", + strerror(errno)); + return 1; + } + fds.events = POLLPRI; + + if (write(fds.fd, trig, strlen(trig) + 1) < 0) + { + printf("/sys/fs/cgroup/cgroup-v2-cpu-pressure-002/cpu.pressure write error: %s\n", + strerror(errno)); + return 1; + } + + printf("waiting for events...\n"); + while (1) + { + n = poll(&fds, 1, -1); + if (n < 0) + { + printf("poll error: %s\n", strerror(errno)); + return 1; + } + if (fds.revents & POLLERR) + { + printf("got POLLERR, event source is gone\n"); + return 0; + } + if (fds.revents & POLLPRI) + { + printf("event triggered!\n"); + } + else + { + printf("unknown event received: 0x%x\n", fds.revents); + return 1; + } + } + + return 0; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" index 4859c05..ef1592e 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" @@ -74,7 +74,7 @@ is_numactl_installed() { # 检查cgroup版本是否为cgroup v1 check_cgroup_version_is_v1() { - if [ "$(stat -fc %T /sys/fs/cgroup)" = "tmpfs" ]; then + if [ "$(stat -fc %T "$CGROUP_TOPDIR")" = "tmpfs" ]; then return 0 else return 1 @@ -82,9 +82,21 @@ check_cgroup_version_is_v1() { } # 检查cgroup版本是否为cgroup v2 check_cgroup_version_is_v2() { - if [ "$(stat -fc %T /sys/fs/cgroup)" = "cgroup2fs" ]; then + if [ "$(stat -fc %T "$CGROUP_TOPDIR")" = "cgroup2fs" ]; then return 0 else return 1 fi +} + +# 检查文件中是否包含指定字符串 +check_string_in_file() { + local string="$1" + local file="$2" + + if grep -q "$string" "$file"; then + return 0 + else + return 1 + fi } \ No newline at end of file -- Gitee From 3a717f3052c16ed3a5013d6acbb2c93d86b00bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 7 Aug 2024 22:44:07 +0800 Subject: [PATCH 16/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84mem?= =?UTF-8?q?ory=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...roup-v1-memory-soft_limit_in_bytes-001.sh" | 87 ++++++++++ .../testcase/cgroup-v2-cpu-idle-001.sh" | 6 +- .../testcase/cgroup-v2-cpu-idle-002.sh" | 4 +- .../testcase/cgroup-v2-cpu-max-001.sh" | 4 +- .../testcase/cgroup-v2-cpu-max-002.sh" | 4 +- .../testcase/cgroup-v2-cpu-max-burst-001.sh" | 4 +- .../testcase/cgroup-v2-cpu-max-burst-002.sh" | 5 +- .../testcase/cgroup-v2-cpu-pressure.sh" | 90 ++++++++++ .../testcase/cgroup-v2-cpu-uclamp-min-001.sh" | 6 +- .../testcase/cgroup-v2-cpu-uclamp-min-002.sh" | 6 +- .../testcase/cgroup-v2-cpu-weight-001.sh" | 5 +- .../testcase/cgroup-v2-cpu-weight-002.sh" | 5 +- .../cgroup-v2-cpu-weight-nice-001.sh" | 5 +- .../testcase/cgroup-v2-memory-current.sh" | 112 ++++++++++++ .../testcase/cgroup-v2-memory-high-001.sh" | 138 +++++++++++++++ .../testcase/cgroup-v2-memory-high-002.sh" | 101 +++++++++++ .../testcase/cgroup-v2-memory-low.sh" | 163 ++++++++++++++++++ .../testcase/cgroup-v2-memory-max.sh" | 115 ++++++++++++ .../testcase/cgroup-v2-memory-min.sh" | 160 +++++++++++++++++ .../testcase/cgroup-v2-memory-oom-events.sh" | 90 ++++++++++ .../cgroup-v2-memory-oom-group-001.sh" | 108 ++++++++++++ .../cgroup-v2-memory-oom-group-002.sh" | 106 ++++++++++++ .../cgroup-v2-memory-oom-group-003.sh" | 104 +++++++++++ .../testcase/cgroup-v2-memory-pressure.sh" | 97 +++++++++++ .../testcase/cgroup-v2-memory-reclaim-001.sh" | 102 +++++++++++ .../testcase/cgroup-v2-memory-reclaim-002.sh" | 101 +++++++++++ .../testcase/cgroup-v2-memory-swap-high.sh" | 131 ++++++++++++++ .../testcase/cgroup-v2-memory-swap-max.sh" | 138 +++++++++++++++ .../testcase/cgroup-v2-memory-zswap.sh" | 105 +++++++++++ .../tst-cgroup/tst_lib/cgroup_util/Makefile" | 21 +++ .../tst_lib/cgroup_util/alloc_anon.c" | 55 ++++++ .../tst_lib/cgroup_util/alloc_anon_mlock.c" | 57 ++++++ .../tst_lib/cgroup_util/alloc_pagecache.c" | 85 +++++++++ .../tst_lib/cgroup_util/bin/alloc_anon" | Bin 0 -> 16312 bytes .../tst_lib/cgroup_util/bin/alloc_anon_mlock" | Bin 0 -> 16368 bytes .../tst_lib/cgroup_util/bin/alloc_pagecache" | Bin 0 -> 16552 bytes .../cgroup_util/bin/cgroup_event_listener" | Bin 0 -> 16656 bytes .../cgroup_util/bin/pressure_listener" | Bin 16296 -> 16296 bytes .../tst_lib/cgroup_util/bin/register_notify" | Bin 0 -> 16568 bytes .../cgroup_util/cgroup_event_listener.c" | 76 ++++++++ .../tst_lib/cgroup_util/pressure_listener.c" | 20 ++- .../tst_lib/cgroup_util/register_notify.c" | 75 ++++++++ 42 files changed, 2455 insertions(+), 36 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/Makefile" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon_mlock" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_pagecache" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/pressure_listener" (61%) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/register_notify" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" rename "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" => "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/pressure_listener.c" (69%) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/register_notify.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" new file mode 100755 index 0000000..ce2d139 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" @@ -0,0 +1,87 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240723-133429-048617311 +# @用例名称: cgroup-v1-memory-soft_limit_in_bytes-001 +# @用例级别: 2 +# @用例标签: cgroup-v1 memory soft_limit_in_bytes +# @用例类型: 测试memory.soft_limit_in_bytes控制文件,设置限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v1-memory-soft_limit_in_bytes-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 检查是否开启了CONFIG_MEMCG配置 + if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_MEMCG配置未开启" + fi + # @预置条件: 检查是否没有CONFIG_PREEMPT_RT配置 + if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_PREEMPT_RT配置开启" + fi + + # @预置条件: 创建一个cgroup + cgcreate -g memory:$CGROUP + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间并设置cgroup的内存限制为50M + swapoff -a + cgset -r memory.soft_limit_in_bytes=50M $CGROUP + + # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s + + # @测试步骤:3: 获取cgroup的最大内存使用量 + max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.max_usage_in_bytes) + msg "max_usage_in_bytes: $max_usage_in_bytes" + + # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 + oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) + oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') + msg "oom_kill: $oom_kill" + + # @预期结果:1: 最大内存使用量超过了50M且oom_kill等于0 + if [ "$max_usage_in_bytes" -gt "52428800" ]; then + assert_true [ "$oom_kill" -eq "0" ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 开启系统的交换空间 + swapon -a + # @清理工作: 清空所有内存页 + cgset -r memory.force_empty=0 $CGROUP + # @清理工作: 删除cgroup + cgdelete -g memory:$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" index 8c60618..c9ae0f5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" @@ -32,12 +32,12 @@ tc_setup() { # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + # @预置条件: 检查父cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" index c84cddb..ed927a0 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" @@ -33,11 +33,11 @@ tc_setup() { # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" index 9f181e0..b4d3b4b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" @@ -32,11 +32,11 @@ tc_setup() { # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" index 550ff84..dbe1c32 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" @@ -32,11 +32,11 @@ tc_setup() { # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" index 14e3226..8e6a24c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" @@ -32,11 +32,11 @@ tc_setup() { # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" index b6ec3d4..2f56400 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" @@ -32,11 +32,12 @@ tc_setup() { # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" new file mode 100755 index 0000000..b9d2ddc --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" @@ -0,0 +1,90 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-225021-343953847 +# @用例名称: cgroup-v2-cpu-pressure +# @用例级别: 3 +# @用例标签: cgroup-v2 cpu pressure +# @用例类型: 测试cpu.pressure接口文件,设置CPU压力通知 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-pressure" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 注册触发器 + stdbuf -oL "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure &> "$TMP_FILE" & + + # @测试步骤:1: 运行两个压力测试并将其运行在一个CPU核心上 + taskset -c 0 stress-ng --cpu 1 --timeout 10 & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + taskset -c 0 stress-ng --cpu 1 --timeout 10 & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 5 + + # @测试步骤:2: 读取cpu.pressure文件 + cpu_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure) + msg "cpu_pressure: " + msg "$cpu_pressure" + avg10=$(echo "$cpu_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') + msg "avg10: $avg10" + + # @预期结果:1: avg10值应该大于0 + assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] + + # @预期结果:2: 触发器应该被触发 + if grep -q "event triggered" "$TMP_FILE"; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" index 7e3556d..711f98b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" @@ -41,13 +41,13 @@ tc_setup() { mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" index 304c681..d5efa5d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" @@ -37,13 +37,13 @@ tc_setup() { mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" index 56600ce..e1e73f5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" @@ -36,13 +36,12 @@ tc_setup() { mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" index 1fe32c8..1d523dd 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" @@ -36,13 +36,12 @@ tc_setup() { mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" index 6a6bd7c..53e7f02 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" @@ -37,13 +37,12 @@ tc_setup() { mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$PARENT_CGROUP/cgroup.controllers"; then + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 + echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" new file mode 100755 index 0000000..c37309f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" @@ -0,0 +1,112 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-235307-525430290 +# @用例名称: cgroup-v2-memory-current +# @用例级别: 3 +# @用例标签: cgroup-v2 memory current +# @用例类型: 测试memory.current接口文件,分配一些匿名内存和页缓存,查看memory.current的值 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-current" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 读取memory.current的值 + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + + # @预期结果:1: memory.current的值为0 + assert_true [ "$memory_current" -eq 0 ] + + # @测试步骤:2: 分配50MB匿名内存 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & + sleep 2 + + # @测试步骤:3: 读取memory.current的值 + total_memory_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + total_memory_current=$(echo "$memory_current + $total_memory_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$total_memory_current / 8" | bc) + msg "memory.current: $aver_memory_current MB" + sleep 3 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: 在误差范围内,memory.current的值为50MB + TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) + diff=$((aver_memory_current - 50)) + abs_diff=${diff#-} + assert_true [ "$abs_diff" -le "$TOLERANCE" ] + + # @测试步骤:4: 分配50MB页缓存 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 2 + + # @测试步骤:5: 读取memory.current的值 + total_memory_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + total_memory_current=$(echo "$memory_current + $total_memory_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$total_memory_current / 8" | bc) + msg "memory.current: $aver_memory_current MB" + sleep 3 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:3: 在误差范围内,memory.current的值为50MB + TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) + diff=$((aver_memory_current - 50)) + abs_diff=${diff#-} + assert_true [ "$abs_diff" -le "$TOLERANCE" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" new file mode 100755 index 0000000..78a1c79 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" @@ -0,0 +1,138 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-181220-908479593 +# @用例名称: cgroup-v2-memory-high-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 memory high +# @用例类型: 测试memory.high接口文件,测试是否能有效控制匿名内存和页缓存所消耗的内存量 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-high-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 读取memory.high的值 + memory_high=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.high) + + # @预期结果:1: memory.high的值为max + assert_true [ "$memory_high" = "max" ] + + # @测试步骤:2: 关闭CGROUP中的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:3: 设置memory.high的值为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + + # @测试步骤:4: 分配31MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 31M & + task_pid=$! + echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 2 + + # @预期结果:2: 分配成功 + if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + assert_false [ true ] + else + msg "分配成功" + assert_true [ true ] + fi + kill -9 $task_pid + + # @测试步骤:5: 分配50MB页缓存 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 2 + + # @测试步骤:6: 获取memory.current + total_memory_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + total_memory_current=$(echo "$total_memory_current + $memory_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$total_memory_current / 8" | bc) + msg "average memory current: $aver_memory_current" + sleep 1 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:3: memory.current小于50MB + assert_true [ "$aver_memory_current" -lt 50 ] + + # @测试步骤:7: 分配30MB页缓存 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 30M & + sleep 2 + + # @测试步骤:8: 获取memory.current + total_memory_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + total_memory_current=$(echo "$total_memory_current + $memory_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$total_memory_current / 8" | bc) + msg "average memory current: $aver_memory_current" + sleep 1 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:4: 在误差允许范围内memory.current等于30MB + TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) + msg "tolerance: $TOLERANCE" + diff=$((aver_memory_current - 30)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @测试步骤:9: 获取CGROUP内存达到memory.high的次数 + high_cnt=$(grep "high" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + msg "high cnt: $high_cnt" + + # @预期结果:5: high_cnt大于0 + assert_true [ "$high_cnt" -gt "0" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" new file mode 100755 index 0000000..8aca7b6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" @@ -0,0 +1,101 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-191958-361673037 +# @用例名称: cgroup-v2-memory-high-002 +# @用例级别: 1 +# @用例标签: cgroup-v2 memory high +# @用例类型: 测试memory.high接口文件,测试是否能有效对内存的大量单次分配进行限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-high-002" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 读取memory.events的high字段和max字段 + high_cnt=$(grep "high" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + msg "high_cnt: $high_cnt" + msg "max_cnt: $max_cnt" + + # @预期结果:1: high_cnt和max_cnt都不小于0 + assert_true [ "$high_cnt" -ge 0 ] + assert_true [ "$max_cnt" -ge 0 ] + + # @测试步骤:2: 关闭CGROUP中的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:3: 设置memory.high的值为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + + # @测试步骤:4: 设置memory.max的值为140M + echo 140M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:5: 注册内存事件监控 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/register_notify "$CGROUP_TOPDIR"/$CGROUP/cgroup.events & + + # @测试步骤:6: 单次分配200MB内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon_mlock 200M & + task_pid=$! + echo "$task_pid" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 10 + kill -9 "$task_pid" + + # @测试步骤:7: 读取memory.events的high字段和max字段 + post_high_cnt=$(grep "high" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + post_max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + msg "post high_cnt: $post_high_cnt" + msg "post max_cnt: $post_max_cnt" + + # @预期结果:2: high_cnt和max_cnt都不小于0 + assert_true [ "$post_high_cnt" -ge 0 ] + assert_true [ "$post_max_cnt" -ge 0 ] + + # @预期结果:3: high_cnt增加,max_cnt不变 + assert_true [ "$post_high_cnt" -ne "$high_cnt" ] + assert_true [ "$post_max_cnt" -eq "$max_cnt" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" new file mode 100755 index 0000000..6d46c6d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" @@ -0,0 +1,163 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-175358-337059818 +# @用例名称: cgroup-v2-memory-low +# @用例级别: 3 +# @用例标签: cgroup-v2 memory low +# @用例类型: 测试memoruy.low接口文件,设置保护措施 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-low" +PARENT1="$CGROUP/parent1" +PARENT2="$CGROUP/parent2" +CHILD0="$PARENT1/child0" +CHILD1="$PARENT1/child1" +CHILD2="$PARENT1/child2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$PARENT1 + mkdir "$CGROUP_TOPDIR"/$PARENT2 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" > "$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间 + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max和memory.low + echo 200M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M > "$CGROUP_TOPDIR"/$PARENT1/memory.low + echo 75M > "$CGROUP_TOPDIR"/$CHILD0/memory.low + echo 25M > "$CGROUP_TOPDIR"/$CHILD1/memory.low + echo 0M > "$CGROUP_TOPDIR"/$CHILD2/memory.low + + # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 # 确保子进程已经分配内存 + + # @测试步骤:4: 给PARENT2分配146MB内存 + echo $$ > "$CGROUP_TOPDIR"/$PARENT2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 146M & + sleep 1 + + # @测试步骤:5: 检查内存使用情况 + parent1_memory=0 + chidl0_memory=0 + chidl1_memory=0 + chidl2_memory=0 + parent2_memory=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD0/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl0_memory=$(echo "$memory_current + $chidl0_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl1_memory=$(echo "$memory_current + $chidl1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl2_memory=$(echo "$memory_current + $chidl2_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) + sleep 1 + done + aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) + aver_chidl0_memory=$(echo "$chidl0_memory / 8" | bc) + aver_chidl1_memory=$(echo "$chidl1_memory / 8" | bc) + aver_chidl2_memory=$(echo "$chidl2_memory / 8" | bc) + aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) + msg "parent1 memory average: $aver_parent1_memory" + msg "child0 memory average: $aver_chidl0_memory" + msg "child1 memory average: $aver_chidl1_memory" + msg "child2 memory average: $aver_chidl2_memory" + msg "parent2 memory average: $aver_parent2_memory" + + sleep 3 + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和小于等于50MB + assert_true [ "$aver_parent1_memory" -le 50 ] + + # @预期结果:2: 在误差允许范围内,CHILD0分配的内存小于等于25MB, CHILD1分配的内存小于等于25MB, CHILD2分配的内存小于等于0MB + assert_true [ "$aver_chidl0_memory" -le 25 ] + assert_true [ "$aver_chidl1_memory" -le 25 ] + assert_true [ "$aver_chidl2_memory" -le 0 ] + + # @预期结果:3: 在误差允许范围内,PARENT2分配的内存等于150MB + parent2_memory_max=160 + parent2_memory_min=140 + if [ "$aver_parent2_memory" -gt "$parent2_memory_min" ]; then + assert_true [ "$aver_parent2_memory" -lt "$parent2_memory_max" ] + else + asset_false [ true ] + fi + + # @预期结果:4: 检查memory.low事件次数大于0 + low_cnt=$(grep "low" "$CGROUP_TOPDIR"/$PARENT1/memory.events | awk '{print $2}') + msg "low cnt: $low_cnt" + assert_true [ "$low_cnt" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$PARENT1 + rmdir "$CGROUP_TOPDIR"/$PARENT2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" new file mode 100755 index 0000000..3fe391b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" @@ -0,0 +1,115 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240805-225552-969242515 +# @用例名称: cgroup-v2-memory-max +# @用例级别: 3 +# @用例标签: cgroup-v2 memory max +# @用例类型: 测试memory.max接口文件,设置限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-max" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 读取memory.max的值 + memory_max=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.max) + + # @预期结果:1: memory.max的值为max + assert_true [ "$memory_max" = "max" ] + + # @测试步骤:2: 关闭CGROUP中的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:3: 设置memory.max的值为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:4: 分配100MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + echo $! > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 2 + + # @预期结果:2: 分配失败 + if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + msg "分配失败" + assert_true [ true ] + else + assert_false [ true ] + fi + + # @测试步骤:5: 分配50MB页缓存 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 2 + + # @测试步骤:6: 获取memory.current + total_memory_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + total_memory_current=$(echo "$total_memory_current + $memory_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$total_memory_current / 8" | bc) + msg "aver memory current: $aver_memory_current" + sleep 1 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:3: 在误差允许范围内,memory.current的值等于30MB + TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) + msg "tolerance: $TOLERANCE" + diff=$((aver_memory_current - 30)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + + # @测试步骤:7: 获取CGROUP内存达到memory.max的次数 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/memory.events.local | awk '{print $2}') + msg "max cnt: $max_cnt" + + # @预期结果:1: max_cnt大于0 + assert_true [ "$max_cnt" -gt "0" ] + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" new file mode 100755 index 0000000..0362ae2 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" @@ -0,0 +1,160 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-100136-390417533 +# @用例名称: cgroup-v2-memory-min +# @用例级别: 3 +# @用例标签: cgroup-v2 memory min +# @用例类型: 测试memoruy.min接口文件,设置了保护措施 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-min" +PARENT1="$CGROUP/parent1" +PARENT2="$CGROUP/parent2" +CHILD0="$PARENT1/child0" +CHILD1="$PARENT1/child1" +CHILD2="$PARENT1/child2" + + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$PARENT1 + mkdir "$CGROUP_TOPDIR"/$PARENT2 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" > "$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间 + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max和memory.min + echo 200M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M > "$CGROUP_TOPDIR"/$PARENT1/memory.min + echo 75M > "$CGROUP_TOPDIR"/$CHILD0/memory.min + echo 25M > "$CGROUP_TOPDIR"/$CHILD1/memory.min + echo 0M > "$CGROUP_TOPDIR"/$CHILD2/memory.min + + # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 # 确保子进程已经分配内存 + + # @测试步骤:4: 给PARENT2分配150MB内存 + echo $$ > "$CGROUP_TOPDIR"/$PARENT2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 146M & + sleep 1 + + # @测试步骤:5: 检查内存使用情况 + parent1_memory=0 + chidl0_memory=0 + chidl1_memory=0 + chidl2_memory=0 + parent2_memory=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD0/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl0_memory=$(echo "$memory_current + $chidl0_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl1_memory=$(echo "$memory_current + $chidl1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl2_memory=$(echo "$memory_current + $chidl2_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) + sleep 1 + done + aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) + aver_chidl0_memory=$(echo "$chidl0_memory / 8" | bc) + aver_chidl1_memory=$(echo "$chidl1_memory / 8" | bc) + aver_chidl2_memory=$(echo "$chidl2_memory / 8" | bc) + aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) + msg "parent1 memory average: $aver_parent1_memory" + msg "child0 memory average: $aver_chidl0_memory" + msg "child1 memory average: $aver_chidl1_memory" + msg "child2 memory average: $aver_chidl2_memory" + msg "parent2 memory average: $aver_parent2_memory" + + sleep 3 + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和小于等于50MB + assert_true [ "$aver_parent1_memory" -le 50 ] + + # @预期结果:2: 在误差允许范围内,CHILD0分配的内存小于等于25MB, CHILD1分配的内存小于等于25MB, CHILD2分配的内存小于等于0MB + assert_true [ "$aver_chidl0_memory" -le 25 ] + assert_true [ "$aver_chidl1_memory" -le 25 ] + assert_true [ "$aver_chidl2_memory" -le 0 ] + + # @预期结果:3: 在误差允许范围内,PARENT2分配的内存等于150MB + parent2_memory_max=160 + parent2_memory_min=140 + if [ "$aver_parent2_memory" -gt "$parent2_memory_min" ]; then + assert_true [ "$aver_parent2_memory" -lt "$parent2_memory_max" ] + else + asset_false [ true ] + fi + + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$PARENT1 + rmdir "$CGROUP_TOPDIR"/$PARENT2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" new file mode 100755 index 0000000..5d8fd46 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" @@ -0,0 +1,90 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240807-132326-618850104 +# @用例名称: cgroup-v2-memory-oom-events +# @用例级别: 2 +# @用例标签: cgroup-v2 memory oom-events +# @用例类型: 测试memory.events中的oom和oom_kill事件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-oom-events" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置memory.max为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:2: 关闭CGROUP中的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:3: 分配100MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + echo $! > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 2 + + # @预期结果:1: 分配失败 + if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + msg "分配失败" + assert_true [ true ] + else + assert_false [ true ] + fi + + # @测试步骤:4: 读取memory.events中的oom字段 + oom_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.events | grep oom | awk 'NR==1 {print $2}') + msg "oom_cnt: $oom_cnt" + + # @预期结果:2: oom_cnt的值为1 + assert_true [ "$oom_cnt" -eq 1 ] + + # @测试步骤:5: 读取memory.events中的oom_kill字段 + oom_kill_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.events | grep oom_kill | awk '{print $2}') + msg "oom_kill_cnt: $oom_kill_cnt" + + # @预期结果:3: oom_kill_cnt的值为1 + assert_true [ "$oom_kill_cnt" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" new file mode 100755 index 0000000..6de4546 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" @@ -0,0 +1,108 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-203339-406928857 +# @用例名称: cgroup-v2-memory-oom-group-001 +# @用例级别: 2 +# @用例标签: cgroup-v2 memory oom group +# @用例类型: 测试memory.oom.group接口文件,分配匿名内存达到oom限制,检查子cgroup进程是否被kill +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-oom-group-001" +CHILD="$CGROUP/child" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置CHILD的内存限制为50M + echo 50M > "$CGROUP_TOPDIR"/$CHILD/memory.max + + # @测试步骤:2: 关闭CHILD的swapping + echo 0 > "$CGROUP_TOPDIR"/$CHILD/memory.swap.max + + # @测试步骤:3: 启用CHILDE的oom.group + echo 1 > "$CGROUP_TOPDIR"/$CHILD/memory.oom.group + + # @测试步骤:4: 在CHILD中分配两个1MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & + echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs + sleep 1 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & + echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs + sleep 1 + + # @测试步骤:5: 在CHILD分配超出memory.max的匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs + sleep 1 + + # @预期结果:1: CHILD中的进程都被kill + if [ "$(wc -c < "$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + # @测试步骤:6: 获取CHILD的memory.events中的oom_kill + oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$CHILD/memory.events | awk '{print $2}') + + # @预期结果:2: CHILD的oom_kill_cnt大于0 + assert_true [ "$oom_kill_cnt" -gt "0" ] + + # @测试步骤:7: 获取PARENT的memory.events中的oom_kill + oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + + # @预期结果:3: PARENT的oom_kill_cnt大于0 + assert_true [ "$oom_kill_cnt" -gt "0" ] + + # @测试步骤:8: 获取CGROUP的oom_group_kill + oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + + # @预期结果:4: oom_group_kill_cnt为1 + assert_true [ "$oom_group_kill_cnt" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" new file mode 100755 index 0000000..045dd8f --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" @@ -0,0 +1,106 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-212056-208652807 +# @用例名称: cgroup-v2-memory-oom-group-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 memory oom group +# @用例类型: 测试memory.oom.group接口文件,分配匿名内存达到oom限制,检查父cgroup和子cgroup进程是否被kill +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-oom-group-002" +CHILD="$CGROUP/child" + +tc_setup() { + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置PARENT的内存限制为80M + echo 80M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:2: 关闭PARENT的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:3: 启用PARENT的oom.group + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/memory.oom.group + + # @测试步骤:4: 在PARENT中分配60MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 60M & + echo $! >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 1 + + # @测试步骤:5: 在CHILD中分配两个1MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & + echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs + sleep 1 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & + echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs + sleep 1 + + # @测试步骤:6: 在CHILD分配超出memory.max的匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs + sleep 1 + + # @预期结果:1: CHILD中的进程都被kill + if [ "$(wc -c < "$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + # @预期结果:2: PARENT中的进程都被kill + if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + assert_true [ true ] + else + assert_false [ true ] + fi + + # @测试步骤:7: 获取CGROUP的oom_group_kill + oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + + # @预期结果:3: oom_group_kill_cnt为1 + assert_true [ "$oom_group_kill_cnt" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" new file mode 100755 index 0000000..c789037 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" @@ -0,0 +1,104 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-212858-982022706 +# @用例名称: cgroup-v2-memory-oom-group-003 +# @用例级别: 2 +# @用例标签: cgroup-v2 memory oom group +# @用例类型: 测试memory.oom.group接口文件,分配匿名内存达到oom限制,检查除了设置OOM_SCORE_ADJ_MIN的进程外,其他进程是否被kill +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-oom-group-003" +OOM_SCORE_ADJ_MIN=-1000 + +tc_setup() { + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置CGROUP的内存限制为50MB + echo 50M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:2: 关闭CGROUP的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:3: 启用CGROUP的oom.group + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/memory.oom.group + + # @测试步骤:4: 在CGROUP中分配1MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 1 + + # @测试步骤:5: 设置进程task_pid的oom_score_adj为OOM_SCORE_ADJ_MIN + echo $OOM_SCORE_ADJ_MIN > "/proc/$task_pid/oom_score_adj" + + # @测试步骤:6: 在CGROUP中分配1MB匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & + echo $! >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 1 + + # @测试步骤:7: 在CGROUP中分配超出memory.max的匿名内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + echo $! >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 1 + + # @测试步骤:8: 获取CGROUP的oom_kill + oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + msg "oom kill cnt: $oom_kill_cnt" + + # @预期结果:1: oom_kill_cnt为3 + assert_true [ "$oom_kill_cnt" -eq 3 ] + + # @测试步骤:9: 获取CGROUP的oom_group_kill + oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + + # @预期结果:2: oom_group_kill_cnt为1 + assert_true [ "$oom_group_kill_cnt" -eq 1 ] + + # @测试步骤:10: 尝试kill有OOM_SCORE_ADJ_MIN的进程 + kill -9 $task_pid || assert_false [ true ] + + # @预期结果:3: 进程task_pid被kill + assert_true [ true ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" new file mode 100755 index 0000000..9ea9f34 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" @@ -0,0 +1,97 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240807-205257-782673483 +# @用例名称: cgroup-v2-memory-pressure +# @用例级别: 3 +# @用例标签: cgroup-v2 memory pressure +# @用例类型: 测试memory.pressure接口文件,设置内存压力通知 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-pressure" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置memory.high为50MB + echo 50M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + + # @测试步骤:2: 关闭CGROUP上的memory.swap.max + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:4: 注册触发器 + stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/memory.pressure &> "$TMP_FILE" & + + # @测试步骤:5: 运行两个25MB的匿名分配进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 25M & + sleep 2 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 25M & + sleep 2 + + # @测试步骤:6: 读取memor.pressure文件 + memory_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.pressure) + msg "memory_pressure: " + msg "$memory_pressure" + avg10=$(echo "$memory_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') + msg "avg10: $avg10" + sleep 8 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:1: avg10值应该大于0 + assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] + + # @预期结果:2: 触发器应该被触发 + if grep -q "event triggered" "$TMP_FILE"; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + cgdelete -g cpu:/$CGROUP || return 1 + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" new file mode 100755 index 0000000..814971c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" @@ -0,0 +1,102 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-193843-997660285 +# @用例名称: cgroup-v2-memory-reclaim-001 +# @用例级别: 2 +# @用例标签: cgroup-v2 memory reclaim +# @用例类型: 测试memory.reclaim接口文件,回收文件内存 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-reclaim-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭CGROUP的swapping + echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 运行一个分配50M页缓存内存的进程 + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 + + # @测试步骤:3: 计算回收前的内存 + before_reclaim=0 + for _ in $(seq 1 5); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + before_reclaim=$(echo " $before_reclaim + $memory_current" | bc) + sleep 1 + done + aver_before_reclaim=$(echo "$before_reclaim / 5" | bc) + + # @测试步骤:4: 主动回收内存 + echo "40M" > "$CGROUP_TOPDIR"/$CGROUP/memory.reclaim + + # @测试步骤:5: 计算回收后的内存 + after_reclaim=0 + for _ in $(seq 1 4); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + after_reclaim=$(echo " $after_reclaim + $memory_current" | bc) + sleep 1 + done + aver_after_reclaim=$(echo "$after_reclaim / 4" | bc) + + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + sleep 3 + + # @预期结果:1: 在误差范围内回收了内存40MB + diff=$(echo "$aver_before_reclaim - $aver_after_reclaim" | bc) + msg "diff: $diff" + diff_max=45 + diff_min=35 + if [ "$diff" -gt $diff_min ]; then + assert_true [ "$diff" -lt $diff_max ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" new file mode 100755 index 0000000..bf46639 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" @@ -0,0 +1,101 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-202710-043353562 +# @用例名称: cgroup-v2-memory-reclaim-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 memory reclaim +# @用例类型: 测试memory.reclaim接口文件,回收匿名内存 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-reclaim-002" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + + +do_test() { + msg "this is do_test" + # @测试步骤:1: 运行一个分配50M匿名内存的进程 + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & + sleep 1 + + # @测试步骤:2: 计算回收前的内存 + before_reclaim=0 + for _ in $(seq 1 5); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + before_reclaim=$(echo " $before_reclaim + $memory_current" | bc) + sleep 1 + done + aver_before_reclaim=$(echo "$before_reclaim / 5" | bc) + + # @测试步骤:3: 主动回收内存 + echo "40M" > "$CGROUP_TOPDIR"/$CGROUP/memory.reclaim + + # @测试步骤:4: 计算回收后的内存 + after_reclaim=0 + for _ in $(seq 1 4); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + after_reclaim=$(echo " $after_reclaim + $memory_current" | bc) + sleep 1 + done + aver_after_reclaim=$(echo "$after_reclaim / 4" | bc) + + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + sleep 3 + + # @预期结果:1: 在误差范围内回收了内存40MB + diff=$(echo "$aver_before_reclaim - $aver_after_reclaim" | bc) + msg "diff: $diff" + diff_max=45 + diff_min=35 + if [ "$diff" -gt $diff_min ]; then + assert_true [ "$diff" -lt $diff_max ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" new file mode 100755 index 0000000..3969707 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" @@ -0,0 +1,131 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240807-191722-246340813 +# @用例名称: cgroup-v2-memory-swap-high +# @用例级别: 2 +# @用例标签: cgroup-v2 memory swap high +# @用例类型: 测试memory.swap.high接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-swap-high" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + # @预置条件: 查看系统是否启用了swapping + if ! swapon --show &>/dev/null; then + skip_test "系统未启用swap" + fi + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 读取memory.swap.high的值 + memory_swap_high=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.swap.high) + + # @预期结果:1: memory.swap.high的值为max + assert_true [ "$memory_swap_high" = "max" ] + + # @测试步骤:2: 设置memory.swap.high为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.high + + # @测试步骤:3: 设置memory.high为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + + # @测试步骤:4: 分配31M匿名内存的进程 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 31M & + task_pid=$! + echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 2 + + # @预期结果:2: 分配成功 + if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + assert_false [ true ] + else + msg "分配成功" + assert_true [ true ] + fi + kill -9 $task_pid + + # @测试步骤:5: 分配50M匿名内存的进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & + sleep 2 + + # @测试步骤:6: 获取CGROUP的memory.current和memory.swap.current + total_memory_current=0 + total_memory_swap_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + total_memory_current=$(echo "$total_memory_current + $memory_current" | bc) + memory_swap_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.swap.current) + memory_swap_current=$(echo "$memory_swap_current / 1024 / 1024" | bc) + total_memory_swap_current=$(echo "$total_memory_swap_current + $memory_swap_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$total_memory_current / 8" | bc) + aver_memory_swap_current=$(echo "$total_memory_swap_current / 8" | bc) + msg "average memory current: $aver_memory_current" + msg "average memory current: $aver_memory_swap_current" + sleep 1 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:3: 在误差允许范围内,memory.current等于30MB, memory.current+memory.swap.current等于50MB + TOLERANCE=3 + diff=$((aver_memory_current - 30)) + abs_diff=${diff#-} + if [ "$aver_memory_current" -ne 0 ]; then + assert_true [ "$abs_diff" -le "$TOLERANCE" ] + else + assert_false [ true ] + fi + TOLERANCE=$(echo "($aver_memory_current + $aver_memory_swap_current + 50) * 0.03" | bc) + diff=$((aver_memory_current + aver_memory_swap_current - 50)) + abs_diff=${diff#-} + if [ "$aver_memory_current" -ne 0 ]; then + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" new file mode 100755 index 0000000..2b460d2 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" @@ -0,0 +1,138 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-224039-790267806 +# @用例名称: cgroup-v2-memory-swap-max +# @用例级别: 2 +# @用例标签: cgroup-v2 memory swap max +# @用例类型: 测试memory.swap.max接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-swap-max" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + # @预置条件: 查看系统是否启用了swapping + if ! swapon --show &>/dev/null; then + skip_test "系统未启用swap" + fi + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置memory.swap.max为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max为30M + echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:3: 分配100M匿名内存的进程 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + echo $! > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 5 + + # @预期结果:1: 分配失败 + if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + msg "分配失败" + assert_true [ true ] + else + assert_false [ true ] + fi + + # @测试步骤:4: 获取CGROUP的momory.events中的oom + oom_cnt=$(grep "oom" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk 'NR==1 {print $2}') + msg "oom: $oom_cnt" + + # @预期结果:2: oom大于0 + assert_true [ "$oom_cnt" -gt 0 ] + + # @测试步骤:5: 获取CGROUP的memory.events中的oom_kill + oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + msg "oom_kill: $oom_kill_cnt" + + # @预期结果:3: oom_kill大于0 + assert_true [ "$oom_kill_cnt" -gt 0 ] + + # @测试步骤:6: 分配50MB匿名内存的进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & + sleep 2 + + # @测试步骤:7: 获取CGROUP的memory.current和memory.swap.current + totol_memory_current=0 + totol_swap_current=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + totol_memory_current=$(echo "$memory_current + $totol_memory_current" | bc) + swap_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.swap.current) + swap_current=$(echo "$swap_current / 1024 / 1024" | bc) + totol_swap_current=$(echo "$swap_current + $totol_swap_current" | bc) + sleep 1 + done + aver_memory_current=$(echo "$totol_memory_current / 8" | bc) + aver_swap_current=$(echo "$totol_swap_current / 8" | bc) + msg "memory.current: $aver_memory_current" + msg "memory.swap.current: $aver_swap_current" + sleep 3 + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:4: 在误差允许范围内,memory.current等于30MB, memory.current+memory.swap.current等于50MB + TOLERANCE=3 + diff=$((aver_memory_current - 30)) + abs_diff=${diff#-} + if [ "$aver_memory_current" -ne 0 ]; then + assert_true [ "$abs_diff" -le "$TOLERANCE" ] + else + assert_false [ true ] + fi + TOLERANCE=$(echo "($aver_memory_current + $aver_swap_current + 50) * 0.03" | bc) + diff=$((aver_memory_current + aver_swap_current - 50)) + abs_diff=${diff#-} + if [ "$aver_memory_current" -ne 0 ]; then + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### + \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" new file mode 100755 index 0000000..f58f4ec --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" @@ -0,0 +1,105 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240807-200055-083750426 +# @用例名称: cgroup-v2-memory-zswap +# @用例级别: 3 +# @用例标签: cgroup-v2 memory zswap +# @用例类型: 测试memory.zswap.max接口文件, 达到限制不会触发写回操作, 测试memory.zswap.current接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-zswap" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + # @预置条件: 查看系统是否启用了zswap + if ! dmesg | grep zswap &>/dev/null; then + skip_test "系统未启用zswap" + fi + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置memory.max为1M + echo 1M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + + # @测试步骤:2: 设置memory.zswap.max为10K + echo 10K > "$CGROUP_TOPDIR"/$CGROUP/memory.zswap.max + + # @测试步骤:3: 获取当前zswap已经写回的页数 + written_back_before=$(cat /sys/kernel/debug/zswap/written_back_pages) + msg "written_back_before: $written_back_before" + + # @测试步骤:4: 分配10M匿名内存的进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 10M & + + # @测试步骤:5: 获取memory.zswap.current的值 + total_memory_zswap_current=0 + for _ in $(seq 1 10); do + memory_zswap_current=$(cat /sys/fs/cgroup/$CGROUP/memory.zswap.current) + memory_zswap_current=$(echo "$memory_zswap_current / 1024" | bc) + total_memory_zswap_current=$(echo "$total_memory_zswap_current + $memory_zswap_current" | bc) + sleep 1 + done + aver_memory_zswap_current=$(echo "$total_memory_zswap_current / 10" | bc) + msg "aver_memory_zswap_current: $aver_memory_zswap_current KB" + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:1: memory.zswap.current大于 + assert_true [ "$(echo "$aver_memory_zswap_current > 0" | bc)" -eq 1 ] + + # @测试步骤:6: 获取当前zswap已经写回的页数 + written_back_after=$(cat /sys/kernel/debug/zswap/written_back_pages) + msg "written_back_after: $written_back_after" + + # @预期结果:2: 之前写回和现在写回的页数相等 + assert_true [ "$written_back_before" -eq "$written_back_after" ] + + # @测试步骤:7: 获取memory.stat中的zswapped字段 + zswapped=$(grep "zswapped" "$CGROUP_TOPDIR"/$CGROUP/memory.stat | awk '{print $2}') + msg "zswapped: $zswapped" + + # @预期结果:3: zswapped字段大于0 + assert_true [ "$zswapped" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/Makefile" new file mode 100644 index 0000000..db52efa --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/Makefile" @@ -0,0 +1,21 @@ +SRC_DIR := . +BIN_DIR := ./bin +CC := gcc +CFLAGS := -O2 + +SRC_FILES := $(wildcard $(SRC_DIR)/*.c) +BIN_FILES := $(patsubst $(SRC_DIR)/%.c,$(BIN_DIR)/%,$(SRC_FILES)) + +# 目标文件 +all: $(BIN_FILES) + +$(BIN_DIR)/%: $(SRC_DIR)/%.c | $(BIN_DIR) + $(CC) $(CFLAGS) -o $@ $< + +$(BIN_DIR): + mkdir -p $(BIN_DIR) + +clean: + rm -rf $(BIN_DIR) + +.PHONY: all clean \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" new file mode 100644 index 0000000..bd0ef3b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +#define PAGE_SIZE 4096 // 页大小 + +// 分配匿名内存并初始化 +int alloc_anon(size_t mb) { + size_t size = mb * 1024 * 1024; + char *buf; + char *ptr; + + // 分配内存 + buf = malloc(size); + if (buf == NULL) { + perror("malloc 失败"); + return -1; + } + + // 初始化分配的内存 + memset(buf, 0, size); + + // 访问内存以确保它正在被使用 + for (ptr = buf; ptr < buf + size; ptr += PAGE_SIZE) { + *ptr = 0; + } + + sleep(10); + + // 释放内存 + free(buf); + return 0; +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + fprintf(stderr, "用法: %s \n", argv[0]); + return EXIT_FAILURE; + } + + size_t mb = atoi(argv[1]); + if (mb == 0) { + fprintf(stderr, "无效的内存大小: %s\n", argv[1]); + return EXIT_FAILURE; + } + + // 分配内存 + if (alloc_anon(mb) != 0) { + return EXIT_FAILURE; + } + + printf("成功分配 %zu MB内存.\n", mb); + return EXIT_SUCCESS; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" new file mode 100644 index 0000000..ed5eea9 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" @@ -0,0 +1,57 @@ +// 启用GNU扩展 +#define _GNU_SOURCE + +#include +#include +#include +#include + +#define PAGE_SIZE 4096 // 页大小 + +// 单次分配大量匿名内存 +int alloc_anon_mlock(size_t mb) { + size_t size = mb * 1024 * 1024; + void *buf; + + // 使用mmap分配内存 + buf = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buf == MAP_FAILED) { + perror("mmap 失败"); + return -1; + } + + if (mlock(buf, size) != 0) { + perror("mlock 失败"); + return -1; + } + + sleep(1); + + if (munmap(buf, size) != 0) { + perror("munmap 失败"); + return -1; + } + + return 0; +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + fprintf(stderr, "用法: %s \n", argv[0]); + return EXIT_FAILURE; + } + + size_t mb = atoi(argv[1]); + if (mb == 0) { + fprintf(stderr, "无效的内存大小: %s\n", argv[1]); + return EXIT_FAILURE; + } + + // 分配内存 + if (alloc_anon_mlock(mb) != 0) { + return EXIT_FAILURE; + } + + printf("成功分配 %zu MB内存.\n", mb); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" new file mode 100644 index 0000000..c163d4d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" @@ -0,0 +1,85 @@ +// 启用GNU扩展 +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#define PAGE_SIZE 4096 // 页大小 + +// 通过调整文件大小和读取文件来分配页面缓存 +int alloc_pagecache(int fd, size_t size) { + char buf[PAGE_SIZE]; + struct stat st; + int i; + + // 获取文件装填 + if (fstat(fd, &st)) { + perror("fstat 失败"); + return -1; + } + + // 增加文件大小 + size += st.st_size; + if (ftruncate(fd, size)) { + perror("ftruncate 失败"); + return -1; + } + + // 读取文件分配页缓存 + for (i = 0; i < size; i += sizeof(buf)) { + if (read(fd, buf, sizeof(buf)) < 0) { + perror("read 失败"); + return -1; + } + } + + return 0; +} + +// 创建临时文件并分配页面缓存 +int create_temp_file_and_allocate(size_t size_mb) { + int fd; + + // 创建临时我呢见 + fd = open(".", O_TMPFILE | O_RDWR | O_EXCL, 0644); + if (fd < 0) { + perror("open 失败"); + return -1; + } + + // 分配页缓存 + if (alloc_pagecache(fd, size_mb * 1024 * 1024)) { + close(fd); + return -1; + } + + sleep(10); + + // 释放文件 + close(fd); + return 0; +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + fprintf(stderr, "用法: %s \n", argv[0]); + return EXIT_FAILURE; + } + + size_t size_mb = atoi(argv[1]); + if (size_mb == 0) { + fprintf(stderr, "无效的内存大小: %s\n", argv[1]); + return EXIT_FAILURE; + } + + if (create_temp_file_and_allocate(size_mb)) { + return EXIT_FAILURE; + } + + printf("成功分配 %zu MB 页缓存.\n", size_mb); + return EXIT_SUCCESS; +} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" new file mode 100755 index 0000000000000000000000000000000000000000..0adff3190631f1172ebaf48a55d1f76e769ef292 GIT binary patch literal 16312 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon_mlock" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon_mlock" new file mode 100755 index 0000000000000000000000000000000000000000..3ed21d64673d8a5f1eda6593857f950a1ef015f8 GIT binary patch literal 16368 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 JE(ez={s|1dh+O~x literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_pagecache" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_pagecache" new file mode 100755 index 0000000000000000000000000000000000000000..457b44a71ab8a2879da99644f6c65de6e7da22ce GIT binary patch literal 16552 zcmeHOe{fXA9pAeo7!fXqf<~f>*vjHjJep%EmacDs}(y4BkJ;RtIp5~*mwZ|JNIBnHDmu$!-7 z>l+(t*J?{W%a%=MJvC;2sb{&FpG23{Fs-4vNrN)=_HfeB6U|L)BeAI7>~D==v)Vgi zQP~Jhs7|SfJ>3Dlzm)$u;9ACWWq_8#6B2Pu4#3kuv0q?%X4g+)SWIKPA&;1GX&C+! zl(C;lJ~bElQub@f&kl!Y;wby04XEKo@O44+f@e4w;V>Z5OZW}$3{1s4$( z76TTX{~r}F8?@m3c_i^63r?{>(OwGjt)xNSfmN2IFW(;TUh}v_o`~VL}Zut!W zPvjQf2&7^jL;Vm+CdU4r%jE_*j}w}Sv7;uB6Pbyz{U(nSjES+QO&%u}6Jt-9JWePk z#&(%JP9!GAx=kJ@DHCINnLJJ?CdT|Gj}wWBv71dEClC{3KH{PFGkNXn7_UF@y&i1M zB>zJjpR(~CHeR>!TWoxbjc>B?^)`OBjbCo%eJ#G`&1(8|PtIvvt@gRp{yE()xL19v z?*O$IF#6RQ-#(<-$Dz@6>5%sS_Uo@uQRr{AWLH50=8!PXg_v02xWbc_uYbb zq-C?({T{9{)Sej&803e*aZv3mUATys@W6sW5LRc@^v7!YgfIPhRymi;^=2x1`%qpI zSx{A%KB=ZZ$aX>neCb0d!pK&?+1UTv1p}zm`+jQnsZ|y8ysY~GFDh_AU6oCK>v?1v z(;t9??5$u8vFmyZLbVa5!oC+U?%5uM`$Q#z>Q$mvsq574gF|3jmma@u3-%G;9S6Yf zQet^0>uavBT$S$F#=y20SA0%;U9jK z(LGORpZ(S3_aFlB;}hjQ{KFD)Cx5c{#4`_Ht1L_^-$}wpD=i$=nrg3~&Q3fsbmHM1 zCm(xYbbIgU?*>QrJUKf2Bh&-Yj)Bn!e?Gcn`&e(kvhbdi(p0OAJ@JQ=`*wq(XF79S zR&pII%NZ{D2R_W@I)QE+&*g@IZUy=rQ1?f$aDe5~48S3UqT#PQ>(3bx-wg}U=#ImFlk_~AD}Hermc4kD~+xrUw7`E?y9PDE%Lb(P^)#hYhC5O3vf;OH~4LXw&FKO z27Y!rn_QLKOF*%w^uFn?N*~v~f$L&f2ca&zq;5Z!xl`!IK$rZYxR{C&C`OXO` zOmhWcv@eY|fRg;t`E!W5aIdLI*NjP{CA`BzAs^ghdp_CawRf^SZ|y&2gs z_@=~piaRVNIX@`npGcnCA>IGa2<_jtJFJrT+biitNw-QGmvoz?1CruLJWRuqW+Xi# zsgQp4Yq?kGu3x+MT4hm7Ybt7_lVi_vq7tkxh- zjD_A>0FM{I?=OJw1{~{SujdfpilsctK2^ZaOMuUEUdm`ZkpAn4V+*9SQYm;Fa5way zDlcgY`Y7NRg2XEu&EGYF=(xnIB``h(^KM>MA0R}2bBh}Uh*~$Itn$e-b zCi>=JRdQ6Ji>In43041=?D|R+Ka;xd61^T!3DYt)`J$N7JA}m9i}|Mzz<)Tx>yK* z&2A!asv-a(GIY(*JK_-ah^|3fHQr0{I7a?~5YrAl@m?bjcH{||C)w3u_*;R(X%J3B zl!MbGdLqs|(U_ro+M_8?JOOb?7+n^qH5G;vPvM}1e6o?urLiV)OD z2+8;LL^2$U<}n(`5_-gs1~M0q7|etHop~VZX^+WFQV%eXp?3m{0|&HYyeE3}kQ^$Z zAb2BA_z+`8SWq5{@^^&6nJ|amz&tQmJ75e>@kII0Ae?XGqZ%GJJlW4J(tKNr>9I~M z`v&B2YD@No&gYQ<&1;EYVY9cN)5Gr<)tPtqN+>@LXR z8i4F+-cOX`NA)K?qW6M5t|^G8bp_F_vLt)`CCvIEgE1w0TIUd@bqFnfZ~h;Z|4(T>2`W6<@Bia~TJ05SM>HeM%q#tyCi=hw4ud`(N zQr*PK{wfm@8LTTNE2X|8B;x9o4hLn2p>w)ae|rAnx}EB7wLexPxHC5AR4(bxDq#QG NH9}*q&A`U8e*pj$WOM)k literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" new file mode 100755 index 0000000000000000000000000000000000000000..1f125ad066de459c5f75082a42aa9009cfe01ace GIT binary patch literal 16656 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 Ux?KY*Qq;7{)i^U?5Maf>04>-7=l}o! literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/pressure_listener" similarity index 61% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/pressure_listener" index 01a18eaf033313e767addeb045e9a22374ba9f42..57ad015121af26ee35acfa0af342148faafd4c8e 100755 GIT binary patch delta 2073 zcmZ8i4Qx|Y6u$ShW$l>#Sv$Hi$X-K{0i$c#y1`uCIv4f^Q%8V6_^}MuhQ_(hu4s^u zb&esWTO8g&f)X<^(Je7S>|zEQC_^P^h=G_Gq7g8eyx}6u7=!>m&%N)x@pGHrbIy0Z z^K!?o5x}uz5uss%Oi-&{Tcf3j}bZhcjBipvSJEHD#RNvT8`$BN3 zyVPAq-q*d+iIEOz;D?o2i=xoAS?(Og9T5Wp#x4c3MIz52q(wc7y>mA8YtXxjJ#z5y z41_rJffAqa%ZgsHuUTbfzluXN8-rGIV8%wAMaE}*iuLKftTp;C%yqakuy)-Vp?lKP zBBZqQi-0O5>s&?NOt-|v%Z1deGjz{|KHq>5Au%OM5_l1x2LOYyruu;#EK(!4Kj-P*TgpTQqTJpYI`TxV*~bm^UL11I*Sq z;ecpyqf9;rqA~fqx*LNKBP7oP{jF*GP0)ls{}i~yGSI!5iJuwd`&z94{FT%EQ=o~} z_aCxmTEKWL|GMe?1=IW#Bhj&AL&Dt{QM5SDjaDI1>2kB zJD$%*U`N|SZT!T*5%KtO>Sx%Su}D1h1lS&JZRJC;STx2+#NjL@|MK%z(WN8Q5q&Mh z``}c0JiHesT%dWb3~(L%x89PZ9UyOm><5W%OVSXC1jr1?n!hEf2_zzWobw#wlq5Y% zt-36BFI}M0Ot;BN=YmZeAcuNgDT$uYIQ*LcPk>a12b5m;j{-hI58Vo*xt9wV^Y>{2 zM!s8HXKdnDWE*)v0!DMKQ6HF@p0Zw?=}_>w!RVwFQ;G z1r&^CBXf<6sI5f^_Szl&0MaOR0Wt@nqr~gA%bhsB0uaNVjW|`WB59uu7ns+M`jyv} z%DK!GE6VUHBFk|Q80Dix^^^F0_Lj~ktC!Mux^t=B@gcOzBL_U{Cz-1mXB(U2qzjn4 zftkx$(BxBl(#1GO$#uv%OmpH|6)>)l z*TFlkcxxQyLP)3klld6_|fZ+F~;WRs&Ls=XK*t$@gE1-U{Xo=Wa3VFLF3^FGSUm=S$4=KVhi)=85VO%gly+uKs59cDppp?$C0^1k@FSF8)h3WG$9$$-ASuVAE6M>xJu5>}e?6nRQtIbK zzBEvu3qf}HA4SP_D2j5Kz3(Ph9IoW=1q=TQ0Y~cp#oHkb1w`)>^W*S75wqOE+|b4 z9-bBiJv^;0$D{FDK3Oj3J+#o)cq9=vlvJUun<9xw z_h!B`8t21X!rcj35Cjy9c6H5UA+$M~;Gf;l)Fif$1AGYy@qQnkZ+grNd%?nc?Y5$H zfbIBIQTBpOfIR{BF4!ipH|{9PIr0a;*fj*mQb5ppGwlsaz+DaROT<^Utnmuy7%f93 zsmCz^@8^K`fi<25;HY(6pnFC=SmGnL*O+y4b4|lI-)u=^=L>UOM$gcD1oR~BiIAi2 zQanMxSq|;f+o!?#mO2h(+$07*N%&7Frz zX3d^e>w;=P|3dWi!4mH1eA_Jk-#UM}e&x{f1$<17S8}+Jj*H3FN{;owz08yM83zuk zDElJBi)h?Se5+TG=<0(U{Qp~x|9@*&L{5ae!*QXVFjcn-wVO21*c5znU8`U43svN& zstxI<*WAGArEA~9a5^#TAQLqUtPI?a>cbFRTW#m{$glwtto2wo>gYzYqqf>=oM}FN zv9=N8H;J{*V>R}Ef;>^z$OJLjvvwglRcFgH4nR{G`K)e@y{}9wXV}weYkdQQlO)(s LjmOE3hGqW(OIJvr diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/register_notify" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/register_notify" new file mode 100755 index 0000000000000000000000000000000000000000..2bcc4daf8371695de3bd9420e4271a802bed0ce5 GIT binary patch literal 16568 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" new file mode 100644 index 0000000..b2bf282 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define USAGE_STR "Usage: cgroup_event_listener " + +int main(int argc, char **argv) +{ + int efd = -1; + int cfd = -1; + int event_control = -1; + char event_control_path[4096]; + char line[256]; + int ret; + + if (argc != 3) + errx(1, "%s", USAGE_STR); + + cfd = open(argv[1], O_RDONLY); + if (cfd == -1) + err(1, "Cannot open %s", argv[1]); + + ret = snprintf(event_control_path, 4096, "%s/cgroup.event_control", + dirname(argv[1])); + if (ret >= 256) + errx(1, "Path to cgroup.event_control is too long"); + + event_control = open(event_control_path, O_WRONLY); + if (event_control == -1) + err(1, "Cannot open %s", event_control_path); + + efd = eventfd(0, 0); + if (efd == -1) + err(1, "eventfd() failed"); + + ret = snprintf(line, 63, "%d %d %s", efd, cfd, argv[2]); + if (ret >= 256) + errx(1, "Arguments string is too long"); + + ret = write(event_control, line, strlen(line) + 1); + if (ret == -1) + err(1, "Cannot write to cgroup.event_control"); + + while (1) { + uint64_t result; + + ret = read(efd, &result, sizeof(result)); + if (ret == -1) { + if (errno == EINTR) + continue; + err(1, "Cannot read from eventfd"); + } + assert(ret == sizeof(result)); + + ret = access(event_control_path, W_OK); + if ((ret == -1) && (errno == ENOENT)) { + puts("The cgroup seems to have removed."); + break; + } + + if (ret == -1) + err(1, "cgroup.event_control is not accessible any more"); + + printf("%s %s: crossed\n", argv[1], argv[2]); + } + + return 0; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/pressure_listener.c" similarity index 69% rename from "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" rename to "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/pressure_listener.c" index 503451e..84b5c73 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cpu_pressure_listener.c" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/pressure_listener.c" @@ -5,29 +5,33 @@ #include #include -int main() +int main(int argc, char *argv[]) { + if (argc != 2) + { + printf("用法: %s \n", argv[0]); + return 1; + } + + const char *file_path = argv[1]; const char trig[] = "some 500000 1000000"; struct pollfd fds; int n; - fds.fd = open("/sys/fs/cgroup/cgroup-v2-cpu-pressure-002/cpu.pressure", O_RDWR | O_NONBLOCK); + fds.fd = open(file_path, O_RDWR | O_NONBLOCK); if (fds.fd < 0) { - printf("/sys/fs/cgroup/cgroup-v2-cpu-pressure-002/cpu.pressure open error: %s\n", - strerror(errno)); + printf("%s open 错误: %s\n", file_path, strerror(errno)); return 1; } fds.events = POLLPRI; if (write(fds.fd, trig, strlen(trig) + 1) < 0) { - printf("/sys/fs/cgroup/cgroup-v2-cpu-pressure-002/cpu.pressure write error: %s\n", - strerror(errno)); + printf("%s write 错误: %s\n", file_path, strerror(errno)); return 1; } - - printf("waiting for events...\n"); + while (1) { n = poll(&fds, 1, -1); diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/register_notify.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/register_notify.c" new file mode 100644 index 0000000..2486119 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/register_notify.c" @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include +#include + +int prepare_for_wait(const char *filepath) { + int fd, ret; + + fd = inotify_init1(0); + if (fd == -1) { + return -1; + } + + ret = inotify_add_watch(fd, filepath, IN_MODIFY); + if (ret == -1) { + perror("inotify_add_watch"); + close(fd); + return -1; + } + + return fd; +} + +int monitor_file(int fd) { + int ret = -1; + struct pollfd pfd = { + .fd = fd, + .events = POLLIN, + }; + + while (1) { + // 最多等待10s来检测事件 + ret = poll(&pfd, 1, 10000); + + if (ret == -1) { + if (errno == EINTR) { + continue; + } + perror("poll"); + break; + } + + if (ret > 0 && pfd.revents & POLLIN) { + ret = 0; + break; + } + } + return ret; +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + fprintf(stderr, "用法: %s \n", argv[0]); + return EXIT_FAILURE; + } + + const char *filepath = argv[1]; + int fd; + + fd = prepare_for_wait(filepath); + if (fd == -1) { + fprintf(stderr, "开启inotify失败.\n"); + return EXIT_FAILURE; + } + + sleep(1); + printf("正在监听文件: %s\n", filepath); + monitor_file(fd); + + close(fd); + return EXIT_SUCCESS; +} -- Gitee From 6bd46de134819aa6a2e99996ff4c22d69f7a2102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 8 Aug 2024 11:37:12 +0800 Subject: [PATCH 17/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84io?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 5 +- .../cgroup-v1-blkio-bfq-weight_device.sh" | 14 +- ...oup-v1-blkio-throttle-read_iops_device.sh" | 4 +- ...oup-v1-blkio-throttle-write_bps_device.sh" | 7 +- ...up-v1-blkio-throttle-write_iops_device.sh" | 2 +- .../testcase/cgroup-v2-io-max-001.sh" | 97 ++++++++++++++ .../testcase/cgroup-v2-io-max-002.sh" | 98 ++++++++++++++ .../testcase/cgroup-v2-io-max-003.sh" | 101 ++++++++++++++ .../testcase/cgroup-v2-io-max-004.sh" | 101 ++++++++++++++ .../testcase/cgroup-v2-io-pressure.sh" | 102 ++++++++++++++ .../testcase/cgroup-v2-io-weight.sh" | 125 ++++++++++++++++++ 11 files changed, 641 insertions(+), 15 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" index 15c7a06..78b4072 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -87,7 +87,7 @@ do_test() { read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2"| awk '{print $1}') msg "read_bps2: $read_bps2" - # @预期结果:1: 400权重的cgroup2带宽要大于100权重的cgroup1 + # @预期结果:1: 500权重的cgroup2带宽要大于100权重的cgroup1 assert_true [ "$read_bps1" -lt "$read_bps2" ] return 0 @@ -95,8 +95,9 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - # 恢复调度器设置 + # @清理工作: 恢复调度器设置 echo "$original_scheduler" > /sys/block/"$disk"/queue/scheduler + # @清理工作: 删除创建的cgroup组 cgdelete -g blkio:cgroup-v1-blkio-bfq-weight cgdelete -g blkio:cgroup-v1-blkio-bfq-weight2 rm "$TMP_FILE" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index 635ad3f..f97045b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -34,9 +34,9 @@ tc_setup() { skip_test "未安装dd命令" fi # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 - if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then - skip_test "内核CONFIG_IOSCHED_BFQ配置未开启" - fi + # if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then + # skip_test "内核CONFIG_IOSCHED_BFQ配置未开启" + # fi # @预置条件: 创建cgroup组 cgcreate -g blkio:cgroup-v1-blkio-bfq-weight_device @@ -58,23 +58,21 @@ do_test() { # @测试步骤:2: 获取光驱设备 if [[ -e /dev/sr0 ]]; then - msg "disk is /dev/sda" cd_rom="sr0" cd_rom_device="11:0" else - msg "错误信息: 没有光驱设备CD-ROM" - exit 1 + skip_test "没有光驱设备CD-ROM" fi # @测试步骤:3: 保存当前调度器设置 original_scheduler1=$(grep -oP '\[\K[^\]]+' /sys/block/$disk/queue/scheduler) echo "原始调度器1: $original_scheduler1" - original_scheduler2=$(grep -oP '\[\K[^\]]+' /sys/block/$cd_rom/queue/scheduler) + original_scheduler2=$(grep -oP '\[\K[^\]]+' /sys/block/"$cd_rom"/queue/scheduler) echo "原始调度器2: $original_scheduler2" # @测试步骤:4: 设置调度器为bfq echo bfq >/sys/block/$disk/queue/scheduler || return 1 - echo bfq >/sys/block/$cd_rom/queue/scheduler || return 1 + echo bfq >/sys/block/"$cd_rom"/queue/scheduler || return 1 # @测试步骤:5: 设置blkio.bfq.weight_device echo "$disk_device 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index d6df4e5..fd0a766 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -62,13 +62,13 @@ do_test() { # @测试步骤:2: 设置blkio.throttle.read_iops_device,限制速度为100 IO/s echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device - # @测试步骤:3: 启动一个fio进程 + # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/tasks dd iflag=direct if=$disk of=/dev/null bs=4k count=500 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" - # @测试步骤:4: 获取fio进程 的读取速度 + # @测试步骤:4: 获取读取速度 read_iops=$(grep "$device_number Read" "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.io_serviced | awk '{print $3}') read_iops_per_second=$(echo "scale=2; $read_iops / $time" | bc) msg "read_iops: $read_iops_per_second" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index 62d1500..faf78cf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -21,6 +21,7 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### TMP_FILE="$(mktemp)" +TMP_WIRTE_FILE="$(mktemp)" tc_setup() { msg "this is tc_setup" @@ -64,7 +65,7 @@ do_test() { # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_bps_device/tasks - dd if=$disk of=/tmp/testfile bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" + dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') @@ -84,8 +85,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 删除cgroup cgdelete -g blkio:cgroup-v1-blkio-throttle-write_bps_device - rm "$TMP_FILE" + # @清理工作: 删除临时文件 + rm "$TMP_FILE" "$TMP_WIRTE_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index 62e9830..4797e2a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -68,7 +68,7 @@ do_test() { time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" - # @测试步骤:4: 获取fio进程的写入速度 + # @测试步骤:4: 获取写入速度 write_iops=$(grep "$device_number Write" "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.io_serviced | awk '{print $3}') write_iops_per_second=$(echo "scale=2; $write_iops / $time" | bc) msg "write_iops_per_second: $write_iops_per_second" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" new file mode 100755 index 0000000..946fae9 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" @@ -0,0 +1,97 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-103852-626399690 +# @用例名称: cgroup-v2-io-max-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 io max +# @用例类型: 测试io.max接口文件的rbps +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-io-max-001" +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + skip_test "未安装dd命令" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用io控制器 + if ! check_string_in_file "io" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用io控制器" + fi + # @预置条件: 启用io控制器 + echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置io.max,限制rbps为1MB/s + echo "$device_number rbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max + + # @测试步骤:3: 启动一个dd进程 + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd iflag=direct if="$disk" of=/dev/null bs=1M count=5 &> "$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + + # @测试步骤:4: 获取dd进程的读取速度 + read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') + msg "read_bps: $read_bps" + up_read_bps=1.2 + down_read_bps=0.8 + + # @预期结果:1: 如果读取速率在1MB/s左右,说明限速成功 + if [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" new file mode 100755 index 0000000..2edb7dc --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" @@ -0,0 +1,98 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-110216-648820128 +# @用例名称: cgroup-v2-io-max-002 +# @用例级别: 1 +# @用例标签: cgroup-v2 io max +# @用例类型: 测试io.max接口文件的wbps +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-io-max-002" +TMP_FILE="$(mktemp)" +TMP_WIRTE_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + skip_test "未安装dd命令" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用io控制器 + if ! check_string_in_file "io" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用io控制器" + fi + # @预置条件: 启用io控制器 + echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置io.max + echo "$device_number wbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max + + # @测试步骤:3: 启动一个dd进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=5 oflag=direct &> "$TMP_FILE" + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @测试步骤:4: 获取dd进程的写入速度 + write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') + msg "write_bps: $write_bps" + up_write_bps=1.2 + down_write_bps=0.8 + + # @预期结果:1: 如果写入速率在1MB/s左右,说明限速成功 + if [ "$(echo "$write_bps > $down_write_bps" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$write_bps < $up_write_bps" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" "$TMP_WIRTE_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" new file mode 100755 index 0000000..d525731 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" @@ -0,0 +1,101 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-110220-353546271 +# @用例名称: cgroup-v2-io-max-003 +# @用例级别: 1 +# @用例标签: cgroup-v2 io max +# @用例类型: 测试io.max接口文件的riops +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-io-max-003" +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + skip_test "未安装dd命令" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用io控制器 + if ! check_string_in_file "io" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用io控制器" + fi + # @预置条件: 启用io控制器 + echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置io.max + echo "$device_number riops=100" >"$CGROUP_TOPDIR"/$CGROUP/io.max + + # @测试步骤:3: 启动dd进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd iflag=direct if=$disk of=/dev/null bs=4K count=500 &> "$TMP_FILE" + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") + msg "time: $time" + + # @测试步骤:4: 获取读取速度 + deivce_line=$(grep "$device_number" "$CGROUP_TOPDIR"/$CGROUP/io.stat) + read_iops=$(echo "$deivce_line" | grep -oP "rios=\K\d+") + read_iops_per_second=$(echo "scale=2; $read_iops / $time" | bc) + msg "read_iops: $read_iops_per_second" + up_read_iops=110 + down_read_iops=90 + + # @预期结果:1: 如果读取速率在100 IO/s左右,说明限速成功 + if [ "$(echo "$read_iops_per_second > $down_read_iops" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$read_iops_per_second < $up_read_iops" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" new file mode 100755 index 0000000..7dcd60c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" @@ -0,0 +1,101 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-110221-955418429 +# @用例名称: cgroup-v2-io-max-004 +# @用例级别: 1 +# @用例标签: cgroup-v2 io max +# @用例类型: 测试io.max接口文件的wiops +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-io-max-004" +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + skip_test "未安装dd命令" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用io控制器 + if ! check_string_in_file "io" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用io控制器" + fi + # @预置条件: 启用io控制器 + echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置io.max + echo "$device_number wiops=100" >"$CGROUP_TOPDIR"/$CGROUP/io.max + + # @测试步骤:3: 启动一个dd进程 + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct &> "$TMP_FILE" + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") + msg "time: $time" + + # @测试步骤:4: 获取写入速度 + deivce_line=$(grep "$device_number" "$CGROUP_TOPDIR"/$CGROUP/io.stat) + wirte_iops=$(echo "$deivce_line" | grep -oP "wios=\K\d+") + write_iops_per_second=$(echo "scale=2; $wirte_iops / $time" | bc) + msg "read_iops: $write_iops_per_second" + up_wirte_iops=110 + down_wirte_iops=90 + + # @预期结果:1: 如果读取速率在100 IO/s左右,说明限速成功 + if [ "$(echo "$write_iops_per_second > $down_wirte_iops" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$write_iops_per_second < $up_wirte_iops" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" new file mode 100755 index 0000000..db94cd3 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" @@ -0,0 +1,102 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-112444-602586740 +# @用例名称: cgroup-v2-io-pressure +# @用例级别: 3 +# @用例标签: cgroup-v2 io pressure +# @用例类型: 测试io.pressure接口文件,设置io压力通知 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-io-pressure" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + skip_test "未安装dd命令" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用io控制器 + if ! check_string_in_file "io" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用io控制器" + fi + # @预置条件: 启用io控制器 + echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="/dev/sda" + device_number="8:0" + else + msg "disk is /dev/vda" + disk="/dev/vda" + device_number="253:0" + fi + + # @测试步骤:2: 设置io.max,限制rbps为1MB/s + echo "$device_number rbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max + + # @测试步骤:3: 注册触发器 + stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/io.pressure &> "$TMP_FILE" & + + # @测试步骤:4: 启动两个dd进程 + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd iflag=direct if="$disk" of=/dev/null bs=1M count=5 + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + + # @测试步骤:5: 读取io.pressure文件 + io_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/io.pressure) + avg10=$(echo "$io_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') + msg "avg10: $avg10" + + # @预期结果:1: avg10值应该大于0 + assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] + + # @预期结果:2: 触发器应该被触发 + if grep -q "event triggered" "$TMP_FILE"; then + assert_true [ true ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" new file mode 100755 index 0000000..e2d86c1 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" @@ -0,0 +1,125 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240807-224514-698927621 +# @用例名称: cgroup-v2-io-weight +# @用例级别: 1 +# @用例标签: cgroup-v2 io weight +# @用例类型: 测试io.weight接口文件, +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-io-weight" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" +CHILD2="$CGROUP/child2" +TMP_FILE0="$(mktemp)" +TMP_FILE1="$(mktemp)" +TMP_FILE2="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件: 检查是否安装了dd工具 + if ! is_dd_installed; then + skip_test "未安装dd命令" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用io控制器 + if ! check_string_in_file "io" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用io控制器" + fi + # @预置条件: 启用io控制器 + echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取硬盘设备 + if [[ -e /dev/sda ]]; then + msg "disk is /dev/sda" + disk="sda" + disk_device="8:0" + else + msg "disk is /dev/vda" + disk="vda" + disk_device="253:0" + fi + + # @测试步骤:2: 设置io.cost.qos + echo "$disk_device enable=1 ctrl=auto" > "$CGROUP_TOPDIR"/io.cost.qos + + # @测试步骤:3: 设置CHILD0\CHILD1\CHILD2的io.weight + echo "$disk_device 100" > "$CGROUP_TOPDIR/$CHILD0/io.weight" + echo "$disk_device 200" > "$CGROUP_TOPDIR/$CHILD1/io.weight" + echo "$disk_device 300" > "$CGROUP_TOPDIR/$CHILD2/io.weight" + + # @测试步骤:4: 启动dd进程 + echo $$ > "$CGROUP_TOPDIR/$CHILD0/cgroup.procs" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &> "$TMP_FILE0" & + task_pid=$! + + echo $$ > "$CGROUP_TOPDIR/$CHILD1/cgroup.procs" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &> "$TMP_FILE1" & + + echo $$ > "$CGROUP_TOPDIR/$CHILD2/cgroup.procs" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &> "$TMP_FILE2" & + + wait $task_pid + echo $$ > "$CGROUP_TOPDIR/cgroup.procs" + + # @测试步骤:5: 获取dd进程的读取速度 + read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) + read_speed2=$(grep -oP '\d+.\d+' "$TMP_FILE1" | tail -n 1) + read_speed3=$(grep -oP '\d+.\d+' "$TMP_FILE2" | tail -n 1) + msg "read_speed1: $read_speed1" + msg "read_speed2: $read_speed2" + msg "read_speed3: $read_speed3" + + # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 + if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE0" "$TMP_FILE1" "$TMP_FILE2" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From a865aed1ff65040323258f69eaeeb2ed5d6f491e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 8 Aug 2024 13:24:19 +0800 Subject: [PATCH 18/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84pid?= =?UTF-8?q?s=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-pids-002.sh" | 1 - .../testcase/cgroup-v2-pids-max-001.sh" | 83 +++++++++++++++++ .../testcase/cgroup-v2-pids-max-002.sh" | 82 +++++++++++++++++ .../testcase/cgroup-v2-pids-max-003.sh" | 90 +++++++++++++++++++ 4 files changed, 255 insertions(+), 1 deletion(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" index 7a67125..b2ade89 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" @@ -48,7 +48,6 @@ do_test() { # @测试步骤:3: 运行进程并获取pids.current PID_NUM=$(cat "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.current) - msg "pids.current: $PID_NUM" echo $$ > "$CGROUP_TOPDIR"/pids/tasks # @测试步骤:4: 获取超过最大进程数的次数 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" new file mode 100755 index 0000000..8fd1aab --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" @@ -0,0 +1,83 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-114347-394098494 +# @用例名称: cgroup-v2-pids-max-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 pids max +# @用例类型: 测试pids.max控制文件, 进程数超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-pids-max-001" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用pids控制器 + if ! check_string_in_file "pids" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用pids控制器" + fi + # @预置条件: 启用io控制器 + echo "+pids" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置pids.max为2 + echo 2 > "$CGROUP_TOPDIR"/$CGROUP/pids.max + + # @测试步骤:2: 将当前shell加入cgroup + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + # @测试步骤:3: 运行两个子进程 + (echo "Here's some processes for you." | cat) &> "$TMP_FILE" + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @测试步骤:4: 获取超过最大进程数的次数 + fail_cnt=$(grep max "$CGROUP_TOPDIR"/$CGROUP/pids.events | awk '{print $2}') + msg "fail cnt: $fail_cnt" + + # @预期结果:1: fail cnt大于0 + assert_true [ "$fail_cnt" -gt 0 ] + + # @测试步骤:5: 获取最大进程数 + peak_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/pids.peak) + + # @预期结果:2: 最大进程数为2 + assert_true [ "$peak_cnt" -eq 2 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" new file mode 100755 index 0000000..9a6d52b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" @@ -0,0 +1,82 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-114351-356194752 +# @用例名称: cgroup-v2-pids-max-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 pids max +# @用例类型: 测试pids.max控制文件, 进程数不超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-pids-max-002" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用pids控制器 + if ! check_string_in_file "pids" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用pids控制器" + fi + # @预置条件: 启用io控制器 + echo "+pids" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 +} + + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置pids.max为2 + echo 2 > "$CGROUP_TOPDIR"/$CGROUP/pids.max + + # @测试步骤:2: 将当前shell加入cgroup + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + # @测试步骤:3: 运行进程并获取pid.current + pid_num=$(cat "$CGROUP_TOPDIR"/$CGROUP/pids.current) + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @测试步骤:4: 获取超过最大进程数的次数 + fail_cnt=$(grep max "$CGROUP_TOPDIR"/$CGROUP/pids.events | awk '{print $2}') + msg "fail cnt: $fail_cnt" + + # @预期结果:1: pid_num为2 + if [ "$pid_num" -eq 2 ]; then + assert_true [ "$fail_cnt" -eq 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" new file mode 100755 index 0000000..de8d2b6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" @@ -0,0 +1,90 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240808-114352-529042314 +# @用例名称: cgroup-v2-pids-max-003 +# @用例级别: 3 +# @用例标签: cgroup-v2 pids max +# @用例类型: 测试pids的层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-pids-max-003" +CHILD0="$CGROUP/child0" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + # @预置条件: 检查当前cgroup是否能启用pids控制器 + if ! check_string_in_file "pids" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用pids控制器" + fi + # @预置条件: 启用io控制器 + echo "+pids" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+pids" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置pids.max为2 + echo 2 > "$CGROUP_TOPDIR"/$CGROUP/pids.max + + # @测试步骤:2: 获取CHILD0的pids.max + pid_max=$(cat "$CGROUP_TOPDIR"/$CHILD0/pids.max) + + # @预期结果:1: CHILD0的pids.max为max + assert_true [ "$pid_max" = "max" ] + + # @测试步骤:3: 将当前shell加入CHILD0 + echo $$ > "$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + + # @测试步骤:4: 运行了两个子进程 + (echo "Here's some processes for you." | cat) &> "$TMP_FILE" + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @测试步骤:5: 获取超过最大进程数的次数 + fail_cnt=$(grep max "$CGROUP_TOPDIR"/$CHILD0/pids.events | awk '{print $2}') + + # @预期结果:2: 运行失败 + if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then + assert_true [ "$fail_cnt" -gt 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From 8c740ab8bfea0793ad39230f6e068c62eebef518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Fri, 9 Aug 2024 16:05:28 +0800 Subject: [PATCH 19/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84cpu?= =?UTF-8?q?set=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cgroup-v1-cpuset-cpu_exclusive.sh" | 1 - .../testcase/cgroup-v1-cpuset-cpus.sh" | 12 +- .../testcase/cgroup-v1-cpuset-mems.sh" | 5 +- .../cgroup-v2-cpuset-cpus-partition.sh" | 95 ++++++++++++++++ .../testcase/cgroup-v2-cpuset-cpus.sh" | 97 ++++++++++++++++ .../testcase/cgroup-v2-cpuset-mems.sh" | 104 ++++++++++++++++++ .../testcase/cgroup-v2-memory-pressure.sh" | 8 +- .../testcase/cgroup-v2-pids-max-001.sh" | 2 +- .../tst-cgroup/tst_lib/other_common.sh" | 8 ++ 9 files changed, 311 insertions(+), 21 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" index 47bfd98..62511d5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" @@ -41,7 +41,6 @@ tc_setup() { do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.cpu_exclusive文件 cgset -r cpuset.cpu_exclusive=1 cgroup-v1-cpuset-cpu_exclusive_1 || return 1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" index b79215a..c4a0c0d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" @@ -45,11 +45,9 @@ do_test() { : done } & - task_pid=$! echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-cpus/tasks - - sleep 3 + sleep 1 # @测试步骤:3: 检查进程绑定的CPU cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') @@ -57,13 +55,7 @@ do_test() { kill -9 $task_pid # @预期结果:1: 验证进程是否只在指定的CPU上运行 - if [ "$cpus_allowed" = "1" ]; then - msg "进程绑定到CPU1核心" - assert_true [ true ] - else - msg "进程未绑定到CPU1核心" - return 1 # 测试失败 - fi + assert_true [ "$cpus_allowed" = "1" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" index f655241..34cac7b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" @@ -49,7 +49,6 @@ tc_setup() { do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.mems文件 cgset -r cpuset.mems=1 cgroup-v1-cpuset-mems @@ -59,11 +58,9 @@ do_test() { : done } & - task_pid=$! echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mems/tasks - - sleep 3 + sleep 1 # @测试步骤:3: 检查进程绑定的NUMA节点 mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" new file mode 100755 index 0000000..d53922e --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" @@ -0,0 +1,95 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-112859-075549357 +# @用例名称: cgroup-v2-cpuset-cpus-partition +# @用例级别: 2 +# @用例标签: cgroup-v2 cpuset cpus partition +# @用例类型: 测试cpuset.cpus.patition接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpuset-cpus-partition" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + # @预置条件: 检查当前cgroup是否能启用cpuset控制器 + if ! check_string_in_file "cpuset" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpuset控制器" + fi + # @预置条件: 启用cpuset控制器 + echo "+cpuset" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpuset" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置CGROUP的cpuset.cpus为0-1 + echo "0-1" > "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus + + # @测试步骤:2: 设置CGROUP为partition root + echo "root" > "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @预期结果:1: 查看CGROUP/CHILD0/CHILD1的cpuset.cpus.effevtive是否为0-1 + cgroup_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective) + assert_true [ "$cgroup_cpuset_cpus_effective" = "0-1" ] + child0_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.effective) + assert_true [ "$child0_cpuset_cpus_effective" = "0-1" ] + child1_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD1/cpuset.cpus.effective) + assert_true [ "$child1_cpuset_cpus_effective" = "0-1" ] + + # @测试步骤:3: 设置CHILD0的cpuset.cpus为0 + echo "0" > "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus + + # @测试步骤:4: 设置CHILD0为partition root + echo "root" > "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.partition + + # @预期结果:2: 查看CHILD0的cpuset.cpus.effevtive是否为0 + child0_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.effective) + assert_true [ "$child0_cpuset_cpus_effective" = "0" ] + + # @预期结果:3: 查看CGROUP/CHILD1的cpuset.cpus.effevtive是否去除了cpu0 + cgroup_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective) + assert_true [ "$cgroup_cpuset_cpus_effective" = "1" ] + child1_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD1/cpuset.cpus.effective) + assert_true [ "$child1_cpuset_cpus_effective" = "1" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" new file mode 100755 index 0000000..ea60701 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" @@ -0,0 +1,97 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-093638-075516592 +# @用例名称: cgroup-v2-cpuset-cpus +# @用例级别: 1 +# @用例标签: cgroup-v2 cpuset cpus +# @用例类型: 测试cpuset.cpus接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpuset-cpus" +TMP_FILE=$(mktemp) + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpuset控制器 + if ! check_string_in_file "cpuset" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpuset控制器" + fi + # @预置条件: 启用cpuset控制器 + echo "+cpuset" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpuset.cpus为1 + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus + + # @预期结果:1: 验证CGROUP的可用cpu是否为1 + online_cpus=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective) + assert_true [ "$online_cpus" -eq 1 ] + + # @测试步骤:2: 启动一个进程并将其放入CGROUP + { + while true; do + : + done + } & + task_pid=$! + echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 1 + + # @预期结果:2: 验证进程是否绑定了指定的cpu + cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') + assert_true [ "$cpus_allowed" = "1" ] + + # @测试步骤:3: 获取cpu1的使用情况 + total_cpu1_usage=0 + for _ in $(seq 1 5); do + top -b -n 1 1 > "$TMP_FILE" + cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') + total_cpu1_usage=$(echo "$total_cpu1_usage + $cpu1_user_time" | bc) + sleep 1 + done + aver_cpu1_usage=$(echo "scale=2; $total_cpu1_usage / 5" | bc) + msg "aver_cpu_usage: $aver_cpu1_usage" + kill -9 $task_pid + + # @预期结果:3: 在误差允许范围内,cpu1的使用率应该为100% + assert_true [ "$(echo "$aver_cpu1_usage > 90.0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + # @删除临时文件: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" new file mode 100755 index 0000000..e3bda8c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" @@ -0,0 +1,104 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-113705-534422637 +# @用例名称: cgroup-v2-cpuset-mems +# @用例级别: 1 +# @用例标签: cgroup-v2 cpuset mems +# @用例类型: 测试cpuset.mems接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpuset-mems" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + # @预置条件:检查numactl命令是否存在 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + skip_test "系统不支持NUMA架构" + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + skip_test "系统NUMA节点数量小于2" + fi + # @预置条件: 检查是否安装了numastat + if ! is_numastat_installed; then + skip_test "numastat 未安装, 请先安装numastat" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpuset控制器 + if ! check_string_in_file "cpuset" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpuset控制器" + fi + # @预置条件: 启用cpuset控制器 + echo "+cpuset" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpuset.mems + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cpuset.mems + + # @预期结果:1: 验证CGROUP的可用内存节点是否为1 + online_mems=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.mems.effective) + assert_true [ "$online_mems" -eq 1 ] + + # @测试步骤:2: 启动一个进程并将其放入CGROUP + { + while true; do + : + done + } & + task_pid=$! + echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 1 + + # @预期结果:2: 验证进程是否绑定了指定的内存节点 + mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') + assert_true [ "$mems_allowed" -eq 1 ] + + # @测试步骤:3: 获取指定内存节点上进程的内存使用情况 + mems_usage_in_numa1=$(numastat -p $task_pid | awk 'END{print $3}') + kill -9 $task_pid + msg "mems_usage_in_numa1: $mems_usage_in_numa1" + + # @预期结果:3: mems_usage_in_numa1大于0 + assert_true [ "$(echo "$mems_usage_in_numa1 > 0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" index 9ea9f34..a76f691 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" @@ -50,10 +50,10 @@ do_test() { # @测试步骤:2: 关闭CGROUP上的memory.swap.max echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max - # @测试步骤:4: 注册触发器 + # @测试步骤:3: 注册触发器 stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/memory.pressure &> "$TMP_FILE" & - # @测试步骤:5: 运行两个25MB的匿名分配进程 + # @测试步骤:4: 运行两个25MB的匿名分配进程 echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 25M & sleep 2 @@ -61,10 +61,8 @@ do_test() { "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 25M & sleep 2 - # @测试步骤:6: 读取memor.pressure文件 + # @测试步骤:5: 读取memor.pressure文件 memory_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.pressure) - msg "memory_pressure: " - msg "$memory_pressure" avg10=$(echo "$memory_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') msg "avg10: $avg10" sleep 8 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" index 8fd1aab..5634ad2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v2-pids-max-001 # @用例级别: 1 # @用例标签: cgroup-v2 pids max -# @用例类型: 测试pids.max控制文件, 进程数超过限制 +# @用例类型: 测试pids.max接口文件, 进程数超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" index ef1592e..f7d917a 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" @@ -72,6 +72,14 @@ is_numactl_installed() { return 0 } +# 检查是否安装了numastat工具 +is_numastat_installed() { + if ! command -v numastat &> /dev/null; then + return 1 + fi + return 0 +} + # 检查cgroup版本是否为cgroup v1 check_cgroup_version_is_v1() { if [ "$(stat -fc %T "$CGROUP_TOPDIR")" = "tmpfs" ]; then -- Gitee From fd3b9a5d98beba50cce97607f6550c3b83dc0cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Fri, 9 Aug 2024 19:13:47 +0800 Subject: [PATCH 20/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84hug?= =?UTF-8?q?etlb=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cgroup-v1-hugetlb-limit_in_bytes-001.sh" | 32 ++--- .../cgroup-v1-hugetlb-limit_in_bytes-002.sh" | 30 +++-- .../cgroup-v1-hugetlb-limit_in_bytes-003.sh" | 2 +- .../cgroup-v1-hugetlb-limit_in_bytes-004.sh" | 2 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" | 4 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" | 2 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" | 6 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" | 2 +- .../testcase/cgroup-v2-hugetlb-max-001.sh" | 103 ++++++++++++++++ .../testcase/cgroup-v2-hugetlb-max-002.sh" | 114 +++++++++++++++++ .../testcase/cgroup-v2-hugetlb-max-003.sh" | 103 ++++++++++++++++ .../testcase/cgroup-v2-hugetlb-max-004.sh" | 115 ++++++++++++++++++ .../cgroup-v2-hugetlb-rsvd-max-001.sh" | 103 ++++++++++++++++ .../cgroup-v2-hugetlb-rsvd-max-002.sh" | 115 ++++++++++++++++++ .../cgroup-v2-hugetlb-rsvd-max-003.sh" | 103 ++++++++++++++++ .../cgroup-v2-hugetlb-rsvd-max-004.sh" | 115 ++++++++++++++++++ .../tst_lib/cgroup_util/alloc_hugepage.c" | 73 +++++++++++ .../cgroup_util/alloc_hugepage_rsvd.c" | 51 ++++++++ .../tst_lib/cgroup_util/bin/alloc_hugepage" | Bin 0 -> 16480 bytes .../cgroup_util/bin/alloc_hugepage_rsvd" | Bin 0 -> 16480 bytes 20 files changed, 1039 insertions(+), 36 deletions(-) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage.c" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage_rsvd.c" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" index 80f39df..ae849e1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240731-141907-292150738 # @用例名称: cgroup-v1-hugetlb-limit_in_bytes-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 hugetbl limit_in_bytes -# @用例类型: 测试设置hugetlb.limit_in_bytes并分配高于该限制的内存,hugepage大小为2MB +# @用例类型: 测试hugetlb.2MB.limit_in_bytes控制文件,超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -46,38 +46,42 @@ tc_setup() { do_test() { msg "this is do_test" - # @测试步骤:1: 获取系统本来的hugepage的数量 - HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + # @测试步骤:1: 获取系统hugepage的数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage的数量 echo 4 > /proc/sys/vm/nr_hugepages - # @测试步骤:2: 获取hugepage的大小 + # @测试步骤:3: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $HUGEPAGE_SIZE_KB" HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + + # @测试步骤:4: 验证hugepage的大小是否为2MB if [ "$HUGEPAGE_SIZE_MB" -ne 2 ]; then skip_test "hugepage的大小不等于2MB" fi - # @测试步骤:3: 挂载hugetlbfs + # @测试步骤:5: 挂载hugetlbfs mkdir -p /mnt/huge mount none /mnt/huge -t hugetlbfs - # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + # @测试步骤:6: 设置cgroup的hugetlb.limit_in_bytes为2MB echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.limit_in_bytes - # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 2 "$HUGEPAGE_SIZE_MB" &>/dev/null + # @测试步骤:7:分配2个hugepage + echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 2 "$HUGEPAGE_SIZE_MB" &>/dev/null - # @测试步骤:6: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt + # @测试步骤:8: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt大于0 - if [ "$MAX_USAGE" -eq 2097152 ] && [ "$FAILCNT" -gt 0 ]; then - assert_true [ true ] + if [ "$MAX_USAGE" -eq 2097152 ]; then + assert_true [ "$FAILCNT" -gt 0 ] else assert_false [ true ] fi @@ -91,7 +95,7 @@ tc_teardown() { umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-001 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" index 8854da6..9343060 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-115350-763429803 # @用例名称: cgroup-v1-hugetlb-limit_in_bytes-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 hugetlb limit_in_bytes -# @用例类型: 测试设置hugetlb.limit_in_bytes并分配低于该限制的内存,hugepage大小为2MB +# @用例类型: 测试hugetlb.2MB.limit_in_bytes控制文件, 不超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -45,38 +45,42 @@ tc_setup() { do_test() { msg "this is do_test" - # @测试步骤:1: 获取系统本来的hugepage的数量 - HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) + # @测试步骤:1: 获取系统hugepage的数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage的数量 echo 4 > /proc/sys/vm/nr_hugepages - # @测试步骤:2: 获取hugepage的大小 + # @测试步骤:3: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $HUGEPAGE_SIZE_KB" HUGEPAGE_SIZE_MB=$(conv_unit -o M -i K "$HUGEPAGE_SIZE_KB") + + # @测试步骤:4: 验证hugepage的大小是否为2MB if [ "$HUGEPAGE_SIZE_MB" -ne 2 ]; then skip_test "hugepage的大小不等于2MB" fi - # @测试步骤:3: 挂载hugetlbfs + # @测试步骤:5: 挂载hugetlbfs mkdir -p /mnt/huge mount none /mnt/huge -t hugetlbfs - # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + # @测试步骤:6: 设置cgroup的hugetlb.limit_in_bytes为2MB echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.limit_in_bytes - # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + # @测试步骤:7: 分配2个hugepage echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$HUGEPAGE_SIZE_MB" &>/dev/null - # @测试步骤:6: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt + # @测试步骤:8: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 - if [ "$MAX_USAGE" -eq 2097152 ] && [ "$FAILCNT" -eq 0 ]; then - assert_true [ true ] + if [ "$MAX_USAGE" -eq 2097152 ]; then + assert_true [ "$FAILCNT" -eq 0 ] else assert_false [ true ] fi @@ -90,7 +94,7 @@ tc_teardown() { umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-002 return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" index 88d41a4..781f5da 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" @@ -67,7 +67,7 @@ do_test() { # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.failcnt FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.failcnt) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" index 20774d1..4f214c4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" @@ -67,7 +67,7 @@ do_test() { # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_01 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.max_usage_in_bytes和hugetlb.1GB.failcnt MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.max_usage_in_bytes) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" index 8a2f6f5..fefa19d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" @@ -65,9 +65,9 @@ do_test() { # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.limit_in_bytes - # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + # @测试步骤:5: 分配2个hugepage echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 2 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 2 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.failcnt FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.failcnt) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" index 32f51fb..b47432b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" @@ -66,7 +66,7 @@ do_test() { # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.max_usage_in_bytes和hugetlb.2MB.rsvd.failcnt MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.max_usage_in_bytes) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" index 3cbf83d..cf2799c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" @@ -62,12 +62,12 @@ do_test() { mkdir -p /mnt/huge mount none /mnt/huge -t hugetlbfs - # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB + # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为512MB echo 512M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.limit_in_bytes - # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 + # @测试步骤:5: 分配1个hugepage echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.failcnt) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" index 38de399..0c25cdf 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" @@ -67,7 +67,7 @@ do_test() { # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/tasks - "${TST_TS_TOPDIR}"/tst_lib/hugetlb_test_02 1 "$HUGEPAGE_SIZE_MB" &>/dev/null + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.max_usage_in_bytes) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" new file mode 100755 index 0000000..cd0fb5b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" @@ -0,0 +1,103 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-160906-120322462 +# @用例名称: cgroup-v2-hugetlb-max-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 hugetlb max +# @用例类型:测试hugetlb.2MB.max接口文件,超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-max-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为2MB + if [ "$hugepage_size_mb" -ne 2 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 获取CGROUP的hugetlb.2MB.max值 + max=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max) + + # @预期结果:1: 验证hugetlb.2MB.max的值是否为max + assert_true [ "$max" = "max" ] + + # @测试步骤:7: 设置CGROUP的hugetlb.2MB.max为2MB + echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max + + # @测试步骤:8: 分配2个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 2 "$hugepage_size_mb" &> /dev/null + + # @测试步骤:9: 获取hugetlb.2MB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt大于0 + assert_true [ "$max_cnt" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" new file mode 100755 index 0000000..abf057e --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" @@ -0,0 +1,114 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-165555-512291475 +# @用例名称: cgroup-v2-hugetlb-max-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 hugetlb max +# @用例类型:测试hugetlb.2MB.max接口文件, 不超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-max-002" +TOLERANCE=0.3 + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage的数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage的数量 + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为2MB + if [ "$hugepage_size_mb" -ne 2 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 设置CGROUP的hugetlb.2MB.max为2MB + echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max + + # @测试步骤:7: 分配1个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &> /dev/null & + + # @测试步骤:8: 获取hugetlb.2MB.current + total_hugepage_current=0 + for _ in $(seq 1 5); do + current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.current) + current=$(echo "$current / 1024 / 1024" | bc) + total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) + sleep 1 + done + aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) + msg "aver_hugepage_current: $aver_hugepage_current" + + # @预期结果:1: 在误差允许的范围内,aver_hugepage_current等于2 + diff=$((aver_hugepage_current - 2)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @测试步骤:9: 获取hugetlb.2MB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt等于0 + assert_true [ "$max_cnt" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" new file mode 100755 index 0000000..7dec5ab --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" @@ -0,0 +1,103 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-171017-765935943 +# @用例名称: cgroup-v2-hugetlb-max-003 +# @用例级别: 1 +# @用例标签: cgroup v2 hugetlb max +# @用例类型:测试hugetlb.1GB.max接口文件, 超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-max-003" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为1GB + if [ "$hugepage_size_mb" -ne 1024 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 获取CGROUP的hugetlb.1GB.max值 + max=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max) + + # @预期结果:1: 验证hugetlb.1GB.max的值是否为max + assert_true [ "$max" = "max" ] + + # @测试步骤:7: 设置CGROUP的hugetlb.1GB.max为512MB + echo 512M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max + + # @测试步骤:8: 分配1个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &> /dev/null + + # @测试步骤:9: 获取hugetlb.1GB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt大于0 + assert_true [ "$max_cnt" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" new file mode 100755 index 0000000..83b2cd9 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" @@ -0,0 +1,115 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-171019-081310498 +# @用例名称: cgroup-v2-hugetlb-max-004 +# @用例级别: 2 +# @用例标签: cgroup v2 hugetlb max +# @用例类型:测试hugetlb.1GB.max接口文件, 不超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-max-004" +TOLERANCE=0.3 + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为1GB + if [ "$hugepage_size_mb" -ne 1024 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 设置CGROUP的hugetlb.1GB.max为1GB + echo 1024M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max + + # @测试步骤:7: 分配1个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &> /dev/null & + + # @测试步骤:8: 获取hugetlb.1GB.current + total_hugepage_current=0 + for _ in $(seq 1 5); do + current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.current) + current=$(echo "$current / 1024 / 1024" | bc) + total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) + sleep 1 + done + aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) + msg "aver_hugepage_current: $aver_hugepage_current" + sleep 2 + + # @预期结果:1: 在误差允许的范围内,aver_hugepage_current等于1024 + diff=$((aver_hugepage_current - 1024)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @测试步骤:9: 获取hugetlb.1GB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt等于0 + assert_true [ "$max_cnt" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" new file mode 100755 index 0000000..8e825c8 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" @@ -0,0 +1,103 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-185414-695820636 +# @用例名称: cgroup-v2-hugetlb-rsvd-max-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 hugetlb rsvd max +# @用例类型:测试hugetlb.2MB.rsvd.max接口文件,超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-rsvd-max-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为2MB + if [ "$hugepage_size_mb" -ne 2 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 获取CGROUP的hugetlb.2MB.rsvd.max值 + max=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max) + + # @预期结果:1: 验证hugetlb.2MB.rsvd.max的值是否为max + assert_true [ "$max" = "max" ] + + # @测试步骤:7: 设置CGROUP的hugetlb.2MB.rsvd.max为2MB + echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max + + # @测试步骤:8: 分配2个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 2 "$hugepage_size_mb" &> /dev/null + + # @测试步骤:9: 获取hugetlb.2MB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt大于0 + assert_true [ "$max_cnt" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" new file mode 100755 index 0000000..ed95f09 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" @@ -0,0 +1,115 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-185415-655135944 +# @用例名称: cgroup-v2-hugetlb-rsvd-max-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 hugetlb rsvd max +# @用例类型:测试hugetlb.2MB.rsvd.max接口文件,不超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-rsvd-max-002" +TOLERANCE=0.3 + + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 4 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为2MB + if [ "$hugepage_size_mb" -ne 2 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 设置CGROUP的hugetlb.2MB.rsvd.max为2MB + echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max + + # @测试步骤:7: 分配1个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &> /dev/null & + + # @测试步骤:8: 获取hugetlb.2MB.rsvd.current + total_hugepage_current=0 + for _ in $(seq 1 5); do + current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.current) + current=$(echo "$current / 1024 / 1024" | bc) + total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) + sleep 1 + done + aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) + msg "aver_hugepage_current: $aver_hugepage_current" + + # @预期结果:1: 在误差允许的范围内,aver_hugepage_current等于2 + diff=$((aver_hugepage_current - 2)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @测试步骤:9: 获取hugetlb.2MB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt等于0 + assert_true [ "$max_cnt" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" new file mode 100755 index 0000000..61ca77e --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" @@ -0,0 +1,103 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-185416-658896566 +# @用例名称: cgroup-v2-hugetlb-rsvd-max-003 +# @用例级别: 1 +# @用例标签: cgroup v2 hugetlb rsvd max +# @用例类型:测试hugetlb.1GB.rsvd.max接口文件, 超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-rsvd-max-003" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为1GB + if [ "$hugepage_size_mb" -ne 1024 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 获取CGROUP的hugetlb.1GB.rsvd.max值 + max=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max) + + # @预期结果:1: 验证hugetlb.1GB.max的值是否为max + assert_true [ "$max" = "max" ] + + # @测试步骤:7: 设置CGROUP的hugetlb.1GB.rsvd.max为512MB + echo 512M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max + + # @测试步骤:8: 分配1个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &> /dev/null + + # @测试步骤:9: 获取hugetlb.1GBB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt大于0 + assert_true [ "$max_cnt" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" new file mode 100755 index 0000000..f846a3d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" @@ -0,0 +1,115 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-185417-880857496 +# @用例名称: cgroup-v2-hugetlb-rsvd-max-004 +# @用例级别: 2 +# @用例标签: cgroup v2 hugetlb rsvd max +# @用例类型:测试hugetlb.1GB.rsvd.max接口文件, 不超过限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-hugetlb-rsvd-max-004" +TOLERANCE=0.3 + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 + if ! check_string_in_file "hugetlb" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用hugetlb控制器" + fi + # @预置条件: 启用hugetlb控制器 + echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取系统hugepage数量 + hugepage_size=$(cat /proc/sys/vm/nr_hugepages) + + # @测试步骤:2: 修改系统hugepage数量 + echo 1 > /proc/sys/vm/nr_hugepages + + # @测试步骤:3: 获取hugepage大小 + hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') + msg "hugepage size: $hugepage_size_kb" + hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") + + # @测试步骤:4: 验证hugepage大小是否为1GB + if [ "$hugepage_size_mb" -ne 1024 ]; then + skip_test "hugepage大小不等于2MB" + fi + + # @测试步骤:5: 挂载hugetlbfs + mkdir -p /mnt/huge + mount none /mnt/huge -t hugetlbfs + + # @测试步骤:6: 设置CGROUP的hugetlb.1GB.rsvd.max为1GB + echo 1024M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max + + # @测试步骤:7: 分配1个hugepage + echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &> /dev/null & + + # @测试步骤:8: 获取hugetlb.1GB.rsvd.current + total_hugepage_current=0 + for _ in $(seq 1 5); do + current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.current) + current=$(echo "$current / 1024 / 1024" | bc) + total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) + sleep 1 + done + aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) + msg "aver_hugepage_current: $aver_hugepage_current" + sleep 2 + + # @预期结果:1: 在误差允许的范围内,aver_hugepage_current等于1024 + diff=$((aver_hugepage_current - 1024)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @测试步骤:9: 获取hugetlb.1GB.events的max字段 + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') + echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:2: max_cnt等于0 + assert_true [ "$max_cnt" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 卸载hugetlbfs + umount /mnt/huge + rmdir /mnt/huge + # @清理工作: 恢复系统本来的hugepage的大小 + echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage.c" new file mode 100644 index 0000000..6c150b5 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage.c" @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include + +#define FILE_NAME "/mnt/huge/hugepagefile" +#define PROTECTION (PROT_READ | PROT_WRITE) +#define ADDR (void *)(0x0UL) +#define FLAGS (MAP_SHARED) + +size_t size = 0; + +static void write_bytes(char *addr) +{ + unsigned long i; + + for (i = 0; i < size; i++) + *(addr + i) = (char)i; +} + +static int read_bytes(char *addr) +{ + unsigned long i; + + for (i = 0; i < size; i++) + if (*(addr + i) != (char)i) { + printf("Mismatch at %lu\n", i); + return 1; + } + return 0; +} + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "用法: %s \n", argv[0]); + exit(1); + } + + int hugepage_count = atoi(argv[1]); + int hugepage_size = atoi(argv[2]); + size = hugepage_count * hugepage_size * 1024 * 1024UL; + + void *addr; + int fd, ret; + fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); + if (fd < 0) { + perror("打开文件失败"); + exit(1); + } + + // 申请hugepage内存 + addr = mmap(ADDR, size, PROTECTION, FLAGS, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + unlink(FILE_NAME); + exit(1); + } + + printf("内存映射起始地址: %p\n", addr); + write_bytes(addr); + ret = read_bytes(addr); + + sleep(5); + + // 释放hugepage内存 + munmap(addr, size); + close(fd); + unlink(FILE_NAME); + + return ret; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage_rsvd.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage_rsvd.c" new file mode 100644 index 0000000..e9c5ec7 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_hugepage_rsvd.c" @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +#define FILE_NAME "/mnt/huge/hugepagefile" +#define PROTECTION (PROT_READ | PROT_WRITE) +#define ADDR (void *)(0x0UL) +#define FLAGS (MAP_SHARED) + +size_t size = 0; + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "用法: %s \n", argv[0]); + exit(1); + } + + int hugepage_count = atoi(argv[1]); + int hugepage_size = atoi(argv[2]); + size = hugepage_count * hugepage_size * 1024 * 1024UL; + + void *addr; + int fd, ret; + fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); + if (fd < 0) { + perror("打开文件失败"); + exit(1); + } + + // 申请hugepage内存 + addr = mmap(ADDR, size, PROTECTION, FLAGS, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + unlink(FILE_NAME); + exit(1); + } + + printf("内存映射起始地址: %p\n", addr); + + sleep(5); + + // 释放hugepage内存 + munmap(addr, size); + close(fd); + unlink(FILE_NAME); + + return 0; +} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage" new file mode 100755 index 0000000000000000000000000000000000000000..debef21595ebfa251602ff670d296e31c6b850be GIT binary patch literal 16480 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 literal 0 HcmV?d00001 -- Gitee From f1c3c1b57cc3eb16f391317db8b065456a3e2196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Fri, 9 Aug 2024 23:47:21 +0800 Subject: [PATCH 21/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84fre?= =?UTF-8?q?eze=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v2-freeze-001.sh" | 86 ++++++++++ .../testcase/cgroup-v2-freeze-002.sh" | 159 ++++++++++++++++++ .../testcase/cgroup-v2-freeze-003.sh" | 76 +++++++++ .../testcase/cgroup-v2-freeze-004.sh" | 73 ++++++++ .../testcase/cgroup-v2-freeze-005.sh" | 99 +++++++++++ 5 files changed, 493 insertions(+) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" new file mode 100755 index 0000000..2653b1b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-225328-709368100 +# @用例名称: cgroup-v2-freeze-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 freeze +# @用例类型: 测试cgroup.freeze接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-freeze-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 运行一个进程 + { + while true; do + :; + done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + # @测试步骤:2: 查看CGROUP的cgorup.event中的frozen字段 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + + # @预期结果:1: frozen字段为0 + assert_true [ "$frozen" -eq 0 ] + + # @测试步骤:3: 冻结CGROUP的进程 + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @测试步骤:4: 查看CGROUP的cgorup.event中的frozen字段 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + + # @预期结果:2: frozen字段为1 + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:5: 解冻CGROUP的进程 + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @测试步骤:6: 查看CGROUP的cgorup.event中的frozen字段 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + + # @预期结果:3: frozen字段为0 + kill -9 $task_pid + assert_true [ "$frozen" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" new file mode 100755 index 0000000..263f7a6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" @@ -0,0 +1,159 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-230001-993472792 +# @用例名称: cgroup-v2-freeze-002 +# @用例级别: 1 +# @用例标签: cgroup-v2 freeze +# @用例类型: 测试cgroup.freeze接口文件, 测试cgroup的层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +# CGROUP +# / | \ +# CHILD0 CHILD1 CHILD2 +# / \ | +# CHILD00 CHILD01 CHILD10 +# | +# CHILD100 +# | +# CHILD1000 +CGROUP="cgroup-v2-freeze-002" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" +CHILD2="$CGROUP/child3" +CHILD00="$CHILD0/child0" +CHILD01="$CHILD0/child1" +CHILD10="$CHILD1/child0" +CHILD100="$CHILD10/child0" +CHILD1000="$CHILD100/child0" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + mkdir "$CGROUP_TOPDIR"/$CHILD00 + mkdir "$CGROUP_TOPDIR"/$CHILD01 + mkdir "$CGROUP_TOPDIR"/$CHILD10 + mkdir "$CGROUP_TOPDIR"/$CHILD100 + mkdir "$CGROUP_TOPDIR"/$CHILD1000 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 在CHILD01上运行一个进程 + { + while true; do + :; + done + } & + task_pid0=$! + echo $task_pid0 >"$CGROUP_TOPDIR"/$CHILD01/cgroup.procs + + # @测试步骤:2: 在CHILD1000上运行一个进程 + { + while true; do + :; + done + } & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/$CHILD1000/cgroup.procs + + # @测试步骤:3: 在CHILD2上运行一个进程 + { + while true; do + :; + done + } & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + + # @测试步骤:4: 冻结CHILD0 + echo 1 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.freeze + + # @测试步骤:5: 冻结CHILD10 + echo 1 >"$CGROUP_TOPDIR"/$CHILD10/cgroup.freeze + + # @测试步骤:6: 冻结CHILD100 + echo 1 >"$CGROUP_TOPDIR"/$CHILD100/cgroup.freeze + + # @预期结果:1: CGROUP和CHILD1的cgroup.event中的frozen字段为0 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + + # @测试步骤:7: 冻结CGROUP + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @预期结果:2: CGROUP, CHILD0, CHILD1的cgroup.event中的frozen字段为1 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:8: 解冻CHILD0, CHILD10, CHILD100 + echo 0 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.freeze + echo 0 >"$CGROUP_TOPDIR"/$CHILD10/cgroup.freeze + echo 0 >"$CGROUP_TOPDIR"/$CHILD100/cgroup.freeze + + # @预期结果:3: CHILD00, CHILD1000的cgroup.event中的frozen字段为1 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1000/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:9: 解冻CGROUP + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @预期结果:4: CHILD00, CHILD2的cgroup.event中的frozen字段为0 + kill -9 $task_pid0 $task_pid1 $task_pid2 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD2/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD1000 + rmdir "$CGROUP_TOPDIR"/$CHILD100 + rmdir "$CGROUP_TOPDIR"/$CHILD10 + rmdir "$CGROUP_TOPDIR"/$CHILD01 + rmdir "$CGROUP_TOPDIR"/$CHILD00 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" new file mode 100755 index 0000000..1ce1499 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" @@ -0,0 +1,76 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-232855-348990156 +# @用例名称: cgroup-v2-freeze-003 +# @用例级别: 2 +# @用例标签: cgroup-v2 freeze +# @用例类型: 测试cgroup.freeze接口文件, 测试cgroup的层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-freeze-003" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 冻结CGROUP的进程 + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @测试步骤:2: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + + # @测试步骤:3: 在CHILD0中运行一个进程 + { + while true; do + :; + done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + + # @预期结果:1: CHILD0, CGROUP的cgorup.event中的frozen字段为1 + kill -9 $task_pid + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" new file mode 100755 index 0000000..cc1106d --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" @@ -0,0 +1,73 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-233224-494284037 +# @用例名称: cgroup-v2-freeze-004 +# @用例级别: 2 +# @用例标签: cgroup-v2 freeze +# @用例类型: 测试cgroup.freeze接口文件, 测试cgroup的层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-freeze-004" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 冻结CGROUP的进程 + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @测试步骤:2: 删除CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + + # @预期结果:1: CGROUP的cgorup.event中的frozen字段为1 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:3: 创建CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + + # @预期结果:2: CHILD0的cgorup.event中的frozen字段为1 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @测试清理: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" new file mode 100755 index 0000000..fdf8a36 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" @@ -0,0 +1,99 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-233752-330450571 +# @用例名称: cgroup-v2-freeze-005 +# @用例级别: 2 +# @用例标签: cgroup-v2 freeze +# @用例类型: 测试cgroup.freeze接口文件, 测试迁移的情况 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP0="cgroup-v2-freeze-004-01" +CGROUP1="cgroup-v2-freeze-004-02" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP0 + mkdir "$CGROUP_TOPDIR"/$CGROUP1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 在CGROUP0中运行一个进程 + { + while true; do + :; + done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP0/cgroup.procs + + # @测试步骤:2: 冻结CGROUP1 + echo 1 >"$CGROUP_TOPDIR"/$CGROUP1/cgroup.freeze + + # @测试步骤:3: 将进程迁移到CGROUP1 + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP1/cgroup.procs + + # @预期结果:1: CGROUP1的cgorup.event中的frozen字段为1,CGROUP0的frozen字段为0 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP1/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + + # @测试步骤:4: 将进程迁回CGROUP0 + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP0/cgroup.procs + + # @预期结果:2: CGROUP0的cgorup.event中的frozen字段为0,CGROUP1的frozen字段为1 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP1/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:5: 冻结CGROUP0 + echo 1 >"$CGROUP_TOPDIR"/$CGROUP0/cgroup.freeze + + # @测试步骤:6: 将进程迁移到CGROUP1 + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP1/cgroup.procs + + # @预期结果:3: CGROUP1的cgorup.event中的frozen字段为1,CGROUP0的frozen字段为1 + kill -9 $task_pid + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP1/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP0 + rmdir "$CGROUP_TOPDIR"/$CGROUP1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From 77ff6d82135cc10a16507d3848b330af0c8e92f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Sat, 10 Aug 2024 00:56:37 +0800 Subject: [PATCH 22/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cgroup=20v2=E7=9A=84?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v2-kill-001.sh" | 73 +++++++++++ .../testcase/cgroup-v2-kill-002.sh" | 120 ++++++++++++++++++ .../testcase/cgroup-v2-populated.sh" | 96 ++++++++++++++ .../cgroup-v2-subtree_control-001.sh" | 81 ++++++++++++ .../cgroup-v2-subtree_control-002.sh" | 73 +++++++++++ .../cgroup-v2-subtree_control-003.sh" | 76 +++++++++++ .../cgroup-v2-subtree_control-004.sh" | 85 +++++++++++++ .../testcase/cgroup-v2-type-001.sh" | 65 ++++++++++ .../testcase/cgroup-v2-type-002.sh" | 83 ++++++++++++ 9 files changed, 752 insertions(+) create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" new file mode 100755 index 0000000..bede827 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" @@ -0,0 +1,73 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-234742-111875618 +# @用例名称: cgroup-v2-kill-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 kill +# @用例类型: 测试cgroup.kill接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-kill-001" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 运行一个进程 + { + while true; do + :; + done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + + # @预期结果:1: CGROUP的cgroup.event中的populated字段为1 + populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 1 ] + + # @测试步骤:2: 写入cgroup.kill + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.kill + + # @预期结果:2: CGROUP的cgroup.event中的populated字段为0 + populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理动作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" new file mode 100755 index 0000000..9f311fe --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" @@ -0,0 +1,120 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240809-235140-559937243 +# @用例名称: cgroup-v2-kill-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 kill +# @用例类型: 测试cgroup.kill接口文件, 测试层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +# CGROUP +# / | \ +# CHILD0 CHILD1 CHILD2 +# / \ | +# CHILD00 CHILD01 CHILD10 +# | +# CHILD100 +# | +# CHILD1000 +CGROUP="cgroup-v2-kill-002" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" +CHILD2="$CGROUP/child3" +CHILD00="$CHILD0/child0" +CHILD01="$CHILD0/child1" +CHILD10="$CHILD1/child0" +CHILD100="$CHILD10/child0" +CHILD1000="$CHILD100/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + mkdir "$CGROUP_TOPDIR"/$CHILD00 + mkdir "$CGROUP_TOPDIR"/$CHILD01 + mkdir "$CGROUP_TOPDIR"/$CHILD10 + mkdir "$CGROUP_TOPDIR"/$CHILD100 + mkdir "$CGROUP_TOPDIR"/$CHILD1000 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 在CHILD01上运行一个进程 + { + while true; do + :; + done + } & + task_pid0=$! + echo $task_pid0 >"$CGROUP_TOPDIR"/$CHILD01/cgroup.procs + + # @测试步骤:2: 在CHILD1000上运行一个进程 + { + while true; do + :; + done + } & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/$CHILD1000/cgroup.procs + + # @测试步骤:3: 在CHILD2上运行一个进程 + { + while true; do + :; + done + } & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + + # @测试步骤:4: 在CGROUP写入cgroup.kill + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.kill + + # @预期结果:1: CGROUP的cgroup.event中的populated字段为0 + populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理动作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD1000 + rmdir "$CGROUP_TOPDIR"/$CHILD100 + rmdir "$CGROUP_TOPDIR"/$CHILD10 + rmdir "$CGROUP_TOPDIR"/$CHILD01 + rmdir "$CGROUP_TOPDIR"/$CHILD00 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" new file mode 100755 index 0000000..8fcbc4a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" @@ -0,0 +1,96 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-005006-336461552 +# @用例名称: cgroup-v2-populated +# @用例级别: 1 +# @用例标签: cgroup-v2 populated +# @用例类型: 测试cgroup.events中的populated字段 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-type-001" +CHILD0="$CGROUP/child0" +CHILD00="$CHILD0/child0" +CHILD01="$CHILD0/child1" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD00 + mkdir "$CGROUP_TOPDIR"/$CHILD01 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 运行一个进程并将其放入CHILD00 + { + while true; do + sleep 1 + + done + }& + task_pid=$! + echo $task_pid > "$CGROUP_TOPDIR"/$CHILD00/cgroup.procs + + # @预测结果:1: CGROUP, CHILD0, CHILD00的populated字段为1,CHILD01的populated字段为0 + populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 1 ] + populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 1 ] + populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 1 ] + populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD01/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + + # @测试步骤:2: 将进程迁移到root cgroup + echo $task_pid > "$CGROUP_TOPDIR"/cgroup.procs + + # @预期结果:1: 四个cgroup的populated字段为0 + populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD01/cgroup.events | awk '{print $2}') + assert_true [ "$populated" -eq 0 ] + kill -9 $task_pid + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD01 + rmdir "$CGROUP_TOPDIR"/$CHILD00 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" new file mode 100755 index 0000000..cec9ec6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" @@ -0,0 +1,81 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-000034-129698018 +# @用例名称: cgroup-v2-subtree_control-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 subtree_control +# @用例类型: 测试cgroup.subtree_control接口文件,不能够在domain cgroup中加入进程在启用了subtree_control的cgroup中 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-subtree_control-001" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "根cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启用CGROUP的subtree_control的memory + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control + + # @测试步骤:2: 运行一个进程 + { + while true; do + :; + done + } & + task_pid=$! + + # @测试步骤:3: 写入CGROUP的cgroup.procs + ret=0 + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs || ret=-1 + + # @预期结果:1: 写入失败 + kill -9 $task_pid + assert_true [ "$ret" -eq -1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" new file mode 100755 index 0000000..97ed1dc --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" @@ -0,0 +1,73 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-000036-358265138 +# @用例名称: cgroup-v2-subtree_control-002 +# @用例级别: 1 +# @用例标签: cgroup-v2 subtree_control +# @用例类型: 测试cgroup.subtree_control接口文件,子cgroup的subtree_control只能包含父cgroup的subtree_control +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-subtree_control-002" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "根cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 检查CGROUP的subtree_control为空 + assert_true [ -z "$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control)" ] + + # @测试步骤:2: 启用CHILD0的subtree_control的memory + ret=0 + echo "+memory" >"$CGROUP_TOPDIR"/$CHILD0/cgroup.subtree_control || ret=-1 + + # @预期结果:1: 启用失败 + assert_true [ "$ret" -eq -1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @测试清理: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" new file mode 100755 index 0000000..c58a183 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" @@ -0,0 +1,76 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-000037-405402992 +# @用例名称: cgroup-v2-subtree_control-003 +# @用例级别: 1 +# @用例标签: cgroup-v2 subtree_control +# @用例类型: 测试cgroup.subtree_control接口文件, 不能禁用父cgroup的subtree_control因为子cgroup的subtree_control包含父cgroup的subtree_control +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-subtree_control-003" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "根cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启用CGROUP的subtree_control的memory + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control + + # @测试步骤:2: 启用CHILD0的subtree_control的memory + echo "+memory" >"$CGROUP_TOPDIR"/$CHILD0/cgroup.subtree_control + + # @测试步骤:3: 禁用CGROUP的subtree_control的memory + ret=0 + echo "-memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || ret=-1 + + # @预期结果:1: 禁用失败 + assert_true [ "$ret" -eq -1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" new file mode 100755 index 0000000..2a1659c --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" @@ -0,0 +1,85 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-002148-359999787 +# @用例名称: cgroup-v2-subtree_control-004 +# @用例级别: 2 +# @用例标签: cgroup-v2 subtree_control +# @用例类型: 测试cgroup.subtree_control接口文件, 在threaded cgroup能够加入线程在启用了subtree_control的cgroup中 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-subtree_control-001" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "根cgroup不能启用memory控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 修改CGROUP和CHILD0的类型 + echo "threaded" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.type + echo "threaded" >"$CGROUP_TOPDIR"/$CHILD0/cgroup.type + + # @测试步骤:2: 启用CGROUP的subtree_control的cpu + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control + + # @测试步骤:3: 运行一个线程 + { + while true; do + :; + done + } & + task_pid=$! + + # @测试步骤:4: 写入CGROUP的cgroup.procs + ret=0 + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs || ret=-1 + + # @预期结果:1: 写入成功 + kill -9 $task_pid + assert_true [ "$ret" -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-001.sh" new file mode 100755 index 0000000..5214eb6 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-001.sh" @@ -0,0 +1,65 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-003655-734736228 +# @用例名称: cgroup-v2-type-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 type +# @用例类型: 测试cgroup.type接口文件,当子cgroup设置为threaded时,父cgroup自动设置为domain threaded +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-type-001" +CHILD0="$CGROUP/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置CHILD0的type为threaded + echo "threaded" >"$CGROUP_TOPDIR"/$CHILD0/cgroup.type + + # @测试步骤:2: 获取CGROUP的type + type=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.type) + + # @预期结果:1: CGROUP的type为domain threaded + assert_true [ "$type" = "domain threaded" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" new file mode 100755 index 0000000..84d2e56 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" @@ -0,0 +1,83 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-003658-663844108 +# @用例名称: cgroup-v2-type-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 type +# @用例类型: 测试cgroup.type接口文件, 测试层次结构约束 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-type-001" +CHILD0="$CGROUP/child0" +CHILD1="$CHILD0/child1" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 启用CHILD0的type为threaded + echo "threaded" >"$CGROUP_TOPDIR"/$CHILD0/cgroup.type + + # @测试步骤:2: 获取CHILD1的type + type=$(cat "$CGROUP_TOPDIR"/$CHILD1/cgroup.type) + + # @预期结果:1: CHILD1的type为domain invalid + assert_true [ "$type" = "domain invalid" ] + + # @测试步骤:3: 运行一个进程 + { + while true; do + :; + done + }& + task_pid=$! + + # @测试步骤:4: 将进程加入CHILD1 + ret=0 + echo $task_pid >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs || ret=-1 + + # @预期结果:2: 将进程加入CHILD1失败 + kill -9 $task_pid + assert_true [ $ret -eq -1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### -- Gitee From ccdfb07d34474dbea84881e30dcc6b405510e1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 19:47:35 +0800 Subject: [PATCH 23/37] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst-cgroup/install_package.sh" | 25 + .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 87 +- .../cgroup-v1-blkio-bfq-weight_device.sh" | 105 +- ...roup-v1-blkio-throttle-read_bps_device.sh" | 19 +- ...oup-v1-blkio-throttle-read_iops_device.sh" | 21 +- ...oup-v1-blkio-throttle-write_bps_device.sh" | 17 +- ...up-v1-blkio-throttle-write_iops_device.sh" | 19 +- .../testcase/cgroup-v1-cpu-cfs-001.sh" | 85 + .../testcase/cgroup-v1-cpu-cfs-002.sh" | 85 + .../testcase/cgroup-v1-cpu-shares.sh" | 118 +- .../testcase/cgroup-v1-cpuacct-stat.sh" | 37 +- .../testcase/cgroup-v1-cpuacct-usage.sh" | 28 +- .../testcase/cgroup-v1-cpuacct-usage_all.sh" | 112 +- .../cgroup-v1-cpuacct-usage_percpu.sh" | 82 +- .../cgroup-v1-cpuacct-usage_percpu_sys.sh" | 86 +- .../cgroup-v1-cpuacct-usage_percpu_user.sh" | 89 +- .../testcase/cgroup-v1-cpuacct-usage_sys.sh" | 38 +- .../testcase/cgroup-v1-cpuacct-usage_user.sh" | 39 +- .../cgroup-v1-cpuset-cpu_exclusive.sh" | 107 +- .../testcase/cgroup-v1-cpuset-cpus.sh" | 78 +- .../cgroup-v1-cpuset-mem_exclusive.sh" | 121 +- .../cgroup-v1-cpuset-memory_migrate-001.sh" | 131 ++ .../cgroup-v1-cpuset-memory_migrate-002.sh" | 126 ++ ...group-v1-cpuset-memory_spread_page-001.sh" | 131 +- ...group-v1-cpuset-memory_spread_page-002.sh" | 122 +- .../testcase/cgroup-v1-cpuset-mems.sh" | 77 +- .../cgroup-v1-cpuset-sched_load_balance.sh" | 143 ++ .../testcase/cgroup-v1-devices-001.sh" | 69 +- .../testcase/cgroup-v1-devices-002.sh" | 39 +- .../testcase/cgroup-v1-freezer-001.sh" | 26 +- .../testcase/cgroup-v1-freezer-002.sh" | 83 +- .../cgroup-v1-hugetlb-limit_in_bytes-001.sh" | 26 +- .../cgroup-v1-hugetlb-limit_in_bytes-002.sh" | 22 +- .../cgroup-v1-hugetlb-limit_in_bytes-003.sh" | 26 +- .../cgroup-v1-hugetlb-limit_in_bytes-004.sh" | 28 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" | 24 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" | 26 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" | 24 +- ...oup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" | 26 +- .../cgroup-v1-memory-limit_in_bytes.sh" | 33 +- .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 43 +- .../cgroup-v1-memory-oom_control-001.sh" | 24 +- .../cgroup-v1-memory-oom_control-002.sh" | 39 +- .../cgroup-v1-memory-pressure_level.sh" | 29 +- .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 34 +- .../cgroup-v1-memory-swappiness-001.sh" | 28 +- .../cgroup-v1-memory-swappiness-002.sh" | 28 +- .../testcase/cgroup-v1-net_cls-001.sh" | 19 +- .../testcase/cgroup-v1-net_cls-002.sh" | 15 +- .../testcase/cgroup-v1-net_prio.sh" | 18 +- .../testcase/cgroup-v1-perf_event.sh" | 48 +- .../testcase/cgroup-v1-pids-001.sh" | 24 +- .../testcase/cgroup-v1-pids-002.sh" | 24 +- .../testcase/cgroup-v1-pids-003.sh" | 30 +- .../testcase/cgroup-v2-cpu-idle-001.sh" | 68 +- .../testcase/cgroup-v2-cpu-idle-002.sh" | 68 +- .../testcase/cgroup-v2-cpu-max-burst-001.sh" | 20 +- .../testcase/cgroup-v2-cpu-max-burst-002.sh" | 23 +- .../tst-cgroup/testcase/cgroup-v2-cpu-max.sh" | 86 + .../testcase/cgroup-v2-cpu-pressure.sh" | 64 +- .../testcase/cgroup-v2-cpu-stat.sh" | 81 + .../testcase/cgroup-v2-cpu-weight-001.sh" | 93 +- .../testcase/cgroup-v2-cpu-weight-002.sh" | 123 +- .../cgroup-v2-cpu-weight-nice-001.sh" | 94 +- .../cgroup-v2-cpu-weight-nice-002.sh" | 141 ++ .../cgroup-v2-cpuset-cpus-partition.sh" | 76 +- .../testcase/cgroup-v2-cpuset-cpus.sh" | 76 +- .../testcase/cgroup-v2-cpuset-mems.sh" | 19 +- .../testcase/cgroup-v2-freeze-001.sh" | 10 +- .../testcase/cgroup-v2-freeze-002.sh" | 76 +- .../testcase/cgroup-v2-freeze-003.sh" | 11 +- .../testcase/cgroup-v2-freeze-004.sh" | 4 +- .../testcase/cgroup-v2-freeze-005.sh" | 11 +- .../testcase/cgroup-v2-hugetlb-max-001.sh" | 29 +- .../testcase/cgroup-v2-hugetlb-max-002.sh" | 27 +- .../testcase/cgroup-v2-hugetlb-max-003.sh" | 27 +- .../testcase/cgroup-v2-hugetlb-max-004.sh" | 29 +- .../cgroup-v2-hugetlb-rsvd-max-001.sh" | 29 +- .../cgroup-v2-hugetlb-rsvd-max-002.sh" | 30 +- .../cgroup-v2-hugetlb-rsvd-max-003.sh" | 29 +- .../cgroup-v2-hugetlb-rsvd-max-004.sh" | 29 +- .../testcase/cgroup-v2-io-max-001.sh" | 9 +- .../testcase/cgroup-v2-io-max-002.sh" | 9 +- .../testcase/cgroup-v2-io-max-003.sh" | 11 +- .../testcase/cgroup-v2-io-max-004.sh" | 11 +- .../testcase/cgroup-v2-io-pressure.sh" | 21 +- .../testcase/cgroup-v2-io-weight.sh" | 37 +- .../testcase/cgroup-v2-kill-001.sh" | 13 +- .../testcase/cgroup-v2-kill-002.sh" | 22 +- .../testcase/cgroup-v2-max-deep.sh" | 80 + .../testcase/cgroup-v2-max-descendants.sh" | 79 + .../testcase/cgroup-v2-memory-current.sh" | 18 +- .../testcase/cgroup-v2-memory-high-001.sh" | 22 +- .../testcase/cgroup-v2-memory-high-002.sh" | 20 +- .../testcase/cgroup-v2-memory-low-001.sh" | 164 ++ .../testcase/cgroup-v2-memory-low-002.sh" | 140 ++ .../testcase/cgroup-v2-memory-max.sh" | 41 +- .../testcase/cgroup-v2-memory-min-001.sh" | 169 ++ .../testcase/cgroup-v2-memory-min-002.sh" | 137 ++ .../testcase/cgroup-v2-memory-oom-events.sh" | 14 +- .../cgroup-v2-memory-oom-group-001.sh" | 24 +- .../cgroup-v2-memory-oom-group-002.sh" | 25 +- .../cgroup-v2-memory-oom-group-003.sh" | 22 +- .../testcase/cgroup-v2-memory-pressure.sh" | 40 +- .../testcase/cgroup-v2-memory-reclaim-001.sh" | 18 +- .../testcase/cgroup-v2-memory-reclaim-002.sh" | 19 +- .../testcase/cgroup-v2-memory-swap-high.sh" | 31 +- .../testcase/cgroup-v2-memory-swap-max.sh" | 36 +- .../testcase/cgroup-v2-memory-zswap.sh" | 21 +- .../testcase/cgroup-v2-pids-max-001.sh" | 27 +- .../testcase/cgroup-v2-pids-max-002.sh" | 15 +- .../testcase/cgroup-v2-pids-max-003.sh" | 18 +- .../testcase/cgroup-v2-populated.sh" | 19 +- .../cgroup-v2-subtree_control-001.sh" | 13 +- .../cgroup-v2-subtree_control-002.sh" | 5 +- .../cgroup-v2-subtree_control-003.sh" | 5 +- .../cgroup-v2-subtree_control-004.sh" | 13 +- .../testcase/cgroup-v2-type-002.sh" | 12 +- .../tst_lib/cgroup_util/alloc_anon.c" | 3 +- .../tst_lib/cgroup_util/alloc_anon_mlock.c" | 2 +- .../tst_lib/cgroup_util/alloc_pagecache.c" | 3 +- .../tst_lib/cgroup_util/bin/alloc_anon" | Bin 16312 -> 16312 bytes .../tst_lib/cgroup_util/bin/alloc_pagecache" | Bin 16552 -> 16552 bytes .../cgroup_util/bin/cgroup_event_listener" | Bin 16656 -> 16656 bytes .../cgroup_util/cgroup_event_listener.c" | 22 +- .../tst-cgroup/tst_lib/other_common.sh" | 90 +- .../tst-cgroup/tst_lib/ts_common.sh" | 21 +- ...77\347\224\250\346\226\207\346\241\243.md" | 208 +++ .../image-20240813154623977.png" | Bin 0 -> 15075 bytes .../image-20240813154831524.png" | Bin 0 -> 2448 bytes .../image-20240813154844123.png" | Bin 0 -> 2448 bytes .../image-20240813154921611.png" | Bin 0 -> 10360 bytes .../image-20240813155138963.png" | Bin 0 -> 21693 bytes .../image-20240813155220037.png" | Bin 0 -> 2155 bytes .../image-20240813155239339.png" | Bin 0 -> 2634 bytes .../image-20240813155303515.png" | Bin 0 -> 3289 bytes .../image-20240813161618198.png" | Bin 0 -> 20261 bytes .../image-20240813163729651.png" | Bin 0 -> 18417 bytes .../image-20240813164446290.png" | Bin 0 -> 2719 bytes .../image-20240813164459881.png" | Bin 0 -> 2136 bytes .../image-20240813164512233.png" | Bin 0 -> 2127 bytes .../image-20240813164526945.png" | Bin 0 -> 3178 bytes .../image-20240813175813489.png" | Bin 0 -> 2451 bytes .../image-20240813175842360.png" | Bin 0 -> 6329 bytes .../image-20240813175902750.png" | Bin 0 -> 42522 bytes .../image-20240813180012630.png" | Bin 0 -> 22187 bytes .../image-20240813180101765.png" | Bin 0 -> 25802 bytes .../image-20240813180113229.png" | Bin 0 -> 25802 bytes .../image-20240813192619397.png" | Bin 0 -> 5691 bytes .../image-20240813192641081.png" | Bin 0 -> 6029 bytes .../image-20240813193042254.png" | Bin 0 -> 6840 bytes .../image-20240813212218088.png" | Bin 0 -> 19318 bytes .../image-20240813213901996.png" | Bin 0 -> 50165 bytes .../image-20240813215939420.png" | Bin 0 -> 49471 bytes .../image-20240813220134010.png" | Bin 0 -> 13480 bytes .../image-20240813220144401.png" | Bin 0 -> 13480 bytes .../image-20240813222209839.png" | Bin 0 -> 7557 bytes .../image-20240813222236560.png" | Bin 0 -> 7100 bytes .../image-20240813222250409.png" | Bin 0 -> 7202 bytes .../image-20240813222437274.png" | Bin 0 -> 20989 bytes .../image-20240813233107878.png" | Bin 0 -> 39657 bytes .../image-20240813233120405.png" | Bin 0 -> 10924 bytes .../image-20240813233137341.png" | Bin 0 -> 5303 bytes .../image-20240813233208725.png" | Bin 0 -> 47702 bytes .../image-20240813233232772.png" | Bin 0 -> 48284 bytes .../image-20240814102516235.png" | Bin 0 -> 21153 bytes .../image-20240814102535908.png" | Bin 0 -> 2625 bytes .../image-20240814102549259.png" | Bin 0 -> 2828 bytes .../image-20240814102626444.png" | Bin 0 -> 21116 bytes .../image-20240814102723332.png" | Bin 0 -> 2807 bytes .../image-20240814102741707.png" | Bin 0 -> 2025 bytes .../image-20240814102757182.png" | Bin 0 -> 2135 bytes .../image-20240814103735716.png" | Bin 0 -> 16447 bytes .../image-20240814105728307.png" | Bin 0 -> 20401 bytes .../image-20240814111432108.png" | Bin 0 -> 5953 bytes .../image-20240814111439428.png" | Bin 0 -> 2609 bytes .../image-20240814111452398.png" | Bin 0 -> 3010 bytes .../image-20240814111510069.png" | Bin 0 -> 3831 bytes .../image-20240814121157863.png" | Bin 0 -> 20715 bytes .../image-20240814121312911.png" | Bin 0 -> 4693 bytes .../image-20240814121333373.png" | Bin 0 -> 3462 bytes .../image-20240814121353069.png" | Bin 0 -> 3834 bytes .../image-20240814121500396.png" | Bin 0 -> 5854 bytes .../image-20240814131958155.png" | Bin 0 -> 18078 bytes .../image-20240814132028781.png" | Bin 0 -> 4262 bytes .../image-20240814132039205.png" | Bin 0 -> 2419 bytes .../image-20240814132044757.png" | Bin 0 -> 2419 bytes .../image-20240814132114591.png" | Bin 0 -> 20618 bytes .../image-20240814132156950.png" | Bin 0 -> 23938 bytes .../image-20240814132225566.png" | Bin 0 -> 4477 bytes .../image-20240814132303942.png" | Bin 0 -> 4537 bytes .../image-20240814132330534.png" | Bin 0 -> 24259 bytes .../image-20240814132333013.png" | Bin 0 -> 24259 bytes .../image-20240814133111776.png" | Bin 0 -> 23410 bytes .../image-20240814133152422.png" | Bin 0 -> 4482 bytes .../image-20240814133153525.png" | Bin 0 -> 4482 bytes .../image-20240814133210805.png" | Bin 0 -> 2280 bytes .../image-20240814133229822.png" | Bin 0 -> 2196 bytes .../image-20240814133340510.png" | Bin 0 -> 3704 bytes .../image-20240814133341911.png" | Bin 0 -> 3704 bytes .../image-20240814134324218.png" | Bin 0 -> 6050 bytes .../image-20240814134339407.png" | Bin 0 -> 4222 bytes .../image-20240814134349799.png" | Bin 0 -> 4023 bytes .../image-20240814141530725.png" | Bin 0 -> 6149 bytes .../image-20240814141912888.png" | Bin 0 -> 18646 bytes .../image-20240814142044608.png" | Bin 0 -> 207974 bytes .../image-20240814142222974.png" | Bin 0 -> 4660 bytes .../image-20240814142241006.png" | Bin 0 -> 3541 bytes .../image-20240814142314782.png" | Bin 0 -> 4001 bytes .../image-20240814142348511.png" | Bin 0 -> 7695 bytes .../image-20240814143135644.png" | Bin 0 -> 14313 bytes .../image-20240814143203487.png" | Bin 0 -> 15011 bytes .../image-20240814143213079.png" | Bin 0 -> 12458 bytes .../image-20240814151255325.png" | Bin 0 -> 14929 bytes .../image-20240814151409352.png" | Bin 0 -> 2977 bytes .../image-20240814151416375.png" | Bin 0 -> 2278 bytes .../image-20240814151440881.png" | Bin 0 -> 10646 bytes .../image-20240814151456351.png" | Bin 0 -> 21475 bytes .../image-20240814151522526.png" | Bin 0 -> 2539 bytes .../image-20240814151819447.png" | Bin 0 -> 3008 bytes .../image-20240814151841682.png" | Bin 0 -> 20450 bytes .../image-20240814152225938.png" | Bin 0 -> 2825 bytes .../image-20240814152233304.png" | Bin 0 -> 2065 bytes .../image-20240814152237975.png" | Bin 0 -> 2065 bytes .../image-20240814152247856.png" | Bin 0 -> 2164 bytes .../image-20240814152259054.png" | Bin 0 -> 3330 bytes .../image-20240814153132555.png" | Bin 0 -> 9462 bytes .../image-20240814153748435.png" | Bin 0 -> 20453 bytes .../image-20240814154750773.png" | Bin 0 -> 5025 bytes .../image-20240814155032448.png" | Bin 0 -> 6187 bytes .../image-20240814155051387.png" | Bin 0 -> 5688 bytes .../image-20240814155628208.png" | Bin 0 -> 18799 bytes .../image-20240814155752495.png" | Bin 0 -> 5877 bytes .../image-20240814155915955.png" | Bin 0 -> 3744 bytes .../image-20240814155933002.png" | Bin 0 -> 5092 bytes .../image-20240814155949999.png" | Bin 0 -> 6885 bytes .../image-20240814160924162.png" | Bin 0 -> 18952 bytes .../image-20240814161512867.png" | Bin 0 -> 5645 bytes .../image-20240814162257363.png" | Bin 0 -> 14781 bytes .../image-20240814162307489.png" | Bin 0 -> 12251 bytes .../image-20240814162842038.png" | Bin 0 -> 18247 bytes .../image-20240814181022711.png" | Bin 0 -> 14583 bytes .../image-20240814181059810.png" | Bin 0 -> 2760 bytes .../image-20240814181112081.png" | Bin 0 -> 2397 bytes .../image-20240814181155186.png" | Bin 0 -> 10487 bytes .../image-20240814181927733.png" | Bin 0 -> 21473 bytes .../image-20240814182020730.png" | Bin 0 -> 2634 bytes .../image-20240814182034409.png" | Bin 0 -> 2842 bytes .../image-20240814182050676.png" | Bin 0 -> 20391 bytes .../image-20240814182512346.png" | Bin 0 -> 17745 bytes .../image-20240814182522372.png" | Bin 0 -> 17745 bytes .../image-20240814182535354.png" | Bin 0 -> 2859 bytes .../image-20240814182547603.png" | Bin 0 -> 2101 bytes .../image-20240814182606386.png" | Bin 0 -> 2557 bytes .../image-20240814182618283.png" | Bin 0 -> 3209 bytes .../image-20240814183418474.png" | Bin 0 -> 19872 bytes .../image-20240814184416348.png" | Bin 0 -> 16430 bytes .../image-20240814184809027.png" | Bin 0 -> 15157 bytes .../image-20240814184815898.png" | Bin 0 -> 12429 bytes .../image-20240814185220725.png" | Bin 0 -> 50570 bytes .../image-20240814185236668.png" | Bin 0 -> 11179 bytes .../image-20240814185415242.png" | Bin 0 -> 7431 bytes .../image-20240814185448434.png" | Bin 0 -> 7143 bytes .../image-20240814185502940.png" | Bin 0 -> 21389 bytes .../image-20240814185505769.png" | Bin 0 -> 21389 bytes .../image-20240814190419664.png" | Bin 0 -> 21472 bytes ...13\350\257\225\346\212\245\345\221\212.md" | 1549 +++++++++++++++++ 267 files changed, 6009 insertions(+), 1625 deletions(-) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/install_package.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-stat.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-deep.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-descendants.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-002.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-001.sh" create mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-002.sh" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154623977.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154831524.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154844123.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154921611.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813155138963.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813155220037.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813155239339.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813155303515.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813161618198.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813163729651.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164446290.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164459881.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164512233.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164526945.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813175813489.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813175842360.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813175902750.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813180012630.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813180101765.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813180113229.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813192619397.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813192641081.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813193042254.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813212218088.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813213901996.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813215939420.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813220134010.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813220144401.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813222209839.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813222236560.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813222250409.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813222437274.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233107878.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233120405.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233137341.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233208725.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233232772.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102516235.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102535908.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102549259.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102626444.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102723332.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102741707.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102757182.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814103735716.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814105728307.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111432108.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111439428.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111452398.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111510069.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121157863.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121312911.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121333373.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121353069.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121500396.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814131958155.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132028781.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132039205.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132044757.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132114591.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132156950.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132225566.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132303942.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132330534.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132333013.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133111776.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133152422.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133153525.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133210805.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133229822.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133340510.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133341911.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134324218.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134339407.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134349799.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814141530725.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814141912888.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142044608.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142222974.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142241006.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142314782.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142348511.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814143135644.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814143203487.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814143213079.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151255325.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151409352.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151416375.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151440881.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151456351.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151522526.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151819447.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151841682.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152225938.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152233304.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152237975.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152247856.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152259054.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814153132555.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814153748435.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814154750773.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155032448.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155051387.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155628208.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155752495.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155915955.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155933002.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155949999.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814160924162.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814161512867.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162257363.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162307489.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162842038.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181022711.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181059810.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181112081.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181155186.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181927733.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182020730.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182034409.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182050676.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182512346.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182522372.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182535354.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182547603.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182606386.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182618283.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814183418474.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184416348.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184809027.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184815898.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185220725.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185236668.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185415242.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185448434.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185502940.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185505769.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814190419664.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/install_package.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/install_package.sh" new file mode 100644 index 0000000..e1f7163 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/install_package.sh" @@ -0,0 +1,25 @@ +#!/bin/bash + +if ! command -v yum &> /dev/null; then + dnf install -y yum +fi +# 定义要安装的软件包及其安装命令 +packages=( + "git" + "numactl" + "iperf3" + "iproute-tc" + "perf" + "sysstat" + "make" + "gcc" + "bc" +) + +# 遍历软件包列表并安装 +for package in "${packages[@]}"; do + echo "Installing $package..." + yum install -y "$package" +done + +echo "All packages installed successfully!" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" index 78b4072..0c7ecce 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240721-163304-894253469 # @用例名称: cgroup-v1-blkio-bfq-weight -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 blkio bfq-weight -# @用例类型: 测试比例权重策略文件blkio.bfq.weight +# @用例类型: 测试接口文件blkio.bfq.weight ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,7 +20,12 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -TMP_FILE="$(mktemp)" +CGROUP="cgroup-v1-blkio-bfq-weight" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" +CHILD2="$CGROUP/child2" +TMP_FILE0="$(mktemp)" +TMP_FILE1="$(mktemp)" TMP_FILE2="$(mktemp)" tc_setup() { @@ -33,14 +38,17 @@ tc_setup() { if ! is_dd_installed; then skip_test "未安装dd命令" fi - # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 - if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then - skip_test "内核CONFIG_IOSCHED_BFQ配置未开启" + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_BLK_CGROUP配置未开启" fi # @预置条件: 创建两个cgroup组 - cgcreate -g blkio:cgroup-v1-blkio-bfq-weight - cgcreate -g blkio:cgroup-v1-blkio-bfq-weight2 + mkdir "$CGROUP_TOPDIR"/blkio/$CGROUP + mkdir "$CGROUP_TOPDIR"/blkio/$CHILD0 + mkdir "$CGROUP_TOPDIR"/blkio/$CHILD1 + mkdir "$CGROUP_TOPDIR"/blkio/$CHILD2 + return 0 } @@ -63,44 +71,59 @@ do_test() { echo bfq > /sys/block/$disk/queue/scheduler || return 1 - # @测试步骤:4: 设置blkio.bfq.weight - cgset -r blkio.bfq.weight=100 cgroup-v1-blkio-bfq-weight - cgset -r blkio.bfq.weight=500 cgroup-v1-blkio-bfq-weight2 - - # @测试步骤:5: 启动两个dd进程 - sync; echo 3 > /proc/sys/vm/drop_caches - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE" & - task_pid=$! - msg "task_pid: $task_pid" - echo $task_pid > "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight/tasks + # @测试步骤:4: 设置CHILD0\CHILD1\CHILD2的blkio.bfq.weight + echo 100 >"$CGROUP_TOPDIR"/blkio/$CHILD0/blkio.bfq.weight + echo 200 >"$CGROUP_TOPDIR"/blkio/$CHILD1/blkio.bfq.weight + echo 300 >"$CGROUP_TOPDIR"/blkio/$CHILD2/blkio.bfq.weight - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &> "$TMP_FILE2" & - task_pid2=$! - msg "task_pid2: $task_pid2" - echo $task_pid2 > "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight2/tasks + # @测试步骤:5: 启动dd进程 + sync + echo 3 >/proc/sys/vm/drop_caches + echo $$ > "$CGROUP_TOPDIR"/blkio/$CHILD0/cgroup.procs + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE0" & + task_pid0=$! + echo $$ > "$CGROUP_TOPDIR"/blkio/$CHILD1/cgroup.procs + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE1" & + echo $$ > "$CGROUP_TOPDIR"/blkio/$CHILD2/cgroup.procs + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE2" & + wait $task_pid0 - sleep 15 + msg "io serviced 0: $(cat "$CGROUP_TOPDIR"/blkio/$CHILD0/blkio.throttle.io_serviced)" + msg "io serviced 1: $(cat "$CGROUP_TOPDIR"/blkio/$CHILD1/blkio.throttle.io_serviced)" + msg "io serviced 2: $(cat "$CGROUP_TOPDIR"/blkio/$CHILD2/blkio.throttle.io_serviced)" # @测试步骤:5: 获取dd进程的读取速度 - read_bps1=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE"| awk '{print $1}') - msg "read_bps1: $read_bps1" - read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2"| awk '{print $1}') - msg "read_bps2: $read_bps2" + read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) + read_speed2=$(grep -oP '\d+.\d+' "$TMP_FILE1" | tail -n 1) + read_speed3=$(grep -oP '\d+.\d+' "$TMP_FILE2" | tail -n 1) + msg "read_speed1: $read_speed1" + msg "read_speed2: $read_speed2" + msg "read_speed3: $read_speed3" - # @预期结果:1: 500权重的cgroup2带宽要大于100权重的cgroup1 - assert_true [ "$read_bps1" -lt "$read_bps2" ] + # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 + if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] + else + assert_false [ true ] + fi return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ > "$CGROUP_TOPDIR"/blkio/cgroup.procs # @清理工作: 恢复调度器设置 echo "$original_scheduler" > /sys/block/"$disk"/queue/scheduler # @清理工作: 删除创建的cgroup组 - cgdelete -g blkio:cgroup-v1-blkio-bfq-weight - cgdelete -g blkio:cgroup-v1-blkio-bfq-weight2 - rm "$TMP_FILE" + rmdir "$CGROUP_TOPDIR"/blkio/$CHILD0 + rmdir "$CGROUP_TOPDIR"/blkio/$CHILD1 + rmdir "$CGROUP_TOPDIR"/blkio/$CHILD2 + rmdir "$CGROUP_TOPDIR"/blkio/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE0" + rm "$TMP_FILE1" rm "$TMP_FILE2" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index f97045b..e55ce7e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240721-163338-552003922 # @用例名称: cgroup-v1-blkio-bfq-weight_device -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 blkio bfq-weight_device -# @用例类型: 测试比例权重策略文件blkio.bfq.weight_device +# @用例类型: 测试接口文件blkio.bfq.weight_device ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,7 +20,12 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -TMP_FILE="$(mktemp)" +CGROUP="cgroup-v1-blkio-bfq-weight_device" +CHILD0="$CGROUP"/child0 +CHILD1="$CGROUP"/child1 +CHILD2="$CGROUP"/child2 +TMP_FILE0="$(mktemp)" +TMP_FILE1="$(mktemp)" TMP_FILE2="$(mktemp)" tc_setup() { @@ -33,13 +38,17 @@ tc_setup() { if ! is_dd_installed; then skip_test "未安装dd命令" fi - # @预置条件:检查是否开启了CONFIG_IOSCHED_BFQ配置 - # if ! grep -q CONFIG_IOSCHED_BFQ=y /boot/config-"$(uname -r)"; then - # skip_test "内核CONFIG_IOSCHED_BFQ配置未开启" - # fi + # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 + if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_BLK_CGROUP配置未开启" + fi # @预置条件: 创建cgroup组 - cgcreate -g blkio:cgroup-v1-blkio-bfq-weight_device + mkdir "$CGROUP_TOPDIR"/blkio/$CGROUP + mkdir "$CGROUP_TOPDIR"/blkio/$CHILD0 + mkdir "$CGROUP_TOPDIR"/blkio/$CHILD1 + mkdir "$CGROUP_TOPDIR"/blkio/$CHILD2 + return 0 } @@ -56,60 +65,62 @@ do_test() { disk_device="253:0" fi - # @测试步骤:2: 获取光驱设备 - if [[ -e /dev/sr0 ]]; then - cd_rom="sr0" - cd_rom_device="11:0" - else - skip_test "没有光驱设备CD-ROM" - fi - # @测试步骤:3: 保存当前调度器设置 - original_scheduler1=$(grep -oP '\[\K[^\]]+' /sys/block/$disk/queue/scheduler) - echo "原始调度器1: $original_scheduler1" - original_scheduler2=$(grep -oP '\[\K[^\]]+' /sys/block/"$cd_rom"/queue/scheduler) - echo "原始调度器2: $original_scheduler2" + original_scheduler=$(grep -oP '\[\K[^\]]+' /sys/block/$disk/queue/scheduler) + echo "原始调度器: $original_scheduler" # @测试步骤:4: 设置调度器为bfq - echo bfq >/sys/block/$disk/queue/scheduler || return 1 - echo bfq >/sys/block/"$cd_rom"/queue/scheduler || return 1 + echo bfq >/sys/block/$disk/queue/scheduler - # @测试步骤:5: 设置blkio.bfq.weight_device - echo "$disk_device 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device - echo "$cd_rom_device 500" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/blkio.bfq.weight_device + # @测试步骤:5: 设置CHILD0\CHILD1\CHILD2的blkio.bfq.weight_device + echo "$disk_device 100" >"$CGROUP_TOPDIR"/blkio/$CHILD0/blkio.bfq.weight_device + echo "$disk_device 200" >"$CGROUP_TOPDIR"/blkio/$CHILD1/blkio.bfq.weight_device + echo "$disk_device 300" >"$CGROUP_TOPDIR"/blkio/$CHILD2/blkio.bfq.weight_device - # @测试步骤:6: 启动两个dd进程 + # @测试步骤:6: 启动dd进程 sync echo 3 >/proc/sys/vm/drop_caches - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE" & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/tasks - - dd iflag=direct if=/dev/$cd_rom of=/dev/null bs=1M count=1024 &>"$TMP_FILE2" & - task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-bfq-weight_device/tasks - - sleep 15 + echo $$ >"$CGROUP_TOPDIR"/blkio/$CHILD0/cgroup.procs + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE0" & + task_pid0=$! + echo $$ >"$CGROUP_TOPDIR"/blkio/$CHILD1/cgroup.procs + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE1" & + echo $$ >"$CGROUP_TOPDIR"/blkio/$CHILD2/cgroup.procs + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=1024 &>"$TMP_FILE2" & + wait $task_pid0 # @测试步骤:7: 获取dd进程的读取速度 - read_bps1=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') - msg "read_bps1: $read_bps1" - read_bps2=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE2" | awk '{print $1}') - msg "read_bps2: $read_bps2" - - # @预期结果:3: 500权重的设备带宽要大于100权重的设备带宽 - assert_true [ "$read_bps1" -lt "$read_bps2" ] + read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) + read_speed2=$(grep -oP '\d+.\d+' "$TMP_FILE1" | tail -n 1) + read_speed3=$(grep -oP '\d+.\d+' "$TMP_FILE2" | tail -n 1) + msg "read_speed1: $read_speed1" + msg "read_speed2: $read_speed2" + msg "read_speed3: $read_speed3" + + # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 + if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] + else + assert_false [ true ] + fi return 0 } tc_teardown() { msg "this is tc_teardown" - # 恢复调度器设置 - echo "$original_scheduler1" >/sys/block/"$disk"/queue/scheduler - echo "$original_scheduler2" >/sys/block/"$cd_rom"/queue/scheduler - cgdelete -r blkio:cgroup-v1-blkio-bfq-weight_device - rm "$TMP_FILE" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup.procs + # @清理工作: 恢复调度器设置 + echo "$original_scheduler" >/sys/block/"$disk"/queue/scheduler + # @清理工作: 删除cgroup组 + rmdir "$CGROUP_TOPDIR"/blkio/$CHILD0 + rmdir "$CGROUP_TOPDIR"/blkio/$CHILD1 + rmdir "$CGROUP_TOPDIR"/blkio/$CHILD2 + rmdir "$CGROUP_TOPDIR"/blkio/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE0" + rm "$TMP_FILE1" rm "$TMP_FILE2" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" index 00acccf..35bfcd4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240721-144526-288264693 # @用例名称: cgroup-v1-blkio-throttle-read_bps_device -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 blkio throttle.read_bps_device -# @用例类型: 测试节流策略文件blkio.throttle.read_bps_device +# @用例类型: 测试接口文件blkio.throttle.read_bps_device ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-blkio-throttle-read_bps_device" TMP_FILE="$(mktemp)" tc_setup() { @@ -42,7 +43,7 @@ tc_setup() { fi # @预置条件:创建cgroup组 - cgcreate -g blkio:cgroup-v1-blkio-throttle-read_bps_device + mkdir "$CGROUP_TOPDIR"/blkio/$CGROUP return 0 } @@ -60,11 +61,11 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.read_bps_device,限制速度为1MB/s - echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_bps_device/blkio.throttle.read_bps_device + echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.read_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_bps_device/tasks - dd iflag=direct if=$disk of=/dev/null bs=1M count=5 2>&1 | tee "$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs + dd iflag=direct if=$disk of=/dev/null bs=1M count=3 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') @@ -84,7 +85,11 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g blkio:cgroup-v1-blkio-throttle-read_bps_device + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/blkio/$CGROUP + # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index fd0a766..8ec469f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240721-144536-700486958 # @用例名称: cgroup-v1-blkio-throttle-read_iops_device -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 blkio throttle.read_iops_device -# @用例类型: 测试节流策略文件blkio.throttle.read_iops_device +# @用例类型: 测试接口文件blkio.throttle.read_iops_device ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-blkio-throttle-read_iops_device" TMP_FILE="$(mktemp)" tc_setup() { @@ -42,7 +43,7 @@ tc_setup() { fi # @预置条件: 创建cgroup组 - cgcreate -g blkio:cgroup-v1-blkio-throttle-read_iops_device + mkdir "$CGROUP_TOPDIR"/blkio/$CGROUP return 0 } @@ -60,16 +61,16 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.read_iops_device,限制速度为100 IO/s - echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.read_iops_device + echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.read_iops_device # @测试步骤:3: 启动一个dd进程 - echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/tasks - dd iflag=direct if=$disk of=/dev/null bs=4k count=500 2>&1 | tee "$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs + dd iflag=direct if=$disk of=/dev/null bs=4k count=300 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" # @测试步骤:4: 获取读取速度 - read_iops=$(grep "$device_number Read" "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-read_iops_device/blkio.throttle.io_serviced | awk '{print $3}') + read_iops=$(grep "$device_number Read" "$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.io_serviced | awk '{print $3}') read_iops_per_second=$(echo "scale=2; $read_iops / $time" | bc) msg "read_iops: $read_iops_per_second" up_read_iops=110 @@ -87,7 +88,11 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g blkio:cgroup-v1-blkio-throttle-read_iops_device + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/blkio/$CGROUP + # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index faf78cf..6324ce3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240721-144529-920054873 # @用例名称: cgroup-v1-blkio-throttle-write_bps_device -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 blkio throttle.write_bps_device -# @用例类型: 测试节流策略文件blkio.throttle.write_bps_device +# @用例类型: 测试接口文件blkio.throttle.write_bps_device ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-blkio-throttle-write_bps_device" TMP_FILE="$(mktemp)" TMP_WIRTE_FILE="$(mktemp)" @@ -43,7 +44,7 @@ tc_setup() { fi # @预置条件: 创建cgroup组 - cgcreate -g blkio:cgroup-v1-blkio-throttle-write_bps_device + mkdir "$CGROUP_TOPDIR"/blkio/$CGROUP return 0 } @@ -61,11 +62,11 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.write_bps_device,限制速度为1MB/s - echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_bps_device/blkio.throttle.write_bps_device + echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.write_bps_device # @测试步骤:3: 启动一个dd进程 - echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_bps_device/tasks - dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=5 oflag=direct 2>&1 | tee "$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs + dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=3 oflag=direct 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') @@ -85,8 +86,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 删除后台进程 + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup.procs # @清理工作: 删除cgroup - cgdelete -g blkio:cgroup-v1-blkio-throttle-write_bps_device + rmdir "$CGROUP_TOPDIR"/blkio/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" "$TMP_WIRTE_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index 4797e2a..455df5f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240721-144539-871526222 # @用例名称: cgroup-v1-blkio-throttle-write_iops_device -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 blkio throttle.write_iops_device -# @用例类型: 测试节流策略文件blkio.throttle.write_iops_device +# @用例类型: 测试接口文件blkio.throttle.write_iops_device ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-blkio-throttle-write_iops_device" TMP_FILE="$(mktemp)" tc_setup() { @@ -42,7 +43,7 @@ tc_setup() { fi # @预置条件: 创建cgroup组 - cgcreate -g blkio:cgroup-v1-blkio-throttle-write_iops_device + mkdir "$CGROUP_TOPDIR"/blkio/$CGROUP return 0 } @@ -60,16 +61,16 @@ do_test() { fi # @测试步骤:2: 设置blkio.throttle.write_iops_device,限制速度为100 IO/s - echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.write_iops_device + echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.write_iops_device # @测试步骤:3: 启动一个dd进程 - echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/tasks + echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" # @测试步骤:4: 获取写入速度 - write_iops=$(grep "$device_number Write" "$CGROUP_TOPDIR"/blkio/cgroup-v1-blkio-throttle-write_iops_device/blkio.throttle.io_serviced | awk '{print $3}') + write_iops=$(grep "$device_number Write" "$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.io_serviced | awk '{print $3}') write_iops_per_second=$(echo "scale=2; $write_iops / $time" | bc) msg "write_iops_per_second: $write_iops_per_second" up_write_iops=110 @@ -87,7 +88,11 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g blkio:cgroup-v1-blkio-throttle-write_iops_device + # @清理工作: 删除后台进程 + echo $$ >"$CGROUP_TOPDIR"/blkio/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/blkio/$CGROUP + # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" new file mode 100755 index 0000000..45f82cc --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" @@ -0,0 +1,85 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240711-115955-308386734 +# @用例名称: cgroup-v1-cpu-cfs-001 +# @用例级别: 1 +# @用例标签: cgroup-v1 cpu cfs +# @用例类型: 测试cpu.cfs_period_us和cpu.cfs_quota_us接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_T + OPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v1-cpu-cfs-001" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + + # @预置条件: 创建一个新的cgroup + mkdir "$CGROUP_TOPDIR"/cpu/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us + echo 500000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_period_us + echo 400000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_quota_us + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/cpu/$CGROUP/cgroup.procs + + sleep 3 + + # @测试步骤:3: 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.stat) + nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') + nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') + throttled_time=$(echo "$cpu_stat" | grep throttled_time | awk '{print $2}') + msg "nr_periods: $nr_periods" + msg "nr_throttled: $nr_throttled" + msg "throttled_time: $throttled_time" + + # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_time均不为零 + if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then + assert_true [ "$throttled_time" -gt 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpu/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" new file mode 100755 index 0000000..ee7c542 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" @@ -0,0 +1,85 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240812-171005-611037314 +# @用例名称: cgroup-v1-cpu-cfs-002 +# @用例级别: 1 +# @用例标签: cgroup-v1 cpu cfs +# @用例类型: 测试cpu.cfs_period_us和cpu.cfs_quota_us接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR + +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v1-cpu-cfs-002" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + + # @预置条件: 创建一个新的cgroup + mkdir "$CGROUP_TOPDIR"/cpu/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us + echo 500000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_period_us + echo 1000000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_quota_us + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/cpu/$CGROUP/cgroup.procs + + sleep 3 + + # @测试步骤:3: 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.stat) + nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') + nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') + throttled_time=$(echo "$cpu_stat" | grep throttled_time | awk '{print $2}') + msg "nr_periods: $nr_periods" + msg "nr_throttled: $nr_throttled" + msg "throttled_time: $throttled_time" + + # @预期结果:1: cpu.stat文件中的nr_periods等于6s, nr_throttled和throttled_time等于0 + if [ "$nr_periods" -eq 6 ] && [ "$nr_throttled" -eq 0 ]; then + assert_true [ "$throttled_time" -eq 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpu/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" index 6a79633..1826e21 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-shares.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240711-102849-220066922 # @用例名称: cgroup-v1-cpu-shares -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 cpu shares -# @用例类型: 测试cpu.shares是否能完成按权重设定CPU分配 +# @用例类型: 测试cpu.shares接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,9 +20,9 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -PARENT_CGROUP="cgroup-v1-cpu-shares" -SUB_CGROUP1="cgroup-v1-cpu-shares/sub_cgroup01" -SUB_CGROUP2="cgroup-v1-cpu-shares/sub_cgroup02" +CGROUP="cgroup-v1-cpu-shares" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" tc_setup() { msg "this is tc_setup" @@ -30,48 +30,93 @@ tc_setup() { if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件:检查numactl命令是否存在 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + skip_test "系统不支持NUMA架构" + fi + # @预置条件:创建cgroup - cgcreate -g cpu:$PARENT_CGROUP - cgcreate -g cpu:$SUB_CGROUP1 - cgcreate -g cpu:$SUB_CGROUP2 + mkdir "$CGROUP_TOPDIR"/cpu/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpu/$CHILD0 + mkdir "$CGROUP_TOPDIR"/cpuset/$CHILD0 + mkdir "$CGROUP_TOPDIR"/cpu/$CHILD1 + mkdir "$CGROUP_TOPDIR"/cpuset/$CHILD1 + # @预置条件: 设置cpuset.mems文件 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.mems + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.mems + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" - # 测试步骤:1: 对不同的cgroup设置不同的cpu.shares值 - echo 2048 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP1"/cpu.shares - echo 512 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP2"/cpu.shares + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" - # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 - taskset 0x1 sh -c 'while true; do :; done' & - task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP1"/tasks + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.cpus + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.cpus + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive - taskset 0x1 sh -c 'while true; do :; done' & - task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP2"/tasks + # 测试步骤:4: 对不同的cgroup设置不同的cpu.shares值 + echo 2048 >"$CGROUP_TOPDIR"/cpu/"$CHILD0"/cpu.shares + echo 512 >"$CGROUP_TOPDIR"/cpu/"$CHILD1"/cpu.shares + # @测试步骤:5: 启动两个占用CPU的进程,并将其放入不同的cgroup + { + while true; do :; done + } & + task_pid0=$! + echo $task_pid0 >"$CGROUP_TOPDIR"/cpu/"$CHILD0"/cgroup.procs + echo $task_pid0 >"$CGROUP_TOPDIR"/cpuset/"$CHILD0"/cgroup.procs + { + while true; do :; done + } & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/cpu/"$CHILD1"/cgroup.procs + echo $task_pid1 >"$CGROUP_TOPDIR"/cpuset/"$CHILD1"/cgroup.procs sleep 3 - # @测试步骤:3: 获取两个cgroup的CPU使用时间 - usage1=$(cat "$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP1"/cpuacct.usage) - usage2=$(cat "$CGROUP_TOPDIR"/cpu/"$SUB_CGROUP2"/cpuacct.usage) + # @测试步骤:6: 获取两个cgroup的CPU使用时间 + usage1=$(cat "$CGROUP_TOPDIR"/cpu/"$CHILD0"/cpuacct.usage) + usage2=$(cat "$CGROUP_TOPDIR"/cpu/"$CHILD1"/cpuacct.usage) msg "usage1: $usage1" msg "usage2: $usage2" - # @预期结果:4: 验证CPU使用时间比例是否符合预期,4:1 - usage_ratio=$(echo "scale=2; $usage1 / $usage2 + 0.5" | bc) + # @预期结果:1: 验证CPU使用时间比例是否符合预期,4:1 + usage_ratio=$(echo "scale=2; $usage1 / $usage2" | bc) usage_ratio=$(printf "%.0f" "$usage_ratio") - msg "usage_ratio: $usage_ratio" - - expected_ratio=$(echo "2048 / 512" | bc) - msg "expected_ratio: $expected_ratio" - - kill -9 $task_pid1 $task_pid2 - + expected_ratio=4 assert_true [ "$(echo "$usage_ratio >= $expected_ratio" | bc)" -eq 1 ] return 0 @@ -79,10 +124,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid0" "$task_pid1" # @清理工作: 删除cgroup - cgdelete -g cpu:/"$SUB_CGROUP1" || return 1 - cgdelete -g cpu:/"$SUB_CGROUP2" || return 1 - cgdelete -g cpu:/"$PARENT_CGROUP" || return 1 + rmdir "$CGROUP_TOPDIR"/cpu/$CHILD0 + rmdir "$CGROUP_TOPDIR"/cpu/$CHILD1 + rmdir "$CGROUP_TOPDIR"/cpu/$CGROUP + rmdir "$CGROUP_TOPDIR"/cpuset/$CHILD0 + rmdir "$CGROUP_TOPDIR"/cpuset/$CHILD1 + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" index 3c6ce61..6b33f06 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240709-001807-562305058 # @用例名称: cgroup-v1-cpuacct-stat -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 cpuacct stat -# @用例类型: 测试cpuacct.stat统计数据 +# @用例类型: 测试cpuacct.stat接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,7 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-stat" tc_setup() { msg "this is tc_setup" @@ -28,42 +28,42 @@ tc_setup() { if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 记录运行任务前stat值,单位为USER_HZ - stat_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) + stat_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.stat) msg "stat_before: $stat_before" - # @测试步骤:2: 启动一个用户态和内核态混合任务并将其加入cgroup + # @测试步骤:2: 启动一个任务并将其加入cgroup { for _ in {1..100}; do - dd if=/dev/zero of=/dev/null bs=1M count=1 - echo -e "line1\nline2\nline3" | awk 'END {print NR}' + echo -e "line1\nline2\nline3" | awk 'END {print NR}' &> /dev/null done } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的stat值 - stat_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.stat) + stat_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.stat) msg "stat_after: $stat_after" - - # @预期结果:1: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 user_before=$(echo "$stat_before" | grep user | awk '{print $2}') sys_before=$(echo "$stat_before" | grep system | awk '{print $2}') user_after=$(echo "$stat_after" | grep user | awk '{print $2}') sys_after=$(echo "$stat_after" | grep system | awk '{print $2}') - # 如果用户态和内核态CPU使用情况都有增加,则认为测试通过 + # @预期结果:1:如果用户态和内核态CPU使用情况都有增加,则认为测试通过 if [ "$user_after" -gt "$user_before" ] && [ "$sys_after" -gt "$sys_before" ]; then assert_true [ true ] return 0 @@ -74,9 +74,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" index 7ae9f39..b4cf26e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240707-111241-514473309 # @用例名称: cgroup-v1-cpuacct-usage -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 cpuacct usage -# @用例类型: 测试cpuacct.usage统计数据 +# @用例类型: 测试cpuacct.usage接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,18 +20,22 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -# 创建一个临时目录 -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件:创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 } @@ -39,20 +43,20 @@ do_test() { msg "Running test" # @测试步骤:1: 将脚本自身进程放入cgroup - echo $$ >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $$ >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs # @测试步骤:2: 运行一个CPU密集型任务 for i in {1..10000}; do echo "$i" >/dev/null; done # @测试步骤:3: 获取cpuacct.usage统计数据 - usage_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) + usage_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage) msg "usage_before: $usage_before ns" # @测试步骤:4: 再运行一个CPU密集型任务 for i in {1..10000}; do echo "$i" >/dev/null; done # @测试步骤:5: 获取cpuacct.usage统计数据 - usage_after=$(sudo cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage) + usage_after=$(sudo cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage) msg "usage_after: $usage_after ns" # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况,即CPU使用时间增加 @@ -66,10 +70,8 @@ do_test() { tc_teardown() { msg "Cleaning up test environment" - # 删除cgroup - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" index 36d1516..84a4785 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_all.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### -# @用例ID: 20240708-230226-588399104 +# @用例ID: 20240812-185112-361462878 # @用例名称: cgroup-v1-cpuacct-usage_all -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 cpuacct usage_all -# @用例类型: 测试cpuacct.usage_all统计数据 +# @用例类型: 测试cpuacct.usage_all接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,81 +20,97 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage_all" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 设置cpuset.mems文件 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + # @获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi - # @测试步骤:1: 记录运行任务前的usage_all值 - usage_all_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) - msg "usage_all_before: " - msg "$usage_all_before" + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive - # @测试步骤:2: 启动一个用户态和内核态混合任务并将其放入cgroup + # @测试步骤:4: 记录运行任务前的usage_all值 + usage_all_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_all) + uasge_user_before=$(echo "$usage_all_before" | awk -v row="$((first_online_cpu + 2))" 'NR==row {print $2}') + msg "uasge_user_before: $uasge_user_before" + uasge_sys_before=$(echo "$usage_all_before" | awk -v row="$((first_online_cpu + 2))" 'NR==row {print $3}') + msg "uasge_sys_before: $uasge_sys_before" + + + # @测试步骤:2: 启动一个任务并将其放入cgroup { for _ in {1..100}; do - dd if=/dev/zero of=/dev/null bs=1M count=1 - echo -e "line1\nline2\nline3" | awk 'END {print NR}' + echo -e "line1\nline2\nline3" | awk 'END {print NR}' &> /dev/null done } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的usage_all值 - usage_all_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_all) - msg "usage_all_after: " - msg "$usage_all_after" + usage_all_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_all) + usage_user_after=$(echo "$usage_all_after" | awk -v row="$((first_online_cpu + 2))" 'NR==row {print $2}') + msg "usage_user_after: $usage_user_after" + usage_sys_after=$(echo "$usage_all_after" | awk -v row="$((first_online_cpu + 2))" 'NR==row {print $3}') + msg "usage_sys_after: $usage_sys_after" # @预期结果:1: 验证统计数据是否正确反映了用户态和内核态CPU使用情况 - # 从usage_all文件中提取用户态和内核态CPU使用时间 - IFS=$'\n' read -r -d '' -a usage_all_before_array <<<"$usage_all_before" - IFS=$'\n' read -r -d '' -a usage_all_after_array <<<"$usage_all_after" - - for i in "${!usage_all_before_array[@]}"; do - # shellcheck disable=SC2206 - before_line=(${usage_all_before_array[$i]}) - # shellcheck disable=SC2206 - after_line=(${usage_all_after_array[$i]}) - if [ "${#before_line[@]}" -ne 3 ] || [ "${#after_line[@]}" -ne 3 ]; then - msg "Invalid line format in usage_all_before or usage_all_after at line $i" - return 1 - fi - - user_before=${before_line[1]} - sys_before=${before_line[2]} - user_after=${after_line[1]} - sys_after=${after_line[2]} + assert_true [ "$usage_user_after" -gt "$uasge_user_before" ] + assert_true [ "$usage_sys_after" -gt "$uasge_sys_before" ] - # 是否存在一个CPU的用户态和内核态CPU使用时间都增加了,如果存在则认为测试通过 - if [ "$user_after" \> "$user_before" ] && [ "$sys_after" \> "$sys_before" ]; then - assert_true [ true ] - return 0 - fi - done - - msg "CPU usage did not increase as expected for CPU" - return 1 + return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除创建的cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" index b67d73d..f92799c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240708-202749-391700569 # @用例名称: cgroup-v1-cpuacct-usage_percpu -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 cpuacct usage_percpu -# @用例类型: 测试cpuacct.usage_percpu统计数据 +# @用例类型: 测试cpuacct.usage_percpu接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,7 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage_percpu" tc_setup() { msg "this is tc_setup" @@ -28,42 +28,82 @@ tc_setup() { if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 设置cpuset.mems文件 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + # @获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi - # @测试步骤:1: 记录运行任务前的每个CPU使用时间 - usage_percpu_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 记录运行任务前的每个CPU使用时间 + usage_percpu_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_percpu) + usage_percpu_before=$(echo "$usage_percpu_before" | awk -v col="$((first_online_cpu + 1))" '{print $col}') msg "usage_percpu_before: $usage_percpu_before" - usage_percpu_before_first=$(echo "$usage_percpu_before" | awk '{print $1}') - # @测试步骤:2: 启动一个CPU密集型任务并将其放入cgroup + + # @测试步骤:5: 启动一个CPU密集型任务并将其放入cgroup { - for i in {1..10000}; do echo "$i" >/dev/null; done + while true; do :; done } & task_pid=$! - taskset -cp 0 $task_pid - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks - wait $task_pid + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + sleep 3 - # @测试步骤:3: 记录运行任务后的每CPU使用时间 - usage_percpu_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + # @测试步骤:6: 记录运行任务后的每CPU使用时间 + usage_percpu_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_percpu) + usage_percpu_after=$(echo "$usage_percpu_after" | awk -v col="$((first_online_cpu + 1))" '{print $col}') msg "usage_percpu_after: $usage_percpu_after" - usage_percpu_after_first=$(echo "$usage_percpu_after" | awk '{print $1}') + # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况 - assert_true [ "$usage_percpu_after_first" -gt "$usage_percpu_before_first" ] - return + assert_true [ "$usage_percpu_after" -gt "$usage_percpu_before" ] + + return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" index ffcde1a..cde60ca 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_sys.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### -# @用例ID: 20240708-225719-108134845 +# @用例ID: 20240812-183828-115078858 # @用例名称: cgroup-v1-cpuacct-usage_percpu_sys -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 cpuacct usage_percpu_sys -# @用例类型: 测试cpuacct.usage_percpu_sys统计数据 +# @用例类型: 测试cpuacct.usage_percpu_sys接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,61 +20,91 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage_percpu_sys" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 设置cpuset.mems文件 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + # @获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi - # @测试步骤:1: 记录运行任务前的所有任务在每个CPU上使用内核态CPU的时间 - usage_percpu_sys_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 记录运行任务前的所有任务在每个CPU上使用内核态CPU的时间 + usage_percpu_sys_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_percpu_sys) + usage_percpu_sys_before=$(echo "$usage_percpu_sys_before" | awk -v col="$((first_online_cpu + 1))" '{print $col}') msg "usege_percpu_sys_before: $usage_percpu_sys_before" - # @测试步骤:2: 启动一个内核态CPU密集型任务并将其放入cgroup + # @测试步骤:5: 启动一个任务并将其放入cgroup { for _ in {1..100}; do - # 执行一些内核态操作 - dd if=/dev/zero of=/dev/null bs=1M count=1 + dd if=/dev/zero of=/dev/null bs=1M count=1 &> /dev/null done } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs wait $task_pid - # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用内核态CPU的时间 - usage_percpu_sys_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu_sys) + # @测试步骤:6: 记录运行任务后的所有任务在每个CPU上使用内核态CPU的时间 + usage_percpu_sys_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_percpu_sys) + usage_percpu_sys_after=$(echo "$usage_percpu_sys_after" | awk -v col="$((first_online_cpu + 1))" '{print $col}') msg "usage_percpu_sys_after: $usage_percpu_sys_after" - # @预期结果:1: - for ((i = 0; i < ${#usage_percpu_sys_before[@]}; i++)); do - # 是否存在某个CPU的内核态CPU使用时间增加,如果有则说明统计数据正确 - if [ "${usage_percpu_sys_after[$i]}" \> "${usage_percpu_sys_before[$i]}" ]; then - assert_true [ true ] - return 0 - fi - done + # @预期结果:1: 验证统计数据是否正确反映了内核态CPU使用情况,即内核态CPU使用时间增加 + assert_true [ "$usage_percpu_sys_after" -gt "$usage_percpu_sys_before" ] - msg "per cpu usage did not increase as expected" - return 1 + return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" index b1f5049..f3820a6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_percpu_user.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### -# @用例ID: 20240708-220905-322684320 +# @用例ID: 20240812-183608-543735442 # @用例名称: cgroup-v1-cpuacct-usage_percpu_user -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 cpuacct usage_percpu_user -# @用例类型: 测试cpuacct.usage_percpu_user统计数据 +# @用例类型: 测试cpuacct.usage_percpu_user接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,61 +20,92 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage_percpu_user" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 设置cpuset.mems文件 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + # @获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi - # @测试步骤:1: 记录运行任务前的所有任务在每个CPU上使用用户态CPU的时间 - usage_percpu_user_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 记录运行任务前的所有任务在每个CPU上使用用户态CPU的时间 + usage_percpu_user_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_percpu_user) + usage_percpu_user_before=$(echo "$usage_percpu_user_before" | awk -v col="$((first_online_cpu + 1))" '{print $col}') msg "usege_percpu_user_before: $usage_percpu_user_before" - # @测试步骤:2: 启动一个用户态CPU密集型任务并将其放入cgroup + # @测试步骤:5: 启动一个任务并将其放入cgroup { for _ in {1..100}; do - # 执行一些用户态操作 - echo -e "line1\nline2\nline3" | awk 'END {print NR}' + echo -e "line1\nline2\nline3" | awk 'END {print NR}' &>/dev/null done } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks - wait $task_pid # 等待任务结束 + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + wait $task_pid - # @测试步骤:3: 记录运行任务后的所有任务在每个CPU上使用用户态CPU的时间 - usage_percpu_user_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_percpu) + # @测试步骤:6: 记录运行任务后的所有任务在每个CPU上使用用户态CPU的时间 + usage_percpu_user_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_percpu_user) + usage_percpu_user_after=$(echo "$usage_percpu_user_after" | awk -v col="$((first_online_cpu + 1))" '{print $col}') msg "usage_percpu_user_after: $usage_percpu_user_after" - # @预期结果:1: - for ((i = 0; i < ${#usage_percpu_user_before[@]}; i++)); do - # 是否存在某个CPU的用户态CPU使用时间增加,如果有则说明统计数据正确 - if [ "${usage_percpu_user_after[$i]}" \> "${usage_percpu_user_before[$i]}" ]; then - assert_true [ true ] - return 0 - fi - done + # @预期结果:1: 验证统计数据是否正确反映了用户态CPU使用情况,即用户态CPU使用时间增加 + assert_true [ "$usage_percpu_user_before" -eq 0 ] + assert_true [ "$usage_percpu_user_after" -gt "$usage_percpu_user_before" ] - msg "per cpu usage did not increase as expected" - return 1 + return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" index 370504e..980aee5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_sys.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240708-210528-911301197 # @用例名称: cgroup-v1-cpuacct-usage_sys -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgourp-v1 cpuacct usage_sys -# @用例类型: 测试cpuacct.usage_sys统计数据 +# @用例类型: 测试cpuacct.usage_sys接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,17 +20,23 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage_sys" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + return 0 } @@ -38,39 +44,33 @@ do_test() { msg "this is do_test" # @测试步骤:1: 记录运行任务前的内核态CPU使用时间 - usage_sys_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) + usage_sys_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_sys) msg "usege_sys_before: $usage_sys_before ns" - # @测试步骤:2: 启动一个内核态CPU密集型任务并将其放入cgroup + # @测试步骤:2: 启动一个任务并将其放入cgroup { for _ in {1..100}; do - # 执行一些内核态操作 - dd if=/dev/zero of=/dev/null bs=1M count=1 + dd if=/dev/zero of=/dev/null bs=1M count=1 &>/dev/null done } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的内核态CPU使用时间 - usage_sys_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_sys) + usage_sys_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_sys) msg "usage_sys_after: $usage_sys_after ns" # @预期结果:1: 验证统计数据是否正确反映了内核态CPU使用情况,即内核态CPU使用时间增加 - assert_true [ "$usage_sys_after" -gt "$usage_sys_before" ] || { - msg "Kernel CPU usage did not increase as expected: before=$usage_sys_before, after=$usage_sys_after" - return 1 - } + assert_true [ "$usage_sys_after" -gt "$usage_sys_before" ] return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" index 096d109..3a7cd1e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage_user.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240708-214708-138227018 # @用例名称: cgroup-v1-cpuacct-usage_user -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 cpuacct usage_user -# @用例类型: 测试cpuacct.usage_user统计数据 +# @用例类型: 测试cpuacct.usage_user接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,57 +20,56 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -g_tmpdir="$(mktemp -d)" +CGROUP="cgroup-v1-cpuacct-usage_user" tc_setup() { msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否开启了CONFIG_CGROUP_CPUACCT配置 + if ! grep -q CONFIG_CGROUP_CPUACCT=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_CPUACCT配置未开启" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 + mkdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 记录运行任务前的用户态CPU使用时间 - usage_user_before=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) + usage_user_before=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_user) msg "usage_user_before: $usage_user_before ns" - # @测试步骤:2: 启用一个用户态CPU密集型任务并将其放入cgroup + # @测试步骤:2: 启用一个任务并将其放入cgroup { for _ in {1..100}; do - # 执行一些用户态操作 - echo -e "line1\nline2\nline3" | awk 'END {print NR}' + echo -e "line1\nline2\nline3" | awk 'END {print NR}' &> /dev/null done } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuacct/$CGROUP/cgroup.procs wait $task_pid # @测试步骤:3: 记录运行任务后的用户态CPU使用时间 - usage_user_after=$(cat "$CGROUP_TOPDIR"/cpuacct/"${g_tmpdir}"/test_cgroup/cpuacct.usage_user) + usage_user_after=$(cat "$CGROUP_TOPDIR"/cpuacct/$CGROUP/cpuacct.usage_user) msg "usage_user_after: $usage_user_after ns" # @预期结果:1: 验证统计数据是否正确反映了用户态CPU使用情况,即用户态CPU使用时间增加 - assert_true [ "$usage_user_after" -gt "$usage_user_before" ] || { - msg "usage_user_after: $usage_user_after <= usage_user_before: $usage_user_before" - return 1 - } + assert_true [ "$usage_user_after" -gt "$usage_user_before" ] return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuacct:/"${g_tmpdir}"/test_cgroup || return 1 - cgdelete -g cpuacct:/"${g_tmpdir}" || return 1 - rm -rfv "$g_tmpdir" || return 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" index 62511d5..66a18b2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpu_exclusive.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-cpuset-cpu_exclusive # @用例级别: 3 # @用例标签: cgroup-v1 cpuset cpu_exclusive -# @用例类型: 测试cpu_exclusive控制文件 +# @用例类型: 测试cpu_exclusive接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,68 +20,91 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-cpuset-cpu_exclusive" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - - # @预置条件: 创建两个新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-cpu_exclusive_1 - cgcreate -g cpuset:cgroup-v1-cpuset-cpu_exclusive_2 + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CHILD0 + mkdir "$CGROUP_TOPDIR"/cpuset/$CHILD1 # @预置条件: 设置cpuset.mems文件 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-cpu_exclusive_1 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-cpu_exclusive_2 - # @预置条件: 设置cpuset.cpus文件 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-cpu_exclusive_1 - cgset -r cpuset.cpus=1 cgroup-v1-cpuset-cpu_exclusive_2 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.mems + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.mems + # @获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.cpu_exclusive文件 - cgset -r cpuset.cpu_exclusive=1 cgroup-v1-cpuset-cpu_exclusive_1 || return 1 + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" - # @测试步骤:2: 尝试在另一个cgroup中设置包含已独占的CPU - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-cpu_exclusive_2 || msg "设置cpuset.cpus=0失败. 不能绑定已独占的CPU" + # @测试步骤:2: 获取没被独占的两个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + second_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 2))" '{print $col}') + msg "second_online_cpu: $second_online_cpu" + if [ -z "$first_online_cpu" ] || [ -z "$second_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi - # @预期结果:1: 验证设置cpuset.cpus失败 - tmp=$(cgget -r cpuset.cpus cgroup-v1-cpuset-cpu_exclusive_2 | awk '{print $2}') - assert_true [ "$tmp" != "0" ] - - # @测试步骤:3: 验证进程在独占的CPU上运行 - { - while true; do - : - done - } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-cpu_exclusive_1/tasks - sleep 3 - - # @测试步骤:4: 检查进程绑定的CPU - cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') - - kill -9 $task_pid - - # @预期结果:2: 验证进程是否只在指定的CPU上运行 - if [ "$cpus_allowed" = "0" ]; then - msg "cgroup1进程绑定到CPU0核心" - assert_true [ true ] - else - msg "cgroup1进程未绑定到CPU0核心" - return 1 # 测试失败 + echo "$first_online_cpu-$second_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" fi + # @测试步骤:3: 设置root cgroup和CGROUP的cpuset.cpu_exclusive为1 + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 设置CHILD0独占first_online_cpu + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.cpus + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.cpu_exclusive + + # @测试步骤:5: 尝试在CHILD1中设置包含被CHILD0独占的first_online_cpu + ret=-1 + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.cpus || ret=0 + + # @预期结果:1: 验证设置cpuset.cpus失败 + assert_true [ $ret -eq 0 ] + + # @测试步骤:6: 设置CHILD1独占second_online_cpu + echo "$second_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.cpus + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.cpu_exclusive + + # @测试步骤:7: 尝试在CHILD0中设置包含被CHILD1独占的second_online_cpu + ret=-1 + echo "$second_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.cpus || ret=0 + + # @预期结果:2: 验证设置cpuset.cpus失败 + assert_true [ $ret -eq 0 ] + return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-cpu_exclusive_1 - cgdelete -g cpuset:cgroup-v1-cpuset-cpu_exclusive_2 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CHILD0 + rmdir "$CGROUP_TOPDIR"/cpuset/$CHILD1 + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" index c4a0c0d..e2753c6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-cpus.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240714-134537-428824230 # @用例名称: cgroup-v1-cpuset-cpus -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 cpuset cpus -# @用例类型: 测试cpuset.cpus控制文件 +# @用例类型: 测试cpuset.cpus接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,49 +20,89 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-cpuset-cpus" +TMP_FILE="$(mktemp)" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi - + # @预置条件: 检查是否安装了mpstat命令 + if ! is_sysstat_installed; then + skip_test "没有安装mpstat命令" + fi + # @预置条件: 创建一个新的cgroup - cgcreate -g cpuset:"cgroup-v1-cpuset-cpus" + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP # @预置条件: 设置cpuset.mems文件 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-cpus + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.cpus文件,限制进程只能运行在CPU1上 - cgset -r cpuset.cpus=1 cgroup-v1-cpuset-cpus + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive - # @测试步骤:2: 启动一个进程并将其放入cgroup + # @测试步骤:4: 启动一个进程并将其放入cgroup { - while true; do - : - done + while true; do :; done } & task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-cpus/tasks - sleep 1 + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + sleep 3 - # @测试步骤:3: 检查进程绑定的CPU - cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') + # @测试步骤:5: 通过mpstat获取first_online_cpu的使用情况(3s) + cpu0_user_time=$(mpstat -P "$first_online_cpu" 1 3 | grep Average | awk 'NR==2 {print $3}') + msg "cpu0_user_time: $cpu0_user_time" - kill -9 $task_pid + # @预期结果:1: 验证CPU的使用率大于50% + assert_true [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] + + # @测试步骤:6: 检查进程绑定的CPU + cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') - # @预期结果:1: 验证进程是否只在指定的CPU上运行 - assert_true [ "$cpus_allowed" = "1" ] + # @预期结果:2: 验证进程是否只在指定的CPU上运行 + assert_true [ "$cpus_allowed" = "$first_online_cpu" ] return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-cpus + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" index 9aeffe1..ddaf3c1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_exclusive.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240716-153117-722732954 # @用例名称: cgroup-v1-cpuset-mem_exclusive -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v cpuset mem_exclusive -# @用例类型: 测试cpuset.mem_exclusive控制文件 +# @用例类型: 测试cpuset.mem_exclusive接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,10 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-cpuset-mem_exclusive" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -41,60 +45,93 @@ tc_setup() { fi # @预置条件: 创建两个新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-mem_exclusive_1 - cgcreate -g cpuset:cgroup-v1-cpuset-mem_exclusive_2 - # @预置条件: 设置cpuset.cpus文件 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mem_exclusive_1 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mem_exclusive_2 - # @预置条件: 设置cpuset.mems文件 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-mem_exclusive_1 - cgset -r cpuset.mems=1 cgroup-v1-cpuset-mem_exclusive_2 + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + mkdir "$CGROUP_TOPDIR"/cpuset/$CHILD0 + mkdir "$CGROUP_TOPDIR"/cpuset/$CHILD1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.mem_exclusive文件 - cgset -r cpuset.mem_exclusive=1 cgroup-v1-cpuset-mem_exclusive_1 || return 1 + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" - # @测试步骤:2: 尝试在另一个cgroup设置包含已独占的numa节点 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-mem_exclusive_2 || msg "设置cpuset.mems=0失败. 不能绑定已独占的numa节点" + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi - # @预期结果:1: 验证设置cpuset.mems失败 - tmp=$(cgget -r cpuset.mems cgroup-v1-cpuset-mem_exclusive_2 | awk '{print $2}') - assert_true [ "$tmp" != "0" ] - - # @测试步骤:3: 验证进程在独占的numa节点上运行 - { - while true; do - : - done - } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mem_exclusive_1/tasks - sleep 3 - - # @测试步骤:4: 检查进程绑定的NUMA节点 - mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') - - kill -9 $task_pid - - # @预期结果:3: 验证进程是否只在指定的内存节点上运行 - if [ "$mems_allowed" = "0" ]; then - msg "cgroup1进程绑定到NUMA节点0" - assert_true [ true ] - else - msg "cgroup1进程未绑定到NUMA节点0" - return 1 # 测试失败 + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" fi + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.cpus + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.cpus + + # @测试步骤:3: 设置root cgroup和CGROUP的cpuset.cpu_exclusive为1 + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 获取mem online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_mems + mem_online_list=$(get_online_mem_list "$file_path") + msg "mem_online_list: $mem_online_list" + + # @测试步骤:5: 获取两个在线mem + first_online_mem=$(echo "$mem_online_list" | awk '{print $1}') + msg "first_online_mem: $first_online_mem" + second_online_mem=$(echo "$mem_online_list" | awk '{print $2}') + msg "second_online_mem: $second_online_mem" + + # @测试步骤:6: 设置CGROUP的cpuset.mems + echo "$first_online_mem-$second_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + + # @测试步骤:7: 设置CGROUp的cpuset.mem_exclusive文件 + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.mem_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mem_exclusive + + # @测试步骤:8: 设置CHILD0独占first_online_mem + echo "$first_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.mems + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.mem_exclusive + + # @测试步骤:9: 尝试在CHILD1中设置包含被CHILD0独占的first_online_mem + ret=-1 + echo "$first_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.mems || ret=0 + + # @预期结果:1: 验证设置cpuset.mems失败 + assert_true [ $ret -eq 0 ] + + # @测试步骤:10: 设置CHILD1独占second_online_mem + echo "$second_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.mems + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CHILD1/cpuset.mem_exclusive + + # @测试步骤:11: 尝试在CHILD0中设置包含被CHILD1独占的second_online_mem + ret=-1 + echo "$second_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CHILD0/cpuset.mems || ret=0 + + # @预期结果:2: 验证设置cpuset.mems失败 + assert_true [ $ret -eq 0 ] return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-mem_exclusive_1 - cgdelete -g cpuset:cgroup-v1-cpuset-mem_exclusive_2 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CHILD0 + rmdir "$CGROUP_TOPDIR"/cpuset/$CHILD1 + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" new file mode 100755 index 0000000..bca78c8 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" @@ -0,0 +1,131 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240716-170043-088308720 +# @用例名称: cgroup-v1-cpuset-memory_migrate-001 +# @用例级别: 2 +# @用例标签: cgroup-v cpuset memory_migrate +# @用例类型: 测试memory_migrate接口文件, 测试启用内存迁移 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v1-cpuset-memory_migrate-001" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件:检查numactl命令是否存在 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + skip_test "系统不支持NUMA架构" + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + skip_test "系统NUMA节点数量小于2" + fi + + # @预置条件: 创建一个新的cgroup + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 获取mem online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_mems + mem_online_list=$(get_online_mem_list "$file_path") + msg "mem_online_list: $mem_online_list" + + # @测试步骤:5: 获取两个在线mem + first_online_mem=$(echo "$mem_online_list" | awk '{print $1}') + msg "first_online_mem: $first_online_mem" + second_online_mem=$(echo "$mem_online_list" | awk '{print $2}') + msg "second_online_mem: $second_online_mem" + echo "$first_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + + # @测试步骤:6: 启用memory_migrate控制文件 + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.memory_migrate + + # @测试步骤:7: 启动一个进程并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + + # @测试步骤:8: 修改cpuset.mems + echo "$second_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + sleep 3 + + # @测试步骤:9: 检查内存页是否迁移,使用numastat命令 + memory_usage_in_numa0=$(numastat -p $task_pid | awk 'END{print $2}') + memory_usage_in_numa1=$(numastat -p $task_pid | awk 'END{print $3}') + + # @预期结果:1:进程在numa node1上有内存使用,在numa node0没有内存使用 + assert_true [ "$memory_usage_in_numa0" == "0.00" ] && [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] + + # @于其结果:2: 002: 进程在numa_node2上有内存使用,在numa_node3也有内存使用 + # assert_true [ "$(echo "$memory_usage_in_numa2 > 0" | bc)" -eq 1 ] && [ "$(echo "$memory_usage_in_numa3 > 0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" new file mode 100755 index 0000000..60b9288 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" @@ -0,0 +1,126 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240811-222550-389275834 +# @用例名称: cgroup-v1-cpuset-memory_migrate-002 +# @用例级别: 2 +# @用例标签: cgroup-v cpuset memory_migrate +# @用例类型: 测试memory_migrate接口文件, 测试不启用内存迁移 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v1-cpuset-memory_migrate-002" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件:检查numactl命令是否存在 + if ! is_numactl_installed; then + skip_test "numactl 未安装, 请先安装numactl" + fi + # @预置条件:检查是否支持NUMA + numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) + if [ "$numa_nodes" = "0" ]; then + skip_test "系统不支持NUMA架构" + fi + # @预置条件:检查NUMA节点数量是否大于1 + if [ "$numa_nodes" -lt 2 ]; then + skip_test "系统NUMA节点数量小于2" + fi + + # @预置条件: 创建一个新的cgroup + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 获取mem online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_mems + mem_online_list=$(get_online_mem_list "$file_path") + msg "mem_online_list: $mem_online_list" + + # @测试步骤:5: 获取两个在线mem + first_online_mem=$(echo "$mem_online_list" | awk '{print $1}') + msg "first_online_mem: $first_online_mem" + second_online_mem=$(echo "$mem_online_list" | awk '{print $2}') + msg "second_online_mem: $second_online_mem" + echo "$first_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + + # @测试步骤:6: 启动一个进程并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + + # @测试步骤:7: 修改cpuset.mems + echo "$second_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + sleep 3 + + # @测试步骤:8: 检查内存页是否迁移,使用numastat命令 + memory_usage_in_numa0=$(numastat -p $task_pid | awk 'END{print $2}') + memory_usage_in_numa1=$(numastat -p $task_pid | awk 'END{print $3}') + + # @预期结果:1: 进程在numa_node0上有内存使用,在numa_node1也有内存使用 + assert_true [ "$(echo "$memory_usage_in_numa0 > 0" | bc)" -eq 1 ] && [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index 4daa0b5..60aec46 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### # @用例ID: 20240719-105612-324932394 -# @用例名称: cgroup-v1-cpuset-memory_spread_page -# @用例级别: 3 +# @用例名称: cgroup-v1-cpuset-memory_spread_page-001 +# @用例级别: 2 # @用例标签: cgroup-v1 cpuset memory_spread_page -# @用例类型: 测试不启用cpuset.memory_spread_page +# @用例类型: 测试cpuset.memory_spread_page接口文件,测试不将page cache平均分布道各个节点中 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-cpuset-memory_spread_page-001" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -41,66 +43,99 @@ tc_setup() { fi # @预置条件: 创建新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-memory_spread_page-001 - # @预置条件:设置cpuset.mems和cpuset.cpus - cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_spread_page-001 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-001 + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 获取numa node0的空闲内存 - num0_free_size=$(free -h | grep "Mem" | awk '{gsub(/i/, ""); print $4}') - msg "num0_free_size: $num0_free_size" - vm_bytes="${num0_free_size}" - - # @测试步骤:2: 获取numa node0和numa node1的FilePages - node0_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') - node1_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') - msg "node0_file_pages: $node0_file_pages" - msg "node1_file_pages: $node1_file_pages" - - # @测试步骤:3: 运行一个需要申请page cache的程序 - { - stress-ng --hdd 1 --hdd-bytes "$vm_bytes" --timeout 10s - } & - task_pid=$! - msg "task_pid: $task_pid" - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_spread_page-001/tasks - - # @测试步骤:4: 不断检查numa节点的FilePages大小 - num0_max_file_pages=$node0_file_pages - num1_max_file_pages=$node1_file_pages - while kill -0 $task_pid 2>/dev/null; do - num0_current_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') - num1_current_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') - - # 更新最大值 - if [ "$(echo "$num0_current_file_pages > $num0_max_file_pages" | bc)" -eq 1 ]; then - num0_max_file_pages=$num0_current_file_pages - fi - if [ "$(echo "$num1_current_file_pages > $num1_max_file_pages" | bc)" -eq 1 ]; then - num1_max_file_pages=$num1_current_file_pages + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 获取mem online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_mems + mem_online_list=$(get_online_mem_list "$file_path") + msg "mem_online_list: $mem_online_list" + + # @测试步骤:5: 获取两个在线mem + first_online_mem=$(echo "$mem_online_list" | awk '{print $1}') + msg "first_online_mem: $first_online_mem" + second_online_cpu=$(echo "$mem_online_list" | awk '{print $2}') + msg "second_online_cpu: $second_online_cpu" + echo "$first_online_mem-$second_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + + # @测试步骤:6: 获取numa node0和numa node1的FilePages + node0_pagecache=$(numastat -m | grep FilePages | awk '{print $2}') + node1_pagecache=$(numastat -m | grep FilePages | awk '{print $3}') + msg "node0_pagecache: $node0_pagecache" + msg "node1_pagecache: $node1_pagecache" + + # @测试步骤:7: 运行一个需要申请page cache的程序 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 100M & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + sleep 2 + + # @测试步骤:8: 不断检查numa节点的FilePages大小 + total_node0_pagecache=0 + total_node1_pagecache=0 + for _ in $(seq 1 8); do + node0_current_pagecache=$(numastat -m | grep FilePages | awk '{print $2}') + node1_current_pagecache=$(numastat -m | grep FilePages | awk '{print $3}') + total_node0_pagecache=$(echo "$node0_current_pagecache + $total_node0_pagecache" | bc) + total_node1_pagecache=$(echo "$node1_current_pagecache + $total_node1_pagecache" | bc) sleep 1 done - msg "num0_max_file_pages: $num0_max_file_pages" - msg "num1_max_file_pages: $num1_max_file_pages" + aver_node0_pagecache=$(echo "scale=2; $total_node0_pagecache / 8" | bc) + aver_node1_pagecache=$(echo "scale=2; $total_node1_pagecache / 8" | bc) + msg "aver_node0_pagecache: $aver_node0_pagecache" + msg "aver_node1_pagecache: $aver_node1_pagecache" - # @预期结果:1: numa node0要跟原来的FilePages有一定相差,numa node1的跟原来相差不大 - num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) - abs_num0_diff=${num0_diff//-/} - num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) - abs_num1_diff=${num1_diff//-/} - assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff <= 50" | bc)" -eq 1 ] + # @预期结果:1: 在误差允许的范围内,node0_diff = 100, node1_diff < 3 + node0_diff=$(echo "scale=2; $aver_node0_pagecache - $node0_pagecache" | bc) + abs_node0_diff=${node0_diff//-/} + node1_diff=$(echo "scale=2; $aver_node1_pagecache - $node1_pagecache" | bc) + abs_node1_diff=${node1_diff//-/} + if [ "$(echo "$abs_node0_diff >= 98" | bc)" -eq 1 ] && [ "$(echo "$abs_node1_diff <= 102" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$abs_node1_diff < 3" | bc)" -eq 1 ] + else + assert_false [ true ] + fi return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-memory_spread_page-001 + sleep 1 + # @清理动作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index 0b084c2..af39db3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240719-150059-269990543 # @用例名称: cgroup-v1-cpuset-memory_spread_page-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 cpuset memory_spread_page -# @用例类型: 测试启用cpuset.memory_spread_page +# @用例类型: 测试cpuset.memory_spread_page接口文件,测试将page cache平均分布道各个节点中 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-cpuset-memory_spread_page-002" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -41,69 +43,109 @@ tc_setup() { fi # @预置条件: 创建新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-memory_spread_page-002 - # @预置条件:设置cpuset.mems和cpuset.cpus - cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_spread_page-002 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_spread_page-002 + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 启用cpuset.memory_spread_page - cgset -r cpuset.memory_spread_page=1 cgroup-v1-cpuset-memory_spread_page-002 + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive - # @测试步骤:2: 获取numa node0的空闲内存 - num0_free_size=$(free -h | grep "Mem" | awk '{gsub(/i/, ""); print $4}') - msg "num0_free_size: $num0_free_size" - vm_bytes="${num0_free_size}" + # @测试步骤:4: 获取mem online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_mems + mem_online_list=$(get_online_mem_list "$file_path") + msg "mem_online_list: $mem_online_list" - # @测试步骤:3: 获取numa node0和numa node1的FilePages + # @测试步骤:5: 获取两个在线mem + first_online_mem=$(echo "$mem_online_list" | awk '{print $1}') + msg "first_online_mem: $first_online_mem" + second_online_cpu=$(echo "$mem_online_list" | awk '{print $2}') + msg "second_online_cpu: $second_online_cpu" + echo "$first_online_mem-$second_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + + # @测试步骤:6: 启用cpuset.memory_spread_page + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.memory_spread_page + + # @测试步骤:7: 获取numa node0和numa node1的FilePages node0_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') node1_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') msg "node0_file_pages: $node0_file_pages" msg "node1_file_pages: $node1_file_pages" - # @测试步骤:4: 运行一个需要申请page cache的程序 - { - stress-ng --hdd 1 --hdd-bytes "$vm_bytes" --timeout 10s - } & + # @测试步骤:8: 运行一个需要申请page cache的程序 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 100M & task_pid=$! msg "task_pid: $task_pid" - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_spread_page-002/tasks - - # @测试步骤:5: 不断检查numa节点的FilePages大小 - num0_max_file_pages=$node0_file_pages - num1_max_file_pages=$node1_file_pages - while kill -0 $task_pid 2>/dev/null; do - num0_current_file_pages=$(numastat -m | grep FilePages | awk '{print $2}') - num1_current_file_pages=$(numastat -m | grep FilePages | awk '{print $3}') - - # 更新最大值 - if [ "$(echo "$num0_current_file_pages > $num0_max_file_pages" | bc)" -eq 1 ]; then - num0_max_file_pages=$num0_current_file_pages - fi - if [ "$(echo "$num1_current_file_pages > $num1_max_file_pages" | bc)" -eq 1 ]; then - num1_max_file_pages=$num1_current_file_pages - fi + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + sleep 2 + + # @测试步骤:9: 不断检查numa节点的FilePages大小 + total_node0_pagecache=0 + total_node1_pagecache=0 + for _ in $(seq 1 8); do + node0_current_pagecache=$(numastat -m | grep FilePages | awk '{print $2}') + node1_current_pagecache=$(numastat -m | grep FilePages | awk '{print $3}') + msg "node0_current_pagecache: $node0_current_pagecache" + msg "node1_current_pagecache: $node1_current_pagecache" + total_node0_pagecache=$(echo "$node0_current_pagecache + $total_node0_pagecache" | bc) + total_node1_pagecache=$(echo "$node1_current_pagecache + $total_node1_pagecache" | bc) sleep 1 done - msg "num0_max_file_pages: $num0_max_file_pages" - msg "num1_max_file_pages: $num1_max_file_pages" + aver_node0_pagecache=$(echo "scale=2; $total_node0_pagecache / 8" | bc) + aver_node1_pagecache=$(echo "scale=2; $total_node1_pagecache / 8" | bc) + msg "aver_node0_pagecache: $aver_node0_pagecache" + msg "aver_node1_pagecache: $aver_node1_pagecache" - # @预期结果:1: numa node0和numa node1的FilePages大小跟原来都相差较大 - num0_diff=$(echo "scale=2; $num0_max_file_pages - $node0_file_pages" | bc) + # @预期结果:1: 在误差允许范围内,node0_diff = 50, node1_diff = 50 + num0_diff=$(echo "scale=2; $aver_node0_pagecache - $node0_file_pages" | bc) abs_num0_diff=${num0_diff//-/} - num1_diff=$(echo "scale=2; $num1_max_file_pages - $node1_file_pages" | bc) + num1_diff=$(echo "scale=2; $aver_node1_pagecache - $node1_file_pages" | bc) abs_num1_diff=${num1_diff//-/} - assert_true [ "$(echo "$abs_num0_diff > 50" | bc)" -eq 1 ] && [ "$(echo "$abs_num1_diff > 50" | bc)" -eq 1 ] + if [ "$(echo "$abs_num0_diff > 48 " | bc)" ] && [ "$(echo "$abs_num0_diff < 52" | bc)" ]; then + assert_true [ true ] + else + assert_true [ false ] + fi + if [ "$(echo "$abs_num1_diff > 48" | bc)" ] && [ "$(echo "$abs_num1_diff < 52" | bc)" ]; then + assert_true [ true ] + else + assert_true [ false ] + fi return 0 } tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-memory_spread_page-002 + # @清理动作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" index 34cac7b..1358913 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240714-191803-023497569 # @用例名称: cgroup-v1-cpuset-mems -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 cpuset mems -# @用例类型: 测试cpuset.mems控制文件 +# @用例类型: 测试cpuset.mems接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-cpuset-mems" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -41,34 +43,72 @@ tc_setup() { fi # @预置条件: 创建一个新的cgroup - cgcreate -g cpuset:"cgroup-v1-cpuset-mems" - # @预置条件: 设置cpuset.cpus文件 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mems + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.mems文件 - cgset -r cpuset.mems=1 cgroup-v1-cpuset-mems + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 设置root cgroup和CGROUP的cpuset.cpu_exclusive为1 + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive - # @测试步骤:2: 启动一个进程并将其放入cgroup + # @测试步骤:4: 获取mem online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_mems + mem_online_list=$(get_online_mem_list "$file_path") + msg "mem_online_list: $mem_online_list" + + # @测试步骤:5: 获取两个在线mem + first_online_mem=$(echo "$mem_online_list" | awk '{print $1}') + msg "first_online_mem: $first_online_mem" + + # @测试步骤:6: 设置CGROUP的cpuset.mems + echo "$first_online_mem" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + + # @测试步骤:7: 启动一个进程并将其放入cgroup { - while true; do - : - done + while true; do :; done } & task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mems/tasks + echo $task_pid >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs sleep 1 + # @测试步骤:8: 获取进程绑定的NUMA节点的内存使用量 + memory_usage=$(numastat -p $task_pid | awk -v col="$((first_online_mem + 2))" 'END{print $col}') + + # @预期结果:1: memory_usage大于0 + assert_true [ "$(echo "$memory_usage > 0" | bc)" -eq 1 ] + # @测试步骤:3: 检查进程绑定的NUMA节点 mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') - kill -9 $task_pid - - # @预测结果:1: 验证进程是否只在指定的内存节点上运行 - if [ "$mems_allowed" = "1" ]; then + # @预测结果:2: 验证进程是否只在指定的内存节点上运行 + if [ "$mems_allowed" = "$first_online_mem" ]; then msg "进程绑定到NUMA节点1" assert_true [ true ] else @@ -81,7 +121,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-mems + # @清理工作: 清空后台进程 + kill -9 "$task_pid" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" new file mode 100755 index 0000000..9b35c6b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" @@ -0,0 +1,143 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240719-213044-128698057 +# @用例名称: cgroup-v1-cpuset-sched_load_balance +# @用例级别: 1 +# @用例标签: cgroup-v1 cpuset sched_load_balance +# @用例类型: 测试cpuset.sched_load_balance接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v1-cpuset-sched_load_balance" +TMP_FILE="$(mktemp)" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v1 + if ! check_cgroup_version_is_v1; then + skip_test "cgroup版本不是v1" + fi + # @预置条件: 检查是否安装了mpstat命令 + if ! is_sysstat_installed; then + skip_test "没有安装mpstat命令" + fi + + # @预置条件: 创建一个新的cgroup + mkdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @预置条件: 设置cpuset.mems文件 + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.mems + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/cpuset/cpuset.effective_cpus + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的两个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + second_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 2))" '{print $col}') + msg "second_online_cpu: $second_online_cpu" + if [ -z "$first_online_cpu" ] || [ -z "$second_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu-$second_online_cpu" >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.cpu_exclusive + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.cpu_exclusive + + # @测试步骤:4: 禁用负载平衡 + echo 0 >"$CGROUP_TOPDIR"/cpuset/cpuset.sched_load_balance + echo 0 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.sched_load_balance + + # @测试步骤:5: 将当前shell放入CGROUP并启动两个CPU压力进程 + echo $$ >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cgroup.procs + { + while true; do :; done + } & + task_pid0=$! + { + while true; do :; done + } & + task_pid1=$! + + # @测试步骤:6: 通过mpstat获取first_online_cpu和second_online_cpu的使用情况(3s) + cpu0_user_time=$(mpstat -P "$first_online_cpu" 1 3 | grep Average | awk 'NR==2 {print $3}') + msg "cpu0_user_time: $cpu0_user_time" + cpu1_user_time=$(mpstat -P "$second_online_cpu" 1 3 | grep Average | awk 'NR==2 {print $3}') + msg "cpu1_user_time: $cpu1_user_time" + + # @预期结果:1: first_online_cpu或者second_online_cpu其中有一个利用率为0 + echo $$ >"$CGROUP_TOPDIR"/cpuset/cgroup.procs + if [ "$(echo "$cpu0_user_time > 70.0" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$cpu1_user_time < 3" | bc)" -eq 1 ] + elif [ "$(echo "$cpu0_user_time < 3" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$cpu1_user_time > 70.0" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + # @测试步骤:7: 启用负载平衡 + echo 1 >"$CGROUP_TOPDIR"/cpuset/cpuset.sched_load_balance + echo 1 >"$CGROUP_TOPDIR"/cpuset/$CGROUP/cpuset.sched_load_balance + sleep 1 + + # @测试步骤:8: 通过mpstat获取first_online_cpu和second_online_cpu的使用情况(3s) + cpu0_user_time=$(mpstat -P "$first_online_cpu" 1 3 | grep Average | awk 'NR==2 {print $3}') + msg "cpu0_user_time: $cpu0_user_time" + cpu1_user_time=$(mpstat -P "$second_online_cpu" 1 3 | grep Average | awk 'NR==2 {print $3}') + msg "cpu1_user_time: $cpu1_user_time" + + # @预期结果:2: first_online_cpu和second_online_cpu利用率都不为0 + echo $$ >"$CGROUP_TOPDIR"/cpuset/cgroup.procs + if [ "$(echo "$cpu0_user_time > 70.0" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$cpu1_user_time > 70.0" | bc)" -eq 1 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: kill后台进程 + kill -9 "$task_pid0" "$task_pid1" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/cpuset/$CGROUP + # @清理工作: 删除临时文件 + rm "$TMP_FILE" + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" index 23c8b99..b9680f7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240724-140024-496158227 # @用例名称: cgroup-v1-devices-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 devices -# @用例类型: 测试允许特定设备访问 +# @用例类型: 测试devices.allow接口文件和devices.deny接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,15 +20,21 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-devices-001" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_DEVICE配置 + if ! grep -q CONFIG_CGROUP_DEVICE=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_DEVICE配置未开启" + fi # @预置条件: 创建一个cgroup - cgcreate -g devices:cgroup-v1-devices-001 + mkdir "$CGROUP_TOPDIR"/devices/$CGROUP return 0 } @@ -48,46 +54,59 @@ do_test() { # @测试步骤:2: 获取光驱设备 if [[ -e /dev/sr0 ]]; then msg "disk is /dev/sda" - disk="sr0" + cdrom="sr0" else msg "错误信息: 没有光驱设备CD-ROM" exit 1 fi - # @测试步骤:3: 限制所有设备访问 - echo "a *:* rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.deny + # @测试步骤:3: 查看允许访问设备的白名单 + whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CGROUP/devices.list) - # @测试步骤:4: 查看允许访问设备的白名单 - whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.list) - msg "whitelist: $whitelist" + # @预期结果:1: 允许访问设备的白名单为a *:* rwm + assert_true [ "$whitelist" = "a *:* rwm" ] - # @测试步骤:5: 允许访问设备 - echo "b $device_number rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.allow + # @测试步骤:4: 限制所有设备访问 + echo "a *:* rwm" >"$CGROUP_TOPDIR"/devices/$CGROUP/devices.deny - # @测试步骤:6: 查看允许访问设备的白名单 - whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-001/devices.list) - msg "whitelist: $whitelist" + # @测试步骤:5: 查看允许访问设备的白名单 + whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CGROUP/devices.list) - # @预期结果:1: 允许访问设备的白名单包含设备号 - if [ "$(echo "$whitelist" | grep -c "$device_number")" -eq 1 ]; then + # @预期结果:2: 允许访问设备的白名单为空 + if [ -z "$whitelist" ]; then assert_true [ true ] else assert_false [ true ] fi - # @预期结果:2: 验证设备访问限制 - # 访问被允许的设备 - if cat /dev/"$disk" &>/dev/null; then + # @测试步骤:6: 允许访问设备 + echo "b $device_number rwm" >"$CGROUP_TOPDIR"/devices/$CGROUP/devices.allow + + # @测试步骤:7: 查看允许访问设备的白名单 + whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CGROUP/devices.list) + + # @预期结果:3: 允许访问设备的白名单包含设备号 + if [ "$(echo "$whitelist" | grep -c "$device_number")" -eq 1 ]; then assert_true [ true ] else assert_false [ true ] fi + + # @测试步骤:8: 将当前shell进程加入cgroup + + # @预期结果:4: 验证设备访问限制 + # 访问被允许的设备 + echo $$ >"$CGROUP_TOPDIR"/devices/$CGROUP/cgroup.procs + ret=-1 + test -r /dev/"$disk" && ret=0 + echo $$ >"$CGROUP_TOPDIR"/devices/cgroup.procs + assert_true [ "$ret" -eq 0 ] # 访问不被允许的设备 - if ! cat /dev/"$disk" &>/dev/null; then - assert_false [ true ] - else - assert_true [ true ] - fi + echo $$ >"$CGROUP_TOPDIR"/devices/$CGROUP/cgroup.procs + ret=-1 + test -r /dev/"$cdrom" && ret=0 + echo $$ >"$CGROUP_TOPDIR"/devices/cgroup.procs + assert_false [ "$ret" -eq 0 ] return 0 } @@ -95,7 +114,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g devices:cgroup-v1-devices-001 + rmdir "$CGROUP_TOPDIR"/devices/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" index 5d0c057..c85b191 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" @@ -20,16 +20,23 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-devices-001" +CHILD0="$CGROUP/child0" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_DEVICE配置 + if ! grep -q CONFIG_CGROUP_DEVICE=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_DEVICE配置未开启" + fi # @预置条件: 创建两个cgroup - cgcreate -g devices:cgroup-v1-devices-002 - cgcreate -g devices:cgroup-v1-devices-002/subcgroup + mkdir "$CGROUP_TOPDIR"/devices/$CGROUP + mkdir "$CGROUP_TOPDIR"/devices/$CHILD0 return 0 } @@ -46,17 +53,16 @@ do_test() { device_number_minor="0" fi - # @测试步骤:2: 限制subcgroup的所有设备访问 - echo "a *:* rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.deny + # @测试步骤:2: 限制CHILD0的所有设备访问 + echo "a *:* rwm" >"$CGROUP_TOPDIR"/devices/$CHILD0/devices.deny - # @测试步骤:3: 允许subcgroup的硬盘设备访问 - echo "b $device_number_major:$device_number_minor rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.allow + # @测试步骤:3: 允许CHILD0的硬盘设备访问 + echo "b $device_number_major:$device_number_minor rwm" >"$CGROUP_TOPDIR"/devices/$CHILD0/devices.allow - # @测试步骤:4: 查看subcgroup的允许访问设备的白名单 - whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.list) - msg "whitelist_before: $whitelist" + # @测试步骤:4: 查看CHILD0的允许访问设备的白名单 + whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CHILD0/devices.list) - # @预期结果:1: subcgroup白名单中包硬盘设备 + # @预期结果:1: CHILD0白名单中包硬盘设备 if [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 1 ]; then assert_true [ true ] else @@ -64,13 +70,12 @@ do_test() { fi # @测试步骤:5: 在父cgroup中禁用块设备访问(包含了硬盘设备) - echo "b *:* rwm" >"$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/devices.deny + echo "b *:* rwm" >"$CGROUP_TOPDIR"/devices/$CGROUP/devices.deny - # @测试步骤:6: 查看subcgroup的允许访问设备的白名单 - whitelist=$(cat "$CGROUP_TOPDIR"/devices/cgroup-v1-devices-002/subcgroup/devices.list) - msg "whitelist_after: $whitelist" + # @测试步骤:6: 查看CHILD0的允许访问设备的白名单 + whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CHILD0/devices.list) - # @预期结果:6: 此时subcgroup白名单将不再包含硬盘设备 + # @预期结果:2: 此时CHILD0白名单将不再包含硬盘设备 if [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 0 ]; then assert_true [ true ] else @@ -82,8 +87,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g devices:cgroup-v1-devices-002/subcgroup - cgdelete -g devices:cgroup-v1-devices-002 + rmdir "$CGROUP_TOPDIR"/devices/$CHILD0 + rmdir "$CGROUP_TOPDIR"/devices/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" index 53a9a0f..654a006 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" @@ -2,15 +2,15 @@ ############################################################################### # @用例ID: 20240724-155849-953242621 # @用例名称: cgroup-v1-freezer-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 freezer -# @用例类型: 测试freezxr的正常使用 +# @用例类型: 测试freezer的正常使用 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" export TST_TS_TOPDIR } -[ -z "$CGROUP_TOPDIR" ] && { +[ -z "$CGROUP_TOPDIR" ] && { CGROUP_TOPDIR="/sys/fs/cgroup" export CGROUP_TOPDIR } @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-freezer-001" TMP_FILE="$(mktemp)" tc_setup() { @@ -28,16 +29,20 @@ tc_setup() { if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_FREEZER配置 + if ! grep -q CONFIG_CGROUP_FREEZER=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_FREEZER配置未开启" + fi # @预置条件: 创建一个cgroup - cgcreate -g freezer:cgroup-v1-freezer-001 + mkdir "$CGROUP_TOPDIR"/freezer/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 查看当前的freezer状态 - freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/freezer.state) + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state) # @预期结果:1: 当前cgroup状态为THAWED if [ "$freezer_state" == "THAWED" ]; then @@ -55,11 +60,11 @@ do_test() { done } & task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/tasks + echo $task_pid >"$CGROUP_TOPDIR"/freezer/$CGROUP/cgroup.procs sleep 5 # @测试步骤:3: 将cgroup状态设置为FROZEN - echo "FROZEN" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/freezer.state + echo "FROZEN" >"$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state # @测试步骤:4: 进程再睡眠5秒 sleep 5 @@ -81,7 +86,7 @@ do_test() { fi # @测试步骤:6: 将cgroup状态设置为THAWED - echo "THAWED" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-001/freezer.state + echo "THAWED" >"$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state sleep 1 # @测试步骤:7: 获取文件最后更新 @@ -105,8 +110,11 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 # @清理工作: 删除cgroup - cgdelete -g freezer:cgroup-v1-freezer-001 + rmdir "$CGROUP_TOPDIR"/freezer/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" index 4fd618c..262843f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-002.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240724-155852-472494491 # @用例名称: cgroup-v1-freezer-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 freezer # @用例类型: 测试freezer的层次结构 ############################################################################### @@ -20,61 +20,66 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-freezer-002" +CHILD0="$CGROUP/child0" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_FREEZER配置 + if ! grep -q CONFIG_CGROUP_FREEZER=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_FREEZER配置未开启" + fi # @预置条件: 创建两个cgroup - cgcreate -g freezer:cgroup-v1-freezer-002 - cgcreate -g freezer:cgroup-v1-freezer-002/subcgroup + mkdir "$CGROUP_TOPDIR"/freezer/$CGROUP + mkdir "$CGROUP_TOPDIR"/freezer/$CHILD0 return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 查看父cgroup和subcgroup的状态 - freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/freezer.state) - sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) - - # @预期结果:1: 父cgroup状态和subcgroup状态为THAWED - if [ "$freezer_state" == "THAWED" ] && [ "$sub_freezer_state" == "THAWED" ]; then - assert_true [ true ] - else - msg "测试失败: cgroup状态为$freezer_state, subcgroup状态为$sub_freezer_state, 而不是THAWED" - assert_false [ true ] - fi + # @测试步骤:1: 查看CGROUP和CHILD0的状态 + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state) + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CHILD0/freezer.state) - # @测试步骤:2: 冻结父cgroup - echo "FROZEN" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/freezer.state + # @预期结果:1: CGROUP状态和CHILD0状态为THAWED + assert_true [ "$freezer_state" = "THAWED" ] + assert_true [ "$sub_freezer_state" = "THAWED" ] - # @测试步骤:3: 查看父cgroup和subcgroup的状态 - freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/freezer.state) - sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + # @测试步骤:2: 冻结CGROUP + echo "FROZEN" >"$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state - # @预期结果:2: 父cgroup状态和subcgroup状态都为FROZEN - if [ "$freezer_state" == "FROZEN" ] && [ "$sub_freezer_state" == "FROZEN" ]; then - assert_true [ true ] - else - msg "测试失败: cgroup状态为$freezer_state, subcgroup状态为$sub_freezer_state, 而不是FROZEN" - assert_false [ true ] - fi + # @测试步骤:3: 查看CGROUP和CHILD0的状态 + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state) + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CHILD0/freezer.state) - # @测试步骤:4: 解冻subcgroup - echo "THAWED" >"$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state + # @预期结果:2: CGROUP状态和CHILD0状态都为FROZEN + assert_true [ "$freezer_state" = "FROZEN" ] + assert_true [ "$sub_freezer_state" = "FROZEN" ] - # @测试步骤:5: 查看subcgroup状态 - sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/cgroup-v1-freezer-002/subcgroup/freezer.state) + # @测试步骤:4: 解冻CHILD0 + echo "THAWED" >"$CGROUP_TOPDIR"/freezer/$CHILD0/freezer.state - # @预期结果:3: subcgroup状态仍为FROZEN,因为此时父cgroup仍为FROZEN状态, subcgroup状态不会被有效更改 - if [ "$sub_freezer_state" == "FROZEN" ]; then - assert_true [ true ] - else - msg "测试失败: subcgroup状态为$sub_freezer_state, 而不是FROZEN" - assert_false [ true ] - fi + # @测试步骤:5: 查看CHILD0状态 + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CHILD0/freezer.state) + + # @预期结果:3: CHILD0状态仍为FROZEN,因为此时CGROUP仍为FROZEN状态, CHILD0状态不会被有效更改 + assert_true [ "$sub_freezer_state" = "FROZEN" ] + + # @测试步骤:6: 解冻CGROUP + echo "THAWED" >"$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state + + # @测试步骤:7: 查看CGROUP和CHILD0的状态 + freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state) + sub_freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CHILD0/freezer.state) + + # @预期结果:4: CGROUP状态和CHILD0状态都为THAWED + assert_true [ "$freezer_state" = "THAWED" ] + assert_true [ "$sub_freezer_state" = "THAWED" ] return 0 } @@ -82,8 +87,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g freezer:cgroup-v1-freezer-002/subcgroup - cgdelete -g freezer:cgroup-v1-freezer-002 + rmdir "$CGROUP_TOPDIR"/freezer/$CHILD0 + rmdir "$CGROUP_TOPDIR"/freezer/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" index ae849e1..5cf181e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### # @用例ID: 20240731-141907-292150738 -# @用例名称: cgroup-v1-hugetlb-limit_in_bytes-001 +# @用例名称: cgropu-v1-hugetlb-limit_in_bytes-001 # @用例级别: 1 # @用例标签: cgroup-v1 hugetbl limit_in_bytes -# @用例类型: 测试hugetlb.2MB.limit_in_bytes控制文件,超过限制 +# @用例类型: 测试hugetlb.2MB.limit_in_bytes接口文件,超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgropu-v1-hugetlb-limit_in_bytes-001" + tc_setup() { msg "this is tc_setup" # @预置条l件: 检查cgroup版本是否为cgroup v1 @@ -40,17 +42,17 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-001 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } do_test() { - msg "this is do_test" + msg "this is do_test" # @测试步骤:1: 获取系统hugepage的数量 hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage的数量 - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -67,16 +69,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:6: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.limit_in_bytes + echo 2M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.limit_in_bytes # @测试步骤:7:分配2个hugepage - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 2 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:8: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt - MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-001/hugetlb.2MB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt大于0 @@ -91,13 +93,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-001 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" index 9343060..881bbbc 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v1-hugetlb-limit_in_bytes-002 # @用例级别: 2 # @用例标签: cgroup-v1 hugetlb limit_in_bytes -# @用例类型: 测试hugetlb.2MB.limit_in_bytes控制文件, 不超过限制 +# @用例类型: 测试hugetlb.2MB.limit_in_bytes接口文件, 不超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-limit_in_bytes-002" + tc_setup() { msg "this is tc_setup"是否为cgroup v1 if ! check_cgroup_version_is_v1; then @@ -39,7 +41,7 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-002 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } @@ -49,7 +51,7 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage的数量 - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -66,16 +68,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:6: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.limit_in_bytes + echo 2M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.limit_in_bytes # @测试步骤:7: 分配2个hugepage - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:8: 获取cgroup的hugetlb.2MB.max_usage_in_bytes和hugetlb.2MB.failcnt - MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-002/hugetlb.2MB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 @@ -90,13 +92,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-002 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" index 781f5da..2c7ebbb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-115938-131086948 # @用例名称: cgroup-v1-hugetlb-limit_in_bytes-003 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 hugetbl limit_in_bytes -# @用例类型: 测试设置hugetlb.limit_in_bytes并分配高于该限制的内存,hugepage大小为1GB +# @用例类型: 测试hugetlb.1GB.limit_in_bytes接口文件,超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-limit_in_bytes-003" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -37,10 +39,10 @@ tc_setup() { # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then skip_test "内核CONFIG_HUGETLBFS配置未开启" - fi - + fi + # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-003 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } @@ -48,7 +50,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 获取系统本来的hugepage的数量 HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:2: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -63,14 +65,14 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为512MB - echo 512M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.limit_in_bytes + echo 512M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.failcnt - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-003/hugetlb.1GB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 @@ -84,13 +86,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$HUGEPAGE_SIZE" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-003 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" index 4f214c4..fc188e3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-115940-264647997 # @用例名称: cgroup-v1-hugetlb-limit_in_bytes-004 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 hugetbl limit_in_bytes -# @用例类型: 测试设置hugetlb.limit_in_bytes并分配小于或等于该限制的内存,hugepage大小为1GB +# @用例类型: 测试hugetlb.1GB.limit_in_bytes接口文件,不超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-limit_in_bytes-004" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -37,10 +39,10 @@ tc_setup() { # @预置条件: 查看是否有CONFIG_HUGETLBFS配置 if ! grep -q "CONFIG_HUGETLBFS=y" "/boot/config-$(uname -r)"; then skip_test "内核CONFIG_HUGETLBFS配置未开启" - fi - + fi + # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-004 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } @@ -48,7 +50,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 获取系统本来的hugepage的数量 HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:2: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -63,16 +65,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为1024MB - echo 1024M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.limit_in_bytes + echo 1024M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.max_usage_in_bytes和hugetlb.1GB.failcnt - MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-limit_in_bytes-004/hugetlb.1GB.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于1GB, failcnt等于0 @@ -86,13 +88,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$HUGEPAGE_SIZE" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-limit_in_bytes-004 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" index fefa19d..6ddd17d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-130244-196477079 # @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes -# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配高于该限制的内存,hugepage大小为2MB +# @用例类型: 测试hugetlb.2MB.rsvd.limit_in_bytes接口文件,超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-rsvd-limit_in_bytes-001" + tc_setup() { msg "this is tc_setup" # @预置条l件: 检查cgroup版本是否为cgroup v1 @@ -40,15 +42,15 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-001 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } do_test() { - msg "this is do_test" + msg "this is do_test" # @测试步骤:1: 获取系统本来的hugepage的数量 HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:2: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -63,14 +65,14 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.limit_in_bytes + echo 2M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.rsvd.limit_in_bytes # @测试步骤:5: 分配2个hugepage - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 2 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.failcnt - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001/hugetlb.2MB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 @@ -85,13 +87,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$HUGEPAGE_SIZE" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-001 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" index b47432b..7748e53 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-130248-928221366 # @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes -# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配低于该限制的内存,hugepage大小为2MB +# @用例类型: 测试hugetlb.2MB.rsvd.limit_in_bytes接口文件,不超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-rsvd-limit_in_bytes-002" + tc_setup() { msg "this is tc_setup" # @预置条l件: 检查cgroup版本是否为cgroup v1 @@ -40,14 +42,14 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-002 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } do_test() { - msg "this is do_test" + msg "this is do_test" # @测试步骤:1: 获取系统本来的hugepage的数量 HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:2: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -62,16 +64,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 2M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.limit_in_bytes + echo 2M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.rsvd.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.2MB.rsvd.max_usage_in_bytes和hugetlb.2MB.rsvd.failcnt - MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.rsvd.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002/hugetlb.2MB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.2MB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 @@ -86,13 +88,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$HUGEPAGE_SIZE" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-002 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" index cf2799c..31b6677 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-130249-962716187 # @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes -# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配高于该限制的内存,hugepage大小为1GB +# @用例类型: 测试hugetlb.1GB.rsvd.limit_in_bytes接口文件,超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-rsvd-limit_in_bytes-003" + tc_setup() { msg "this is tc_setup" # @预置条l件: 检查cgroup版本是否为cgroup v1 @@ -40,15 +42,15 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } do_test() { - msg "this is do_test" + msg "this is do_test" # @测试步骤:1: 获取系统本来的hugepage的数量 HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:2: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -63,14 +65,14 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为512MB - echo 512M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.limit_in_bytes + echo 512M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.rsvd.limit_in_bytes # @测试步骤:5: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003/hugetlb.1GB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 @@ -85,13 +87,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$HUGEPAGE_SIZE" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" index 0c25cdf..9efc791 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240801-130251-278577040 # @用例名称: cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 hugetbl rsvd limit_in_bytes -# @用例类型: 测试设置hugetlb.rsvd.limit_in_bytes并分配低于该限制的内存,hugepage大小为1GB +# @用例类型: 测试hugetlb.1GB.rsvd.limit_in_bytes接口文件, 不超过限制 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-hugetlb-rsvd-limit_in_bytes-004" + tc_setup() { msg "this is tc_setup" # @预置条l件: 检查cgroup版本是否为cgroup v1 @@ -40,15 +42,15 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 + mkdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } do_test() { - msg "this is do_test" + msg "this is do_test" # @测试步骤:1: 获取系统本来的hugepage的数量 HUGEPAGE_SIZE=$(cat /proc/sys/vm/nr_hugepages) - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:2: 获取hugepage的大小 HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -63,16 +65,16 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:4: 设置cgroup的hugetlb.limit_in_bytes为2MB - echo 1024M > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.limit_in_bytes + echo 1024M >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.rsvd.limit_in_bytes # @测试步骤:5: 将当前shell进程加入到cgroup中并运行分配hugepage的程序 - echo $$ > "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/tasks + echo $$ >"$CGROUP_TOPDIR"/hugetlb/$CGROUP/cgroup.procs "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$HUGEPAGE_SIZE_MB" &>/dev/null # @测试步骤:6: 获取cgroup的hugetlb.1GB.rsvd.failcnt - MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.max_usage_in_bytes) + MAX_USAGE=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.rsvd.max_usage_in_bytes) msg "max usage: $MAX_USAGE" - FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004/hugetlb.1GB.rsvd.failcnt) + FAILCNT=$(cat "$CGROUP_TOPDIR"/hugetlb/$CGROUP/hugetlb.1GB.rsvd.failcnt) msg "failcnt: $FAILCNT" # @预期结果:1: failcnt等于0 @@ -87,13 +89,15 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/hugetlb/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$HUGEPAGE_SIZE" > /proc/sys/vm/nr_hugepages + echo "$HUGEPAGE_SIZE" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup - cgdelete -g hugetlb:cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 + rmdir "$CGROUP_TOPDIR"/hugetlb/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" index b7e685b..b5d3e70 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240723-110114-444553088 # @用例名称: cgroup-v1-memory-limit_in_bytes -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 memory limit_in_bytes -# @用例类型: 测试memory.limit_in_bytes控制文件以及memory.max_usage_in_bytes,memory.failcnt统计文件 +# @用例类型: 测试memory.limit_in_bytes接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-limit_in_bytes" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -32,7 +34,7 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-limit_in_bytes + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } @@ -40,25 +42,26 @@ do_test() { msg "this is do_test" # @测试步骤:1: 关闭系统上的所有交换空间并设置cgroup的内存限制为50M swapoff -a - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-limit_in_bytes + echo 50M >/sys/fs/cgroup/memory/$CGROUP/memory.limit_in_bytes - # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/tasks - stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + # @测试步骤:2: 分配51M内存 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 51M # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.limit_in_bytes的次数 - max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/memory.max_usage_in_bytes) + max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.max_usage_in_bytes) msg "max_usage_in_bytes: $max_usage_in_bytes" - failcnt=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/memory.failcnt) + failcnt=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.failcnt) msg "failcnt: $failcnt" # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-limit_in_bytes/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" - # @预期结果:1: 最大内存使用量等于50M且oom_kill大于0 - if [ "$max_usage_in_bytes" -eq "52428800" ] && [ "$oom_kill" -gt "0" ]; then + # @预期结果:1: 在误差允许的范围内最大内存使用量等于50M且oom_kill大于0 + max_usage_in_bytes=$(echo "$max_usage_in_bytes / 1024 /1024 " | bc ) + if [ "$max_usage_in_bytes" -eq "50" ] && [ "$oom_kill" -gt "0" ]; then # @预期结果:2: 内存达到memory.limit_in_bytes的次数大于0 if [ "$failcnt" -gt "0" ]; then assert_true [ true ] @@ -74,12 +77,14 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 开启系统的交换空间 swapon -a # @清理工作: 清空所有内存页 - cgset -r memory.force_empty=0 cgroup-v1-memory-limit_in_bytes + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.force_empty # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-limit_in_bytes + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" index 4050b3d..fb6f5f3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -1,10 +1,10 @@ #!/bin/bash ############################################################################### # @用例ID: 20240723-131832-170355139 -# @用例名称: cgroup-v1-memory-memsw-limit_in_bytes -# @用例级别: 3 +# @用例名称: cgroup-v1-memory-memsw-limit_in_byte +# @用例级别: 1 # @用例标签: cgroup-v1 memory memsw limit_in_bytes -# @用例类型: 测试memory.memsw.limit_in_bytes控制文件以及memory.memsw.max_usage_in_bytes, memory.memsw.failcnt统计文件 +# @用例类型: 测试memory.memsw.limit_in_bytes接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-memsw-limit_in_byte" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -36,39 +38,36 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-memsw-limit_in_bytes + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置cgroup的内存和交换空间限制为50M - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes - cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-memsw-limit_in_bytes + echo 50M >/sys/fs/cgroup/memory/$CGROUP/memory.limit_in_bytes + echo 50M >/sys/fs/cgroup/memory/$CGROUP/memory.memsw.limit_in_bytes - # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/tasks - stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + # @测试步骤:2: 分配51M内存 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 51M # @测试步骤:3: 获取cgroup的最大内存使用量以及内存达到memory.memsw.limit_in_bytes的次数 - max_memsw_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.max_usage_in_bytes) + max_memsw_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.memsw.max_usage_in_bytes) msg "max_usage_in_bytes: $max_memsw_usage_in_bytes" - memsw_failcnt=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.memsw.failcnt) + memsw_failcnt=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.memsw.failcnt) msg "failcnt: $memsw_failcnt" # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-memsw-limit_in_bytes/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" - # @预期结果:1: 最大内存使用量等于50M且oom_kill大于0 - if [ "$max_memsw_usage_in_bytes" -eq "52428800" ] && [ "$oom_kill" -gt "0" ]; then + # @预期结果:1: 在误差允许的范围内最大内存使用量等于50M且oom_kill大于0 + max_memsw_usage_in_bytes=$(echo "$max_memsw_usage_in_bytes / 1024 /1024 " | bc ) + if [ "$max_memsw_usage_in_bytes" -eq "50" ] && [ "$oom_kill" -gt "0" ]; then # @预期结果:2: 内存达到memory.memsw.limit_in_bytes的次数大于0 - if [ "$memsw_failcnt" -gt "0" ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$memsw_failcnt" -gt 0 ] else assert_false [ true ] fi @@ -78,10 +77,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 清空所有内存页 - cgser -r memory.force_empty=0 cgroup-v1-memory-memsw-limit_in_bytes + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.force_empty # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-memsw-limit_in_bytes + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" index 70ababb..71d537a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-001.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240723-201026-919111329 # @用例名称: cgroup-v1-memory-oom_control-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 memory oom_control -# @用例类型: 测试默认启用oom_control +# @用例类型: 测试memory.oom_control接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-oom_control-001" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -32,22 +34,22 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-oom_control-001 + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置内存限制 - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 - cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-001 + echo 50M >/sys/fs/cgroup/memory/$CGROUP/memory.limit_in_bytes + echo 50M >/sys/fs/cgroup/memory/$CGROUP/memory.memsw.limit_in_bytes - # @测试步骤:2: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-001/tasks - stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s + # @测试步骤:2: 51M内存 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR/tst_lib/cgroup_util/bin/alloc_anon" 51M # @测试步骤:3: 获取被oom_killer杀死的进程数 - oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-001/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" @@ -59,8 +61,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 删除cgroup - cgdelete memory:cgroup-v1-memory-oom_control-001 + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" index 9bdb7ba..0afcff2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-oom_control-002.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240723-201033-714742346 # @用例名称: cgroup-v1-memory-oom_control-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 memory oom_control -# @用例类型: 测试禁用oom_control +# @用例类型: 测试memory.oom_control接口文件,禁用oom_control ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,7 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -TMP_FILE=$(mktemp) +CGROUP="cgroup-v1-memory-oom_control-002" tc_setup() { msg "this is tc_setup" @@ -34,44 +34,43 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-oom_control-002 + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 禁用oom_control - echo 1 >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-002/memory.oom_control + echo 1 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control # @测试步骤:2: 设置内存限制 - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 - cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-oom_control-002 + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.limit_in_bytes + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.memsw.limit_in_bytes - # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-002/tasks - stress-ng --vm 1 --vm-bytes 51M --vm-keep -t 5s &>"$TMP_FILE" - time=$(grep -oP '(?<=completed in )\d+\.\d+(?=s)' "$TMP_FILE") - msg "time: $time" + # @测试步骤:3: 运行一个分配100M内存的进程 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + task_pid0=$! + echo $task_pid0 >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + sleep 10 # @测试步骤:4: 获取被oom_killer杀死的进程数 - oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-oom_control-002/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" - # @预期结果:1: 被oom_killer杀死的进程数等于0,进程会在内存紧张时睡眠直到内存充足时被唤醒,所以进程运行时间远大于5s - if [ "$oom_kill" -eq "0" ] && [ "$(echo "$time > 6" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + # @预期结果:1: 被oom_killer杀死的进程数等于0 + assert_true [ "$oom_kill" -eq "0" ] return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid0" + sleep 1 # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-oom_control-002 + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" index 3b79082..9d0a7ec 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-pressure_level" TMP_FILE=$(mktemp) tc_setup() { @@ -38,28 +39,26 @@ tc_setup() { fi # @预置条件: 新建一个cgroup - cgcreate -g memory:cgroup-v1-memory-pressure_level + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 在后台运行监听器 - if ! [ -f "${TST_TS_TOPDIR}/tst_lib/cgroup_event_listener" ]; then - skip_test "cgroup_event_listener文件不存在, 请先在tst_lib目录下编译" - fi - "${TST_TS_TOPDIR}"/tst_lib/cgroup_event_listener "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-pressure_level/memory.pressure_level critical,hierarchy &>"$TMP_FILE" & - + stdbuf -oL "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/cgroup_event_listener "$CGROUP_TOPDIR"/memory/$CGROUP/memory.pressure_level critical,hierarchy &>"$TMP_FILE" & + # @测试步骤:2: 设置内存限制 - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-pressure_level - cgset -r memory.memsw.limit_in_bytes=50M cgroup-v1-memory-pressure_level + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.limit_in_bytes + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.memsw.limit_in_bytes - # @测试步骤:3: 使用stress-ng运行一个分配51M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-pressure_level/tasks - stress-ng --vm 1 --vm-bytes 51M -t 1s + # @测试步骤:3: 分配51M内存 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + for _ in $(seq 1 10); do + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 51M + done # @预期结果:1: 临时文件应该非空,有内存压力通知 - msg "file content: $(cat "$TMP_FILE")" if [ -s "$TMP_FILE" ]; then assert_true [ true ] else @@ -71,10 +70,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 清空所有内存页 - cgset -r memory.force_empty=0 cgroup-v1-memory-pressure_level + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.force_empty # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-pressure_level + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP # @清理工作:删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" index bcf8d5e..0e553a9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240723-133429-048617311 # @用例名称: cgroup-v1-memory-soft_limit_in_bytes -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 memory soft_limit_in_bytes -# @用例类型: 测试memory.soft_limit_in_bytes控制文件以及memory.max_usage_in_bytes, memory.failcnt统计文件 +# @用例类型: 测试memory.soft_limit_in_bytes控制文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-soft_limit_in_bytes-001" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -36,32 +38,32 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-soft_limit_in_bytes + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 关闭系统上的所有交换空间并设置cgroup的内存限制为50M - swapoff -a - cgset -r memory.soft_limit_in_bytes=50M cgroup-v1-memory-soft_limit_in_bytes + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.swappiness + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.soft_limit_in_bytes - # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-soft_limit_in_bytes/tasks - stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s + # @测试步骤:2: 分配100M内存 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M # @测试步骤:3: 获取cgroup的最大内存使用量 - max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.max_usage_in_bytes) + max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.max_usage_in_bytes) msg "max_usage_in_bytes: $max_usage_in_bytes" # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-soft_limit_in_bytes/memory.oom_control) + oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') msg "oom_kill: $oom_kill" # @预期结果:1: 最大内存使用量超过了50M且oom_kill等于0 - if [ "$max_usage_in_bytes" -gt "52428800" ] && [ "$oom_kill" -eq "0" ]; then - assert_true [ true ] + if [ "$max_usage_in_bytes" -gt "52428800" ]; then + assert_true [ "$oom_kill" -eq "0" ] else assert_false [ true ] fi @@ -71,12 +73,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - # @清理工作: 开启系统的交换空间 - swapon -a + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 清空所有内存页 - cgset -r memory.force_empty=0 cgroup-v1-memory-soft_limit_in_bytes + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.force_empty # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-soft_limit_in_bytes + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" index 665dc45..c079036 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-001.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240723-142731-893019797 # @用例名称: cgroup-v1-memory-swappiness-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 memory swappiness # @用例类型: 测试memory.swappiness控制文件,当swappiness为0时,内存不会被交换到swap空间 ############################################################################### @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-swappiness-001" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -32,7 +34,11 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-swappiness-001 + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP + # @预置条件: 查看系统是否启用了swapping + if [ -z "$(swapon --show)" ]; then + skip_test "系统未启用swap或没有swapfile" + fi # @预置条件: 清空swap空间内存 sudo swapoff -a sudo swapon -a @@ -42,17 +48,17 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 设置cgroup的内存限制为50M - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-swappiness-001 + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.limit_in_bytes # @测试步骤:2: 设置cgroup的内存swappiness为0 - cgset -r memory.swappiness=0 cgroup-v1-memory-swappiness-001 + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.swappiness - # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-001/tasks - stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s + # @测试步骤:3: 运行一个分配50M内存的进程 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR/tst_lib/cgroup_util/bin/alloc_anon" 50M # @测试步骤:4: 获取swap空间内存使用量 - swap_usage=$(grep swap "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-001/memory.stat | head -n 1 | awk '{print $2}') + swap_usage=$(grep swap "$CGROUP_TOPDIR"/memory/$CGROUP/memory.stat | head -n 1 | awk '{print $2}') msg "swap_usage: $swap_usage" # @预期结果:1: swap空间内存使用量为0 @@ -63,10 +69,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 清空所有内存页 - cgset -r memory.force_empty=0 cgroup-v1-memory-swappiness-001 + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.force_empty # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-swappiness-001 + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP # @清理工作: 清理swap空间 sudo swapoff -a sudo swapon -a diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" index b0bde84..6e2fdd7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-swappiness-002.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240723-162157-535660907 # @用例名称: cgroup-v1-memory-swappiness-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 memory swappiness # @用例类型: 测试memory.swappiness控制文件,当swappiness为100时,内存会被交换到swap空间 ############################################################################### @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-memory-swappiness-002" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 @@ -32,7 +34,11 @@ tc_setup() { fi # @预置条件: 创建一个cgroup - cgcreate -g memory:cgroup-v1-memory-swappiness-002 + mkdir "$CGROUP_TOPDIR"/memory/$CGROUP + # @预置条件: 查看系统是否启用了swapping + if [ -z "$(swapon --show)" ]; then + skip_test "系统未启用swap或没有swapfile" + fi # @预置条件: 清空swap空间内存 sudo swapoff -a sudo swapon -a @@ -42,17 +48,17 @@ tc_setup() { do_test() { msg "this is do_test" # @测试步骤:1: 设置cgroup的内存限制为50M - cgset -r memory.limit_in_bytes=50M cgroup-v1-memory-swappiness-002 + echo 50M >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.limit_in_bytes # @测试步骤:2: 设置cgroup的内存swappiness为100 - cgset -r memory.swappiness=100 cgroup-v1-memory-swappiness-002 + echo 100 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.swappiness - # @测试步骤:3: 使用stress-ng运行一个分配50M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-002/tasks - stress-ng --vm 1 --vm-bytes 50M --vm-keep -t 15s + # @测试步骤:3: 分配50M内存 + echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M # @测试步骤:4: 获取swap空间内存使用量 - swap_usage=$(grep swap "$CGROUP_TOPDIR"/memory/cgroup-v1-memory-swappiness-002/memory.stat | head -n 1 | awk '{print $2}') + swap_usage=$(grep swap "$CGROUP_TOPDIR"/memory/$CGROUP/memory.stat | head -n 1 | awk '{print $2}') msg "swap_usage: $swap_usage" # @预期结果:1: swap空间内存使用量大于0 @@ -63,10 +69,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/memory/cgroup.procs # @清理工作: 清空所有内存页 - cgset -r memory.force_empty=0 cgroup-v1-memory-swappiness-002 + echo 0 >"$CGROUP_TOPDIR"/memory/$CGROUP/memory.force_empty # @清理工作: 删除cgroup - cgdelete -g memory:cgroup-v1-memory-swappiness-002 + rmdir "$CGROUP_TOPDIR"/memory/$CGROUP # @清理工作: 清理swap空间 sudo swapoff -a sudo swapon -a diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" index a99732b..e024c25 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240726-114714-002803899 # @用例名称: cgroup-v1-net_cls-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 net_cls # @用例类型: 测试设置带宽限制的情况 ############################################################################### @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-net_cls-001" TMP_FILE=$(mktemp) tc_setup() { @@ -28,6 +29,10 @@ tc_setup() { if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_NET_CLASSID配置 + if ! grep -q CONFIG_CGROUP_NET_CLASSID=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_NET_CLASSID配置未开启" + fi # @预置条件: 检查是否安装了tc工具 if ! is_tc_installed; then skip_test "没有安装tc工具" @@ -38,7 +43,7 @@ tc_setup() { fi # @预置条件: 创建cgroup - cgcreate -g net_cls:cgroup-v1-net_cls-001 + mkdir "$CGROUP_TOPDIR"/net_cls/$CGROUP return 0 } @@ -55,10 +60,10 @@ do_test() { msg "lo接口的IP地址是: $lo_ip" # @测试步骤:3: 设置net_cls.classid - cgset -r net_cls.classid=0x100001 cgroup-v1-net_cls-001 + echo 0x100001 >"$CGROUP_TOPDIR"/net_cls/$CGROUP/net_cls.classid # @预期结果:1: 检查是否设置成功 - classid=$(cat "$CGROUP_TOPDIR"/net_cls/cgroup-v1-net_cls-001/net_cls.classid) + classid=$(cat "$CGROUP_TOPDIR"/net_cls/$CGROUP/net_cls.classid) assert_true [ "$classid" = "1048577" ] # @测试步骤:4: 给lo接口添加新的队列规则 @@ -75,7 +80,7 @@ do_test() { task_pid=$! # @测试步骤:8: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 - echo $$ >"$CGROUP_TOPDIR"/net_cls/cgroup-v1-net_cls-001/tasks + echo $$ >"$CGROUP_TOPDIR"/net_cls/$CGROUP/cgroup.procs iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" # @测试步骤:9: 获取iperf3的接收数据端的bitrate @@ -93,8 +98,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo 0 >"$CGROUP_TOPDIR"/net_cls/cgroup.procs # @清理工作: 删除cgroup - cgdelete -g net_cls:cgroup-v1-net_cls-001 + rmdir "$CGROUP_TOPDIR"/net_cls/$CGROUP # @清理工作: 删除队列规则 tc qdisc del dev lo root # @清理工作: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" index 0284688..11c032a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-002.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240726-114715-271502110 # @用例名称: cgroup-v1-net_cls-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 net_cls # @用例类型: 测试不设置带宽限制的情况 ############################################################################### @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-net_cls-002" TMP_FILE=$(mktemp) tc_setup() { @@ -28,6 +29,10 @@ tc_setup() { if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_NET_CLASSID配置 + if ! grep -q CONFIG_CGROUP_NET_CLASSID=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_NET_CLASSID配置未开启" + fi # @预置条件: 检查是否安装了tc工具 if ! is_tc_installed; then skip_test "没有安装tc工具" @@ -38,7 +43,7 @@ tc_setup() { fi # @预置条件: 创建cgroup - cgcreate -g net_cls:cgroup-v1-net_cls-002 + mkdir "$CGROUP_TOPDIR"/net_cls/$CGROUP return 0 } @@ -59,7 +64,7 @@ do_test() { task_pid=$! # @测试步骤:4: 将进程加入cgroup;启动iperf3客户端发送数据包到服务端 - echo $$ >"$CGROUP_TOPDIR"/net_cls/cgroup-v1-net_cls-002/tasks + echo $$ >"$CGROUP_TOPDIR"/net_cls/$CGROUP/cgroup.procs iperf3 -c "$lo_ip" -i 1 -t 5 &>"$TMP_FILE" # @测试步骤:5: 获取iperf3的接收数据端的bitrate @@ -76,8 +81,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo 0 >"$CGROUP_TOPDIR"/net_cls/cgroup.procs # @清理工作: 删除cgroup - cgdelete -g net_cls:cgroup-v1-net_cls-002 + rmdir "$CGROUP_TOPDIR"/net_cls/$CGROUP # @清理工作: 删除队列规则 tc qdisc del dev lo root # @清理工作: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" index 799795c..5aa957b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_prio.sh" @@ -20,15 +20,21 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-net_prio" + tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" fi + # @预置条件: 检查是否开启了CONFIG_CGROUP_NET_PRIO配置 + if ! grep -q CONFIG_CGROUP_NET_PRIO=y /boot/config-"$(uname -r)"; then + skip_test "内核CONFIG_CGROUP_NET_PRIO配置未开启" + fi # @预置条件: 创建cgroup - cgcreate -g net_prio:cgroup-v1-net_prio + mkdir "$CGROUP_TOPDIR"/net_prio/$CGROUP return 0 } @@ -41,15 +47,15 @@ do_test() { fi # @测试步骤:2: 设置net_prio.ifpriomap - echo "lo 5" > "$CGROUP_TOPDIR"/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap + echo "lo 5" >"$CGROUP_TOPDIR"/net_prio/$CGROUP/net_prio.ifpriomap # @测试步骤:3: 获取net_prio.ifpriomap配置 - ifpriomap=$(cat "$CGROUP_TOPDIR"/net_prio/cgroup-v1-net_prio/net_prio.ifpriomap) + ifpriomap=$(cat "$CGROUP_TOPDIR"/net_prio/$CGROUP/net_prio.ifpriomap) io_ifpriomap=$(echo "$ifpriomap" | grep "lo" | awk '{print $2}') msg "io_ifpriomap: $io_ifpriomap" - # @预期结果:1: 检查是否设置成功 - assert_true [ "$io_ifpriomap" -eq "5" ] + # @预期结果:1: 检查是否设置成功 + assert_true [ "$io_ifpriomap" -eq 5 ] return 0 } @@ -57,7 +63,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g net_prio:cgroup-v1-net_prio + rmdir "$CGROUP_TOPDIR"/net_prio/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" index 341b52a..2067b2a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" @@ -19,7 +19,10 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 # shellcheck source=/dev/null source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### - + +CGROUP="cgroup-v1-perf_event" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" TMP_FILE=$(mktemp) tc_setup() { @@ -34,31 +37,52 @@ tc_setup() { fi # @预置条件: 创建cgroup - cgcreate -g perf_event:cgroup-v1-perf_event + mkdir "$CGROUP_TOPDIR"/perf_event/$CGROUP + mkdir "$CGROUP_TOPDIR"/perf_event/$CHILD0 + mkdir "$CGROUP_TOPDIR"/perf_event/$CHILD1 + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 启动一个进程并将其加入cgroup - echo $$ > "$CGROUP_TOPDIR"/perf_event/cgroup-v1-perf_event/tasks - stress-ng --cpu 1 --timeout 5s & - sleep 3 + # @测试步骤:1: 启动一个进程并将其加入CHILD0 + { + while true; do :; done + } & + task_pid0=$! + echo "$task_pid0" >"$CGROUP_TOPDIR"/perf_event/$CHILD0/cgroup.procs - # @测试步骤:2: 使用perf工具监控进程 - perf stat -e cpu-clock -a -G cgroup-v1-perf_event sleep 1 &> "$TMP_FILE" - cpu_clock=$(grep "cpu-clock" "$TMP_FILE" | awk '{print $1}') + # @测试步骤:2: 启动一个进程并将其加入CHILD1 + { + while true; do :; done + } & + task_pid1=$! + echo "$task_pid1" >"$CGROUP_TOPDIR"/perf_event/$CHILD1/cgroup.procs + + # @测试步骤:2: 使用perf工具监控进程, 睡眠1s + perf stat -e cpu-clock -a -G $CGROUP sleep 1 &>"$TMP_FILE" + cpu_clock=$(grep "cpu-clock" "$TMP_FILE" | awk '{print $1}' | tr -d ',') + cpu_clock=$(echo "scale=2; $cpu_clock / 1000" | bc) msg "cpu_clock: $cpu_clock" - # @预期结果:1: - assert_false [ "$cpu_clock" == " 1.8" | bc)" -eq 1 ]; then + assert_true [ "$(echo "$cpu_clock < 2.2" | bc)" -eq 1 ] + else + assert_false [ true ] + fi return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: kill后台进程 + kill -9 "$task_pid0" "$task_pid1" # @清理工作: 删除cgroup - cgdelete -g perf_event:cgroup-v1-perf_event + rmdir "$CGROUP_TOPDIR"/perf_event/$CHILD0 + rmdir "$CGROUP_TOPDIR"/perf_event/$CHILD1 + rmdir "$CGROUP_TOPDIR"/perf_event/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" index 8519220..d20c60d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240801-154850-001570487 # @用例名称: cgroup-v1-pids-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v1 pids # @用例类型: 测试pids.max控制文件, 进程数超过限制 ############################################################################### @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-pids-001" TMP_FILE=$(mktemp) tc_setup() { @@ -27,35 +28,34 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" - fi + fi # @预置条件: 检查是否开启了CONFIG_CGROUP_PIDS配置 if ! grep -q CONFIG_CGROUP_PIDS=y /boot/config-"$(uname -r)"; then skip_test "内核CONFIG_CGROUP_PIDS配置未开启" fi # @预置条件: 创建cgroup - cgcreate -g pids:cgroup-v1-pids-001 + mkdir "$CGROUP_TOPDIR"/pids/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-001/pids.max + echo 2 >"$CGROUP_TOPDIR"/pids/$CGROUP/pids.max # @测试步骤:2: 将当前shell加入cgroup - echo $$ > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-001/tasks + echo $$ >"$CGROUP_TOPDIR"/pids/$CGROUP/cgroup.procs # @测试步骤:3: 运行两个子进程 - (echo "Here's some processes for you." | cat) &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/pids/tasks + (echo "Here's some processes for you." | cat) &>"$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/pids/cgroup.procs # @测试步骤:4: 获取超过最大进程数的次数 - FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-001/pids.events | awk '{print $2}') - msg "failcnt: $FAILCNT" + FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/$CGROUP/pids.events | awk '{print $2}') # @预期结果:1: 运行失败 - if grep -q "Resource temporarily unavailable" "$TMP_FILE" ; then + if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then assert_true [ "$FAILCNT" -gt 0 ] else assert_false [ true ] @@ -63,11 +63,11 @@ do_test() { return 0 } - + tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g pids:cgroup-v1-pids-001 + rmdir "$CGROUP_TOPDIR"/pids/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" index b2ade89..b427b20 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240801-191404-256040067 # @用例名称: cgroup-v1-pids-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 pids # @用例类型: 测试pids.max控制文件, 进程数不超过限制 ############################################################################### @@ -20,6 +20,7 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-pids-002" TMP_FILE="$(mktemp)" tc_setup() { @@ -27,33 +28,32 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" - fi + fi # @预置条件: 检查是否开启了CONFIG_CGROUP_PIDS配置 if ! grep -q CONFIG_CGROUP_PIDS=y /boot/config-"$(uname -r)"; then skip_test "内核CONFIG_CGROUP_PIDS配置未开启" fi # @预置条件: 创建cgroup - cgcreate -g pids:cgroup-v1-pids-002 + mkdir "$CGROUP_TOPDIR"/pids/$CGROUP return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.max + echo 2 >"$CGROUP_TOPDIR"/pids/$CGROUP/pids.max # @测试步骤:2: 将当前shell加入cgroup - echo $$ > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/tasks + echo $$ >"$CGROUP_TOPDIR"/pids/$CGROUP/cgroup.procs - # @测试步骤:3: 运行进程并获取pids.current - PID_NUM=$(cat "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.current) - echo $$ > "$CGROUP_TOPDIR"/pids/tasks + # @测试步骤:3: 运行进程并获取pids.current + PID_NUM=$(cat "$CGROUP_TOPDIR"/pids/$CGROUP/pids.current) + echo $$ >"$CGROUP_TOPDIR"/pids/cgroup.procs # @测试步骤:4: 获取超过最大进程数的次数 - FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-002/pids.events | awk '{print $2}') - msg "failcnt: $FAILCNT" - + FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/$CGROUP/pids.events | awk '{print $2}') + # @预期结果:1: PID_NUM为2 if [ "$PID_NUM" -eq 2 ]; then assert_true [ "$FAILCNT" -eq 0 ] @@ -67,7 +67,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g pids:cgroup-v1-pids-002 + rmdir "$CGROUP_TOPDIR"/pids/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" index 719e90c..0712a53 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240801-191225-778933447 # @用例名称: cgroup-v1-pids-003 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v1 pids # @用例类型: 测试pids的层次结构 ############################################################################### @@ -20,6 +20,8 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +CGROUP="cgroup-v1-pids-003" +CHILD0="$CGROUP/child0" TMP_FILE=$(mktemp) tc_setup() { @@ -27,40 +29,38 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v1 if ! check_cgroup_version_is_v1; then skip_test "cgroup版本不是v1" - fi + fi # @预置条件: 检查是否开启了CONFIG_CGROUP_PIDS配置 if ! grep -q CONFIG_CGROUP_PIDS=y /boot/config-"$(uname -r)"; then skip_test "内核CONFIG_CGROUP_PIDS配置未开启" fi - + # @预置条件: 创建cgroup - cgcreate -g pids:cgroup-v1-pids-003 - cgcreate -g pids:cgroup-v1-pids-003/subcgroup + mkdir "$CGROUP_TOPDIR"/pids/$CGROUP + mkdir "$CGROUP_TOPDIR"/pids/$CHILD0 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/pids.max + echo 2 >"$CGROUP_TOPDIR"/pids/$CGROUP/pids.max # @测试步骤:2: 获取subcgroup的pids.max - PID_MAX=$(cat "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/subcgroup/pids.max) - msg "subcgroup pids.max: $PID_MAX" + PID_MAX=$(cat "$CGROUP_TOPDIR"/pids/$CHILD0/pids.max) # @预期结果:1: subcgroup的pids.max为max assert_true [ "$PID_MAX" = "max" ] # @测试步骤:3: 将当前shell加入subcgroup - echo $$ > "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/subcgroup/tasks + echo $$ >"$CGROUP_TOPDIR"/pids/$CHILD0/cgroup.procs # @测试步骤:4: 运行了两个子进程 - (echo "Here's some processes for you." | cat) &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/pids/tasks + (echo "Here's some processes for you." | cat) &>"$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/pids/cgroup.procs # @测试步骤:5: 获取超过最大进程数的次数 - FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/cgroup-v1-pids-003/subcgroup/pids.events | awk '{print $2}') - msg "failcnt: $FAILCNT" + FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/$CHILD0/pids.events | awk '{print $2}') # @预期结果:2: 运行失败 if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then @@ -75,8 +75,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 删除cgroup - cgdelete -g pids:cgroup-v1-pids-003/subcgroup - cgdelete -g pids:cgroup-v1-pids-003 + rmdir "$CGROUP_TOPDIR"/pids/$CHILD0 + rmdir "$CGROUP_TOPDIR"/pids/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" index c9ae0f5..a91418e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-001.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240805-223037-169024376 # @用例名称: cgroup-v2-cpu-idle-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v2 cpu idle # @用例类型: 测试cpu.idle接口文件,设置SCHD_IDLE调度策略 ############################################################################### @@ -21,6 +21,8 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### CGROUP="cgroup-v2-cpu-idle-001" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" TMP_FILE=$(mktemp) tc_setup() { @@ -37,31 +39,67 @@ tc_setup() { skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpu.idle值 - echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cpu.idle + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" - # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + + # @测试步骤:5: 设置CHILD0的cpu.idle值为1 + echo 1 >"$CGROUP_TOPDIR"/$CHILD0/cpu.idle + + # @测试步骤:6: 启动一个占用CPU的进程,并将其放入CHILD0 + { + while true; do :; done + } & task_pid1=$! - echo $task_pid1 > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $task_pid1 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs - # @测试步骤:3: 启动另一个占用CPU的进程 - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:7: 启动另一个占用CPU的进程, 并将其放入CHILD1 + { + while true; do :; done + } & task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs - # @测试步骤:4: 使用top命令循环获取task_pid的cpu利用率 + # @测试步骤:8: 使用top命令循环获取task_pid的cpu利用率 total_cpu_usage=0 for _ in $(seq 1 10); do - top -b -n 1 -p $task_pid1 > "$TMP_FILE" + top -b -n 1 -p $task_pid1 >"$TMP_FILE" cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') - msg "CPU usage: $cpu_usage" total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) sleep 1 done @@ -69,7 +107,6 @@ do_test() { msg "average CPU usage: $aver_cpu_usage" # @预期结果:1: 在误差范围内,task_pid的cpu利用率应该为0 - kill -9 $task_pid1 $task_pid2 aver_cpu_usage_max=5 assert_true [ "$(echo "$aver_cpu_usage <= $aver_cpu_usage_max" | bc)" -eq 1 ] @@ -78,7 +115,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid1" "$task_pid2" + sleep 1 # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" index ed927a0..55f08ca 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-idle-002.sh" @@ -1,8 +1,8 @@ #!/bin/bash ############################################################################### # @用例ID: 20240805-223054-480591007 -# @用例名称: cgroup-v2-cpu-idle-002.sh -# @用例级别: 3 +# @用例名称: cgroup-v2-cpu-idle-002 +# @用例级别: 2 # @用例标签: cgroup-v2 cpu idle # @用例类型: 测试cpu.idle接口文件,不设置SCHD_IDLE调度策略 ############################################################################### @@ -21,6 +21,8 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### CGROUP="cgroup-v2-cpu-idle-002" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" TMP_FILE=$(mktemp) tc_setup() { @@ -37,28 +39,64 @@ tc_setup() { skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 启动一个占用CPU的进程,并将其放入cgroup - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + + # @测试步骤:5: 启动一个占用CPU的进程,并将其放入CHILD0 + { + while true; do :; done + } & task_pid1=$! - echo $task_pid1 > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $task_pid1 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs - # @测试步骤:2: 启动另一个占用CPU的进程 - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:6: 启动另一个占用CPU的进程并将其放入CHILD1 + { + while true; do :; done + } & task_pid2=$! - - # @测试步骤:3: 使用top命令循环获取task_pid的cpu利用率 + echo $task_pid2 >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + + # @测试步骤:7: 使用top命令循环获取task_pid的cpu利用率 total_cpu_usage=0 for _ in $(seq 1 10); do - top -b -n 1 -p $task_pid1 > "$TMP_FILE" + top -b -n 1 -p $task_pid1 >"$TMP_FILE" cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') - msg "CPU usage: $cpu_usage" total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) sleep 1 done @@ -66,7 +104,6 @@ do_test() { msg "average CPU usage: $aver_cpu_usage" # @预期结果:1: 在误差范围内,task_pid1的cpu利用率不为0 - kill -9 $task_pid1 $task_pid2 assert_true [ "$(echo "$aver_cpu_usage > 0" | bc)" -eq 1 ] return 0 @@ -74,7 +111,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid1" "$task_pid2" + sleep 1 # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" index 8e6a24c..5e61d35 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240804-223507-640719663 # @用例名称: cgroup-v2-cpu-max-burst-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v2 cpu max burst # @用例类型: 测试cpu.max.burst接口文件,设置限制,并设置burst时间 ############################################################################### @@ -36,17 +36,17 @@ tc_setup() { skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置cpu.max值 - echo "500000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max + echo "100000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max # @测试步骤:2: 设置cpu.max.burst值 - echo "200000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max.burst + echo "50000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max.burst # @测试步骤:3: 启动一个占用CPU的进程,并将其放入cgroup { @@ -57,29 +57,29 @@ do_test() { sleep 3 # @测试步骤:4: 读取cpu.stat文件 - 读取cpu.stat文件 cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) msg "cpu_stat: " msg "$cpu_stat" nr_bursts=$(echo "$cpu_stat" | grep nr_bursts | awk '{print $2}') burst_usec=$(echo "$cpu_stat" | grep burst_usec | awk '{print $2}') - kill -9 $task_pid # @预期结果:1: cpu.stat文件中的burst_usec和nr_bursts均大于0 - if [ "$nr_bursts" -gt 0 ] ; then - assert_true [ "$burst_usec" -eq 200000 ] + if [ "$nr_bursts" -gt 0 ]; then + assert_true [ "$burst_usec" -eq 50000 ] else assert_false [ true ] fi - return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 + rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" index 2f56400..7521822 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240804-224758-298815496 # @用例名称: cgroup-v2-cpu-max-burst-002 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v2 cpu max burst # @用例类型: 测试cpu.max.burst接口文件,设置限制,不设置burst时间 ############################################################################### @@ -36,15 +36,15 @@ tc_setup() { skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置cpu.max值 - echo "500000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max + echo "100000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup { @@ -55,16 +55,14 @@ do_test() { sleep 3 # @测试步骤:3: 读取cpu.stat文件 - 读取cpu.stat文件 cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) - msg "cpu_stat: " - msg "$cpu_stat" - nr_bursts=$(echo "$cpu_stat" | grep nr_bursts | awk '{print $2}') + nr_burst=$(echo "$cpu_stat" | grep nr_burst | awk '{print $2}') + msg "nr_burst: $nr_burst" burst_usec=$(echo "$cpu_stat" | grep burst_usec | awk '{print $2}') - kill -9 $task_pid + msg "burst_usec: $burst_usec" # @预期结果:1: cpu.stat文件中的burst_usec和nr_bursts均等于0 - if [ "$nr_bursts" -eq 0 ] ; then + if [ "$nr_burst" -eq 0 ]; then assert_true [ "$burst_usec" -eq 0 ] else assert_false [ true ] @@ -75,8 +73,11 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 + rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" new file mode 100755 index 0000000..ff4f21a --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" @@ -0,0 +1,86 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240804-180942-698874070 +# @用例名称: cgroup-v2-cpu-max +# @用例级别: 1 +# @用例标签: cgroup-v2 cpu max +# @用例类型: 测试cpu.max接口文件,设置限制 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-max" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 设置CGROUP的cpu.max值 + echo "100000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max + + # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup + { + while true; do :; done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 3 + + # @测试步骤:3: 读取cpu.stat文件 + cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) + nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') + nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') + throttled_usec=$(echo "$cpu_stat" | grep throttled_usec | awk '{print $2}') + msg "nr_periods: $nr_periods, nr_throttled: $nr_throttled, throttled_usec: $throttled_usec" + + # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_usec均大于0 + if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then + assert_true [ "$throttled_usec" -gt 0 ] + else + assert_false [ true ] + fi + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" index b9d2ddc..a2e9dd0 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" @@ -2,8 +2,8 @@ ############################################################################### # @用例ID: 20240804-225021-343953847 # @用例名称: cgroup-v2-cpu-pressure -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu pressure +# @用例级别: 2 +# @用例标签: cgroup-v2 cpu pressure # @用例类型: 测试cpu.pressure接口文件,设置CPU压力通知 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -37,26 +37,66 @@ tc_setup() { skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 注册触发器 - stdbuf -oL "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure &> "$TMP_FILE" & + # @测试步骤:1: 启用cgroup.pressure + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.pressure || return 1 - # @测试步骤:1: 运行两个压力测试并将其运行在一个CPU核心上 - taskset -c 0 stress-ng --cpu 1 --timeout 10 & + # @测试步骤:2: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:3: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:4: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:5: 设置CGROUP的cpuset.cpus为first_online_cpu + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus + + # @测试步骤:6: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:7: 注册触发器 + stdbuf -oL "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure &>"$TMP_FILE" & + + # @测试步骤:8: 运行两个进程并将其运行在一个CPU核心上 + { + while true; do :; done + } & task_pid1=$! echo $task_pid1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - taskset -c 0 stress-ng --cpu 1 --timeout 10 & + { + while true; do :; done + } & task_pid2=$! echo $task_pid2 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - sleep 5 + sleep 10 - # @测试步骤:2: 读取cpu.pressure文件 + # @测试步骤:9: 读取cpu.pressure文件 cpu_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure) msg "cpu_pressure: " msg "$cpu_pressure" @@ -78,8 +118,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 $task_pid1 $task_pid2 # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 + rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-stat.sh" new file mode 100755 index 0000000..61ef588 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-stat.sh" @@ -0,0 +1,81 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-100137-362330129 +# @用例名称: cgroup-v2-cpu-stat +# @用例级别: 1 +# @用例标签: cgroup-v2 cpu stat +# @用例类型: 测试cpu.stat接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-stat" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 运行一个进程 + { + for _ in {1..100}; do + echo -e "line1\nline2\nline3" | awk 'END {print NR}' &>/dev/null + done + } & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + wait $task_pid + + # @测试步骤:2: 读取cpu.stat中的usage_usec字段, user_usec字段的值和system_usec字段的值 + usage_usec=$(grep usage_usec "$CGROUP_TOPDIR"/$CGROUP/cpu.stat | awk '{print $2}') + msg "usage_usec: $usage_usec" + user_usec=$(grep user_usec "$CGROUP_TOPDIR"/$CGROUP/cpu.stat | awk '{print $2}') + msg "user_usec: $user_usec" + system_usec=$(grep system_usec "$CGROUP_TOPDIR"/$CGROUP/cpu.stat | awk '{print $2}') + msg "system_usec: $system_usec" + + # @预期结果:1: usage_usec字段的值大于0, user_usec字段的值大于0, system_usec字段的值大于0 + assert_true [ "$usage_usec" -gt 0 ] + assert_true [ "$user_usec" -gt 0 ] + assert_true [ "$system_usec" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" index e1e73f5..4156807 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-001.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240804-155658-686144114 # @用例名称: cgroup-v2-cpu-weight-001 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v2 cpu weight -# @用例类型: 测试cpu.weight接口文件,设置了权重 +# @用例类型: 测试cpu.weight接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,9 +20,9 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -PARENT_CGROUP="cgroup-v2-cpu-weight-001" -SUB_CGROUP1="cgroup-v2-cpu-weight-001/sub_cgroup01" -SUB_CGROUP2="cgroup-v2-cpu-weight-001/sub_cgroup02" +CGROUP="cgroup-v2-cpu-weight-001" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" tc_setup() { msg "this is tc_setup" @@ -32,64 +32,93 @@ tc_setup() { fi # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 对不同的cgroup设置不同的cpu.weight值 - echo 2048 >"$CGROUP_TOPDIR"/$SUB_CGROUP1/cpu.weight - echo 512 >"$CGROUP_TOPDIR"/$SUB_CGROUP2/cpu.weight + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" - # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + + # @测试步骤:5: 对不同的cgroup设置不同的cpu.weight值 + echo 2048 >"$CGROUP_TOPDIR"/$CHILD0/cpu.weight + echo 512 >"$CGROUP_TOPDIR"/$CHILD1/cpu.weight + + # @测试步骤:6: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 + { + while true; do :; done + } & task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cgroup.procs + echo $task_pid1 >"$CGROUP_TOPDIR"/"$CHILD0"/cgroup.procs - taskset 0x1 sh -c 'while true; do :; done' & + { + while true; do :; done + } & task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cgroup.procs - + echo $task_pid2 >"$CGROUP_TOPDIR"/"$CHILD1"/cgroup.procs sleep 3 - # @测试步骤:3: 获取两个sub_cgroup的CPU使用时间 - cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cpu.stat | awk '{print $2}') - cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cpu.stat | awk '{print $2}') + # @测试步骤:7: 获取两个sub_cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD0"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD1"/cpu.stat | awk '{print $2}') msg "cpu usage usec1: $cpu_usage_usec1" msg "cpu usage usec2: $cpu_usage_usec2" - kill -9 $task_pid1 - kill -9 $task_pid2 # @预期结果:1: 验证CPU使用时间比例是否符合预期,4:1 usage_ratio=$(echo "scale=2; $cpu_usage_usec1 / $cpu_usage_usec2 + 0.5" | bc) usage_ratio=$(printf "%.0f" "$usage_ratio") msg "usage_ratio: $usage_ratio" - - expected_ratio=$(echo "2048 / 512" | bc) - msg "expected_ratio: $expected_ratio" - - assert_true [ "$(echo "$usage_ratio == $expected_ratio" | bc)" -eq 1 ] + assert_true [ "$usage_ratio" -eq 4 ] return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid1" "$task_pid2" + sleep 1 # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" index 1d523dd..66a8f11 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-002.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240804-174805-982987650 # @用例名称: cgroup-v2-cpu-weight-002 -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v2 cpu weight -# @用例类型: 测试cpu.weight接口文件,不设置权重 +# @用例类型: 测试cpu.weight接口文件,测试层次结构 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,9 +20,11 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -PARENT_CGROUP="cgroup-v2-cpu-weight-002" -SUB_CGROUP1="cgroup-v2-cpu-weight-002/sub_cgroup01" -SUB_CGROUP2="cgroup-v2-cpu-weight-002/sub_cgroup02" +CGROUP="cgroup-v2-cpu-weight-002" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" +CHILD10="$CHILD1/child0" +CHILD11="$CHILD1/child1" tc_setup() { msg "this is tc_setup" @@ -32,61 +34,112 @@ tc_setup() { fi # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control - echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 - taskset 0x1 sh -c 'while true; do :; done' & - task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cgroup.procs + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + echo "+cpu" >"$CGROUP_TOPDIR"/$CHILD1/cgroup.subtree_control || return 1 + mkdir "$CGROUP_TOPDIR"/$CHILD10 + mkdir "$CGROUP_TOPDIR"/$CHILD11 - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:5: 对不同的cgroup设置不同的cpu.weight值 + echo 2048 >"$CGROUP_TOPDIR"/$CHILD0/cpu.weight + echo 2048 >"$CGROUP_TOPDIR"/$CHILD1/cpu.weight + echo 1000 >"$CGROUP_TOPDIR"/$CHILD10/cpu.weight + echo 1000 >"$CGROUP_TOPDIR"/$CHILD11/cpu.weight + + # @测试步骤:6: 启动三个占用CPU的进程,并将其放入不同的cgroup,保证三个进程在同一个CPU核心上运行 + { + while true; do :; done + } & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/"$CHILD0"/cgroup.procs + { + while true; do :; done + } & task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cgroup.procs + echo $task_pid2 >"$CGROUP_TOPDIR"/"$CHILD10"/cgroup.procs + { + while true; do :; done + } & + task_pid3=$! + echo $task_pid3 >"$CGROUP_TOPDIR"/"$CHILD11"/cgroup.procs - sleep 3 + sleep 5 - # @测试步骤:2: 获取两个cgroup的CPU使用时间 - cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cpu.stat | awk '{print $2}') - cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cpu.stat | awk '{print $2}') + # @测试步骤:7: 获取三个cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD0"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD10"/cpu.stat | awk '{print $2}') + cpu_usage_usec3=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD11"/cpu.stat | awk '{print $2}') msg "cpu usage usec1: $cpu_usage_usec1" msg "cpu usage usec2: $cpu_usage_usec2" - kill -9 $task_pid1 - kill -9 $task_pid2 - - # @预期结果:1: 验证CPU使用时间比例是否符合预期,不为4:1 - usage_ratio=$(echo "scale=2; $cpu_usage_usec1 / $cpu_usage_usec2 + 0.5" | bc) - usage_ratio=$(printf "%.0f" "$usage_ratio") - msg "usage_ratio: $usage_ratio" + msg "cpu usage usec3: $cpu_usage_usec3" - unexpected_ratio=$(echo "2048 / 512" | bc) - msg "expected_ratio: $unexpected_ratio" - - assert_true [ "$(echo "$usage_ratio != $unexpected_ratio" | bc)" -eq 1 ] + # @预期结果:1: 验证CPU使用时间比例是否符合预期,即2:1:1 + usage_ratio0=$(echo "scale=2; $cpu_usage_usec1 / $cpu_usage_usec2" | bc) + usage_ratio0=$(printf "%.0f" "$usage_ratio0") + msg "usage_ratio0: $usage_ratio0" + assert_true [ "$usage_ratio0" -eq 2 ] + usage_ratio1=$(echo "scale=2; $cpu_usage_usec2 / $cpu_usage_usec3" | bc) + msg "usage_ratio1: $usage_ratio1" + usage_ratio1=$(printf "%.0f" "$usage_ratio1") + msg "usage_ratio1: $usage_ratio1" + assert_true [ "$usage_ratio1" -eq 1 ] return 0 } - tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid1" "$task_pid2" "$task_pid3" + sleep 1 # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + rmdir "$CGROUP_TOPDIR"/$CHILD10 + rmdir "$CGROUP_TOPDIR"/$CHILD11 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" index 53e7f02..6daac0b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-001.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240804-175245-433198185 # @用例名称: cgroup-v2-cpu-weight-nice-001 -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v2 cpu weight nice -# @用例类型: 测试cpu.weight.nice接口文件,设置了优先级 +# @用例类型: 测试cpu.weight.nice接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -20,57 +20,86 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### -PARENT_CGROUP="cgroup-v2-cpu-weight-nice-001" -SUB_CGROUP1="cgroup-v2-cpu-weight-nice-001/sub_cgroup01" -SUB_CGROUP2="cgroup-v2-cpu-weight-nice-001/sub_cgroup02" - +CGROUP="cgroup-v2-cpu-weight-nice-001" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 + mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpu控制器 if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpu控制器" fi # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) return 0 } do_test() { - msg "this is do_test" - # @测试步骤:1: 对不同的cgroup设置不同的cpu.weight.nice值 - echo 10 >"$CGROUP_TOPDIR"/$SUB_CGROUP1/cpu.weight.nice - echo 0 >"$CGROUP_TOPDIR"/$SUB_CGROUP2/cpu.weight.nice + msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" - # @测试步骤:2: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 - taskset 0x1 sh -c 'while true; do :; done' & - task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cgroup.procs + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 - taskset 0x1 sh -c 'while true; do :; done' & + # @测试步骤:5: 对不同的cgroup设置不同的cpu.weight.nice值 + echo 10 >"$CGROUP_TOPDIR"/$CHILD0/cpu.weight.nice + echo 0 >"$CGROUP_TOPDIR"/$CHILD1/cpu.weight.nice + + # @测试步骤:6: 启动两个占用CPU的进程,并将其放入不同的cgroup,保证两个进程在同一个CPU核心上运行 + { + while true; do :; done + } & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/"$CHILD0"/cgroup.procs + { + while true; do :; done + } & task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cgroup.procs + echo $task_pid2 >"$CGROUP_TOPDIR"/"$CHILD1"/cgroup.procs sleep 3 - # @测试步骤:3: 获取两个cgroup的CPU使用时间 - cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP1"/cpu.stat | awk '{print $2}') - cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$SUB_CGROUP2"/cpu.stat | awk '{print $2}') + # @测试步骤:7: 获取两个cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD0"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD1"/cpu.stat | awk '{print $2}') msg "cpu usage usec1: $cpu_usage_usec1" msg "cpu usage usec2: $cpu_usage_usec2" - kill -9 $task_pid1 - kill -9 $task_pid2 # @预期结果:1: 验证CPU使用时间比例是否符合预期,cgroup1小于cgroup2 assert_true [ "$cpu_usage_usec1" -lt "$cpu_usage_usec2" ] @@ -80,10 +109,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid1" "$task_pid2" + sleep 1 # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-002.sh" new file mode 100755 index 0000000..110d826 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-weight-nice-002.sh" @@ -0,0 +1,141 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240810-103238-037013530 +# @用例名称: cgroup-v2-cpu-weight-nice-002 +# @用例级别: 2 +# @用例标签: cgroup-v2 cpu weight nice +# @用例类型: 测试cpu.weight.nice接口文件, 测试层次结构 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-cpu-weight-nice-001" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" +CHILD10="$CHILD1/child0" +CHILD11="$CHILD1/child1" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + # @预置条件: 检查当前cgroup是否能启用cpu控制器 + if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用cpu控制器" + fi + # @预置条件: 启用cpu控制器 + echo "+cpu" >"$CGROUP_TOPDIR"/cgroup.subtree_control + echo "+cpu" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + echo "+cpu" >"$CGROUP_TOPDIR"/$CHILD1/cgroup.subtree_control || return 1 + mkdir "$CGROUP_TOPDIR"/$CHILD10 + mkdir "$CGROUP_TOPDIR"/$CHILD11 + + # @测试步骤:5: 对不同的cgroup设置不同的cpu.weight.nice值 + echo 10 >"$CGROUP_TOPDIR"/$CHILD0/cpu.weight.nice + echo 0 >"$CGROUP_TOPDIR"/$CHILD1/cpu.weight.nice + echo 10 >"$CGROUP_TOPDIR"/$CHILD10/cpu.weight.nice + echo 0 >"$CGROUP_TOPDIR"/$CHILD11/cpu.weight.nice + + # @测试步骤:6: 启动三个占用CPU的进程,并将其放入不同的cgroup,保证三个进程在同一个CPU核心上运行 + { + while true; do :; done + } & + task_pid1=$! + echo $task_pid1 >"$CGROUP_TOPDIR"/"$CHILD0"/cgroup.procs + { + while true; do :; done + } & + task_pid2=$! + echo $task_pid2 >"$CGROUP_TOPDIR"/"$CHILD10"/cgroup.procs + { + while true; do :; done + } & + task_pid3=$! + echo $task_pid3 >"$CGROUP_TOPDIR"/"$CHILD11"/cgroup.procs + sleep 5 + + # @测试步骤:7: 获取三个cgroup的CPU使用时间 + cpu_usage_usec1=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD0"/cpu.stat | awk '{print $2}') + cpu_usage_usec2=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD10"/cpu.stat | awk '{print $2}') + cpu_usage_usec3=$(grep usage_usec "$CGROUP_TOPDIR"/"$CHILD11"/cpu.stat | awk '{print $2}') + msg "cpu usage usec1: $cpu_usage_usec1" + msg "cpu usage usec2: $cpu_usage_usec2" + msg "cpu usage usec3: $cpu_usage_usec3" + + # @预期结果:1: 验证CPU使用时间比例是否符合预期,CHILD0小于CHILD1,CHILD10小于CHILD11 + total_cpu_usage_usec=$((cpu_usage_usec2 + cpu_usage_usec3)) + assert_true [ "$cpu_usage_usec1" -lt "$total_cpu_usage_usec" ] + assert_true [ "$cpu_usage_usec2" -lt "$cpu_usage_usec3" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid1" "$task_pid2" "$task_pid3" + sleep 1 + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD10 + rmdir "$CGROUP_TOPDIR"/$CHILD11 + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" index d53922e..e4a14b8 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus-partition.sh" @@ -29,54 +29,82 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP - mkdir "$CGROUP_TOPDIR"/$CHILD0 - mkdir "$CGROUP_TOPDIR"/$CHILD1 # @预置条件: 检查当前cgroup是否能启用cpuset控制器 if ! check_string_in_file "cpuset" "$CGROUP_TOPDIR/cgroup.controllers"; then skip_test "当前cgroup不能启用cpuset控制器" fi # @预置条件: 启用cpuset控制器 - echo "+cpuset" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+cpuset" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 - + echo "+cpuset" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+cpuset" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + if [ "$for_cpu_nums" -le 2 ]; then + skip_test "当前系统cpu小于等于两个" + fi + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置CGROUP的cpuset.cpus为0-1 - echo "0-1" > "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的两个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + second_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 2))" '{print $col}') + msg "second_online_cpu: $second_online_cpu" + if [ -z "$first_online_cpu" ] || [ -z "$second_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu-$second_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi - # @测试步骤:2: 设置CGROUP为partition root - echo "root" > "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + # @测试步骤:3: 设置CGROUP为partition root + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition + + # @测试步骤:4: 创建子cgroup + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 - # @预期结果:1: 查看CGROUP/CHILD0/CHILD1的cpuset.cpus.effevtive是否为0-1 + # @预期结果:1: 查看CGROUP/CHILD0/CHILD1的cpuset.cpus.effevtive是否为online_cpu cgroup_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective) - assert_true [ "$cgroup_cpuset_cpus_effective" = "0-1" ] + assert_true [ "$cgroup_cpuset_cpus_effective" = "$first_online_cpu-$second_online_cpu" ] child0_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.effective) - assert_true [ "$child0_cpuset_cpus_effective" = "0-1" ] + assert_true [ "$child0_cpuset_cpus_effective" = "$first_online_cpu-$second_online_cpu" ] child1_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD1/cpuset.cpus.effective) - assert_true [ "$child1_cpuset_cpus_effective" = "0-1" ] + assert_true [ "$child1_cpuset_cpus_effective" = "$first_online_cpu-$second_online_cpu" ] - # @测试步骤:3: 设置CHILD0的cpuset.cpus为0 - echo "0" > "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus + # @测试步骤:5: 设置CHILD0的cpuset.cpus为first_online_cpu + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus - # @测试步骤:4: 设置CHILD0为partition root - echo "root" > "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.partition + # @测试步骤:6: 设置CHILD0为partition root + echo "root" >"$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.partition - # @预期结果:2: 查看CHILD0的cpuset.cpus.effevtive是否为0 + # @预期结果:2: 查看CHILD0的cpuset.cpus.effevtive是否为first_online_cpu child0_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD0/cpuset.cpus.effective) - assert_true [ "$child0_cpuset_cpus_effective" = "0" ] + assert_true [ "$child0_cpuset_cpus_effective" = "$first_online_cpu" ] - # @预期结果:3: 查看CGROUP/CHILD1的cpuset.cpus.effevtive是否去除了cpu0 + # @预期结果:3: 查看CGROUP/CHILD1的cpuset.cpus.effevtive是否去除了first_online_cpu cgroup_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective) - assert_true [ "$cgroup_cpuset_cpus_effective" = "1" ] + assert_true [ "$cgroup_cpuset_cpus_effective" = "$second_online_cpu" ] child1_cpuset_cpus_effective=$(cat "$CGROUP_TOPDIR"/$CHILD1/cpuset.cpus.effective) - assert_true [ "$child1_cpuset_cpus_effective" = "1" ] + assert_true [ "$child1_cpuset_cpus_effective" = "$second_online_cpu" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" index ea60701..4d81c76 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-cpus.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v2-cpuset-cpus # @用例级别: 1 # @用例标签: cgroup-v2 cpuset cpus -# @用例类型: 测试cpuset.cpus接口文件 +# @用例类型: 测试cpuset.cpus和cpuset.cpus.effetive接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -28,8 +28,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpuset控制器 @@ -37,54 +37,70 @@ tc_setup() { skip_test "当前cgroup不能启用cpuset控制器" fi # @预置条件: 启用cpuset控制器 - echo "+cpuset" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+cpuset" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + # @预置条件: 获取系统cpu的数量 + cpu_nums=$(grep -c ^processor /proc/cpuinfo) + msg "cpu_nums: $cpu_nums" + for_cpu_nums=$((cpu_nums - 2)) + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置cpuset.cpus为1 - echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus + # @测试步骤:1: 获取cpu online list + file_path="$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective + cpu_online_list=$(get_online_cpu_list "$file_path") + msg "cpu_online_list: $cpu_online_list" + + # @测试步骤:2: 获取没被独占的一个在线cpu + ret=-1 + for i in $(seq 0 "$for_cpu_nums"); do + first_online_cpu=$(echo "$cpu_online_list" | awk -v col="$((i + 1))" '{print $col}') + msg "first_online_cpu: $first_online_cpu" + if [ -z "$first_online_cpu" ]; then + skip_test "没有足够的在线cpu" + fi + + echo "$first_online_cpu" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus && ret=0 && break + done + if [ $ret -ne 0 ]; then + skip_test "没有可独占的CPU" + fi + + # @测试步骤:3: 独占该CPU + echo "root" >"$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.partition - # @预期结果:1: 验证CGROUP的可用cpu是否为1 + # @预期结果:1: 验证CGROUP的可用cpu是否为first_online_cpu online_cpus=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.cpus.effective) - assert_true [ "$online_cpus" -eq 1 ] + assert_true [ "$online_cpus" -eq "$first_online_cpu" ] - # @测试步骤:2: 启动一个进程并将其放入CGROUP + # @测试步骤:4: 启动一个进程并将其放入CGROUP { - while true; do - : - done + while true; do :; done } & task_pid=$! - echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - sleep 1 + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 2 # @预期结果:2: 验证进程是否绑定了指定的cpu cpus_allowed=$(cat /proc/$task_pid/status | grep "Cpus_allowed_list" | awk '{print $2}') - assert_true [ "$cpus_allowed" = "1" ] - - # @测试步骤:3: 获取cpu1的使用情况 - total_cpu1_usage=0 - for _ in $(seq 1 5); do - top -b -n 1 1 > "$TMP_FILE" - cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') - total_cpu1_usage=$(echo "$total_cpu1_usage + $cpu1_user_time" | bc) - sleep 1 - done - aver_cpu1_usage=$(echo "scale=2; $total_cpu1_usage / 5" | bc) - msg "aver_cpu_usage: $aver_cpu1_usage" - kill -9 $task_pid + assert_true [ "$cpus_allowed" = "$first_online_cpu" ] + + # @测试步骤:5: 通过mpstat获取first_online_cpu的使用情况(3s) + cpu0_user_time=$(mpstat -P "$first_online_cpu" 1 3 | grep Average | awk 'NR==2 {print $3}') + msg "cpu0_user_time: $cpu0_user_time" - # @预期结果:3: 在误差允许范围内,cpu1的使用率应该为100% - assert_true [ "$(echo "$aver_cpu1_usage > 90.0" | bc)" -eq 1 ] + # @预期结果:3: 验证CPU的使用率大于80% + assert_true [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @删除临时文件: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" index e3bda8c..9a590e9 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpuset-mems.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v2-cpuset-mems # @用例级别: 1 # @用例标签: cgroup-v2 cpuset mems -# @用例类型: 测试cpuset.mems接口文件 +# @用例类型: 测试cpuset.mems和cpuset.mems.effetive接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -45,7 +45,7 @@ tc_setup() { if ! is_numastat_installed; then skip_test "numastat 未安装, 请先安装numastat" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用cpuset控制器 @@ -53,15 +53,15 @@ tc_setup() { skip_test "当前cgroup不能启用cpuset控制器" fi # @预置条件: 启用cpuset控制器 - echo "+cpuset" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+cpuset" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置cpuset.mems - echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cpuset.mems + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cpuset.mems # @预期结果:1: 验证CGROUP的可用内存节点是否为1 online_mems=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpuset.mems.effective) @@ -69,12 +69,10 @@ do_test() { # @测试步骤:2: 启动一个进程并将其放入CGROUP { - while true; do - : - done + while true; do :; done } & task_pid=$! - echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 1 # @预期结果:2: 验证进程是否绑定了指定的内存节点 @@ -83,7 +81,6 @@ do_test() { # @测试步骤:3: 获取指定内存节点上进程的内存使用情况 mems_usage_in_numa1=$(numastat -p $task_pid | awk 'END{print $3}') - kill -9 $task_pid msg "mems_usage_in_numa1: $mems_usage_in_numa1" # @预期结果:3: mems_usage_in_numa1大于0 @@ -94,6 +91,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清空后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" index 2653b1b..8a2d0d1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-001.sh" @@ -28,7 +28,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP @@ -40,7 +40,7 @@ do_test() { # @测试步骤:1: 运行一个进程 { while true; do - :; + : done } & task_pid=$! @@ -54,6 +54,7 @@ do_test() { # @测试步骤:3: 冻结CGROUP的进程 echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + sleep 1 # @测试步骤:4: 查看CGROUP的cgorup.event中的frozen字段 frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') @@ -63,12 +64,12 @@ do_test() { # @测试步骤:5: 解冻CGROUP的进程 echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + sleep 1 # @测试步骤:6: 查看CGROUP的cgorup.event中的frozen字段 frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') # @预期结果:3: frozen字段为0 - kill -9 $task_pid assert_true [ "$frozen" -eq 0 ] return 0 @@ -76,6 +77,9 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" index 263f7a6..b6036a4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240809-230001-993472792 # @用例名称: cgroup-v2-freeze-002 # @用例级别: 1 -# @用例标签: cgroup-v2 freeze +# @用例标签: cgroup-v2 freeze # @用例类型: 测试cgroup.freeze接口文件, 测试cgroup的层次结构 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -21,10 +21,10 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### # CGROUP -# / | \ +# / | \ # CHILD0 CHILD1 CHILD2 # / \ | -# CHILD00 CHILD01 CHILD10 +# CHILD00 CHILD01 CHILD10 # | # CHILD100 # | @@ -45,7 +45,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -64,27 +64,21 @@ do_test() { msg "this is do_test" # @测试步骤:1: 在CHILD01上运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid0=$! echo $task_pid0 >"$CGROUP_TOPDIR"/$CHILD01/cgroup.procs # @测试步骤:2: 在CHILD1000上运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid1=$! echo $task_pid1 >"$CGROUP_TOPDIR"/$CHILD1000/cgroup.procs # @测试步骤:3: 在CHILD2上运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid2=$! echo $task_pid2 >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs @@ -104,43 +98,45 @@ do_test() { frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') assert_true [ "$frozen" -eq 0 ] - # @测试步骤:7: 冻结CGROUP + # # @测试步骤:7: 冻结CGROUP echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze - # @预期结果:2: CGROUP, CHILD0, CHILD1的cgroup.event中的frozen字段为1 + # # @预期结果:2: CGROUP, CHILD0, CHILD1的cgroup.event中的frozen字段为1 frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') assert_true [ "$frozen" -eq 1 ] - frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') - assert_true [ "$frozen" -eq 1 ] - frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') - assert_true [ "$frozen" -eq 1 ] - - # @测试步骤:8: 解冻CHILD0, CHILD10, CHILD100 - echo 0 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.freeze - echo 0 >"$CGROUP_TOPDIR"/$CHILD10/cgroup.freeze - echo 0 >"$CGROUP_TOPDIR"/$CHILD100/cgroup.freeze - - # @预期结果:3: CHILD00, CHILD1000的cgroup.event中的frozen字段为1 - frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') - assert_true [ "$frozen" -eq 1 ] - frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1000/cgroup.events | awk '{print $2}') - assert_true [ "$frozen" -eq 1 ] - - # @测试步骤:9: 解冻CGROUP - echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze - - # @预期结果:4: CHILD00, CHILD2的cgroup.event中的frozen字段为0 - kill -9 $task_pid0 $task_pid1 $task_pid2 - frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') - assert_true [ "$frozen" -eq 0 ] - frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD2/cgroup.events | awk '{print $2}') - assert_true [ "$frozen" -eq 0 ] + # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + # assert_true [ "$frozen" -eq 1 ] + # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') + # assert_true [ "$frozen" -eq 1 ] + + # # @测试步骤:8: 解冻CHILD0, CHILD10, CHILD100 + # echo 0 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.freeze + # echo 0 >"$CGROUP_TOPDIR"/$CHILD10/cgroup.freeze + # echo 0 >"$CGROUP_TOPDIR"/$CHILD100/cgroup.freeze + + # # @预期结果:3: CHILD00, CHILD1000的cgroup.event中的frozen字段为1 + # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + # assert_true [ "$frozen" -eq 1 ] + # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1000/cgroup.events | awk '{print $2}') + # assert_true [ "$frozen" -eq 1 ] + + # # @测试步骤:9: 解冻CGROUP + # echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # # @预期结果:4: CHILD00, CHILD2的cgroup.event中的frozen字段为0 + # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + # assert_true [ "$frozen" -eq 0 ] + # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD2/cgroup.events | awk '{print $2}') + # assert_true [ "$frozen" -eq 0 ] return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid0" "$task_pid1" "$task_pid2" + sleep 1 # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD1000 rmdir "$CGROUP_TOPDIR"/$CHILD100 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" index 1ce1499..4134fb1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-003.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240809-232855-348990156 # @用例名称: cgroup-v2-freeze-003 # @用例级别: 2 -# @用例标签: cgroup-v2 freeze +# @用例标签: cgroup-v2 freeze # @用例类型: 测试cgroup.freeze接口文件, 测试cgroup的层次结构 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -29,7 +29,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP @@ -46,15 +46,12 @@ do_test() { # @测试步骤:3: 在CHILD0中运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid=$! echo $task_pid >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs # @预期结果:1: CHILD0, CGROUP的cgorup.event中的frozen字段为1 - kill -9 $task_pid frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') assert_true [ "$frozen" -eq 1 ] frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') @@ -65,6 +62,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD0 rmdir "$CGROUP_TOPDIR"/$CGROUP diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" index cc1106d..8ab0384 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-004.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240809-233224-494284037 # @用例名称: cgroup-v2-freeze-004 # @用例级别: 2 -# @用例标签: cgroup-v2 freeze +# @用例标签: cgroup-v2 freeze # @用例类型: 测试cgroup.freeze接口文件, 测试cgroup的层次结构 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -30,7 +30,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" index fdf8a36..0e41447 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-005.sh" @@ -3,7 +3,7 @@ # @用例ID: 20240809-233752-330450571 # @用例名称: cgroup-v2-freeze-005 # @用例级别: 2 -# @用例标签: cgroup-v2 freeze +# @用例标签: cgroup-v2 freeze # @用例类型: 测试cgroup.freeze接口文件, 测试迁移的情况 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { @@ -30,7 +30,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP0 mkdir "$CGROUP_TOPDIR"/$CGROUP1 @@ -42,9 +42,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 在CGROUP0中运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid=$! echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP0/cgroup.procs @@ -77,7 +75,6 @@ do_test() { echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP1/cgroup.procs # @预期结果:3: CGROUP1的cgorup.event中的frozen字段为1,CGROUP0的frozen字段为1 - kill -9 $task_pid frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP1/cgroup.events | awk '{print $2}') assert_true [ "$frozen" -eq 1 ] frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP0/cgroup.events | awk '{print $2}') @@ -88,6 +85,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP0 rmdir "$CGROUP_TOPDIR"/$CGROUP1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" index cd0fb5b..979512f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-001.sh" @@ -27,8 +27,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -36,8 +36,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -47,13 +47,13 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为2MB if [ "$hugepage_size_mb" -ne 2 ]; then skip_test "hugepage大小不等于2MB" @@ -65,20 +65,19 @@ do_test() { # @测试步骤:6: 获取CGROUP的hugetlb.2MB.max值 max=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max) - + # @预期结果:1: 验证hugetlb.2MB.max的值是否为max assert_true [ "$max" = "max" ] # @测试步骤:7: 设置CGROUP的hugetlb.2MB.max为2MB - echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max + echo 2M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max # @测试步骤:8: 分配2个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 2 "$hugepage_size_mb" &> /dev/null - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 2 "$hugepage_size_mb" &>/dev/null + # @测试步骤:9: 获取hugetlb.2MB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events | awk '{print $2}') # @预期结果:2: max_cnt大于0 assert_true [ "$max_cnt" -gt 0 ] @@ -88,11 +87,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" index abf057e..11fb1f7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-002.sh" @@ -28,8 +28,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -37,8 +37,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -48,7 +48,7 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage的数量 - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') @@ -65,19 +65,19 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:6: 设置CGROUP的hugetlb.2MB.max为2MB - echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max + echo 2M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.max # @测试步骤:7: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &> /dev/null & - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &>/dev/null & + # @测试步骤:8: 获取hugetlb.2MB.current total_hugepage_current=0 for _ in $(seq 1 5); do current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.current) current=$(echo "$current / 1024 / 1024" | bc) total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) - sleep 1 + sleep 1 done aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) msg "aver_hugepage_current: $aver_hugepage_current" @@ -88,8 +88,7 @@ do_test() { assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] # @测试步骤:9: 获取hugetlb.2MB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events | awk '{print $2}') # @预期结果:2: max_cnt等于0 assert_true [ "$max_cnt" -eq 0 ] @@ -99,11 +98,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" index 7dec5ab..3a4e2ce 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-003.sh" @@ -27,8 +27,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -36,8 +36,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -47,13 +47,13 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为1GB if [ "$hugepage_size_mb" -ne 1024 ]; then skip_test "hugepage大小不等于2MB" @@ -70,15 +70,14 @@ do_test() { assert_true [ "$max" = "max" ] # @测试步骤:7: 设置CGROUP的hugetlb.1GB.max为512MB - echo 512M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max + echo 512M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max # @测试步骤:8: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &> /dev/null - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &>/dev/null + # @测试步骤:9: 获取hugetlb.1GB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events | awk '{print $2}') # @预期结果:2: max_cnt大于0 assert_true [ "$max_cnt" -gt 0 ] @@ -88,11 +87,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" index 83b2cd9..14bb4a3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-max-004.sh" @@ -28,8 +28,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -37,8 +37,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -48,13 +48,13 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为1GB if [ "$hugepage_size_mb" -ne 1024 ]; then skip_test "hugepage大小不等于2MB" @@ -65,19 +65,19 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:6: 设置CGROUP的hugetlb.1GB.max为1GB - echo 1024M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max + echo 1024M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.max # @测试步骤:7: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &> /dev/null & - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &>/dev/null & + # @测试步骤:8: 获取hugetlb.1GB.current total_hugepage_current=0 for _ in $(seq 1 5); do current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.current) current=$(echo "$current / 1024 / 1024" | bc) total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) - sleep 1 + sleep 1 done aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) msg "aver_hugepage_current: $aver_hugepage_current" @@ -89,8 +89,7 @@ do_test() { assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] # @测试步骤:9: 获取hugetlb.1GB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events | awk '{print $2}') # @预期结果:2: max_cnt等于0 assert_true [ "$max_cnt" -eq 0 ] @@ -100,11 +99,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" index 8e825c8..b10faee 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-001.sh" @@ -27,8 +27,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -36,8 +36,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -47,13 +47,13 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为2MB if [ "$hugepage_size_mb" -ne 2 ]; then skip_test "hugepage大小不等于2MB" @@ -65,20 +65,19 @@ do_test() { # @测试步骤:6: 获取CGROUP的hugetlb.2MB.rsvd.max值 max=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max) - + # @预期结果:1: 验证hugetlb.2MB.rsvd.max的值是否为max assert_true [ "$max" = "max" ] # @测试步骤:7: 设置CGROUP的hugetlb.2MB.rsvd.max为2MB - echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max + echo 2M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max # @测试步骤:8: 分配2个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 2 "$hugepage_size_mb" &> /dev/null - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 2 "$hugepage_size_mb" &>/dev/null + # @测试步骤:9: 获取hugetlb.2MB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events | awk '{print $2}') # @预期结果:2: max_cnt大于0 assert_true [ "$max_cnt" -gt 0 ] @@ -88,11 +87,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" index ed95f09..ae575d7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-002.sh" @@ -23,14 +23,13 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 CGROUP="cgroup-v2-hugetlb-rsvd-max-002" TOLERANCE=0.3 - tc_setup() { msg "this is tc_setup" # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -38,8 +37,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -49,13 +48,13 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 4 > /proc/sys/vm/nr_hugepages + echo 4 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为2MB if [ "$hugepage_size_mb" -ne 2 ]; then skip_test "hugepage大小不等于2MB" @@ -66,19 +65,19 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:6: 设置CGROUP的hugetlb.2MB.rsvd.max为2MB - echo 2M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max + echo 2M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.max # @测试步骤:7: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &> /dev/null & - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd 1 "$hugepage_size_mb" &>/dev/null & + # @测试步骤:8: 获取hugetlb.2MB.rsvd.current total_hugepage_current=0 for _ in $(seq 1 5); do current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.rsvd.current) current=$(echo "$current / 1024 / 1024" | bc) total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) - sleep 1 + sleep 1 done aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) msg "aver_hugepage_current: $aver_hugepage_current" @@ -89,8 +88,7 @@ do_test() { assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] # @测试步骤:9: 获取hugetlb.2MB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.2MB.events | awk '{print $2}') # @预期结果:2: max_cnt等于0 assert_true [ "$max_cnt" -eq 0 ] @@ -100,11 +98,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" index 61ca77e..1723b50 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-003.sh" @@ -27,8 +27,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -36,24 +36,24 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } do_test() { - msg "this is do_test" + msg "this is do_test" # @测试步骤:1: 获取系统hugepage数量 hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为1GB if [ "$hugepage_size_mb" -ne 1024 ]; then skip_test "hugepage大小不等于2MB" @@ -70,15 +70,14 @@ do_test() { assert_true [ "$max" = "max" ] # @测试步骤:7: 设置CGROUP的hugetlb.1GB.rsvd.max为512MB - echo 512M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max + echo 512M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max # @测试步骤:8: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &> /dev/null - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &>/dev/null + # @测试步骤:9: 获取hugetlb.1GBB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events | awk '{print $2}') # @预期结果:2: max_cnt大于0 assert_true [ "$max_cnt" -gt 0 ] @@ -88,11 +87,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" index f846a3d..4f5f891 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-hugetlb-rsvd-max-004.sh" @@ -28,8 +28,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用hugetlb控制器 @@ -37,8 +37,8 @@ tc_setup() { skip_test "当前cgroup不能启用hugetlb控制器" fi # @预置条件: 启用hugetlb控制器 - echo "+hugetlb" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+hugetlb" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -48,13 +48,13 @@ do_test() { hugepage_size=$(cat /proc/sys/vm/nr_hugepages) # @测试步骤:2: 修改系统hugepage数量 - echo 1 > /proc/sys/vm/nr_hugepages + echo 1 >/proc/sys/vm/nr_hugepages # @测试步骤:3: 获取hugepage大小 hugepage_size_kb=$(grep Hugepagesize /proc/meminfo | awk '{print $2}') msg "hugepage size: $hugepage_size_kb" hugepage_size_mb=$(conv_unit -o M -i K "$hugepage_size_kb") - + # @测试步骤:4: 验证hugepage大小是否为1GB if [ "$hugepage_size_mb" -ne 1024 ]; then skip_test "hugepage大小不等于2MB" @@ -65,19 +65,19 @@ do_test() { mount none /mnt/huge -t hugetlbfs # @测试步骤:6: 设置CGROUP的hugetlb.1GB.rsvd.max为1GB - echo 1024M > "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max + echo 1024M >"$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.max # @测试步骤:7: 分配1个hugepage - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &> /dev/null & - + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "${TST_TS_TOPDIR}"/tst_lib/cgroup_util/bin/alloc_hugepage 1 "$hugepage_size_mb" &>/dev/null & + # @测试步骤:8: 获取hugetlb.1GB.rsvd.current total_hugepage_current=0 for _ in $(seq 1 5); do current=$(cat "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.rsvd.current) current=$(echo "$current / 1024 / 1024" | bc) total_hugepage_current=$(echo "$total_hugepage_current + $current" | bc) - sleep 1 + sleep 1 done aver_hugepage_current=$(echo "$total_hugepage_current / 5" | bc) msg "aver_hugepage_current: $aver_hugepage_current" @@ -89,8 +89,7 @@ do_test() { assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] # @测试步骤:9: 获取hugetlb.1GB.events的max字段 - max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events| awk '{print $2}') - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/hugetlb.1GB.events | awk '{print $2}') # @预期结果:2: max_cnt等于0 assert_true [ "$max_cnt" -eq 0 ] @@ -100,11 +99,13 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 卸载hugetlbfs umount /mnt/huge rmdir /mnt/huge # @清理工作: 恢复系统本来的hugepage的大小 - echo "$hugepage_size" > /proc/sys/vm/nr_hugepages + echo "$hugepage_size" >/proc/sys/vm/nr_hugepages # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" index 946fae9..2d5e09f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" @@ -41,7 +41,7 @@ tc_setup() { skip_test "当前cgroup不能启用io控制器" fi # @预置条件: 启用io控制器 - echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -64,15 +64,14 @@ do_test() { # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd iflag=direct if="$disk" of=/dev/null bs=1M count=5 &> "$TMP_FILE" - echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + dd iflag=direct if="$disk" of=/dev/null bs=1M count=3 &>"$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') msg "read_bps: $read_bps" up_read_bps=1.2 down_read_bps=0.8 - + # @预期结果:1: 如果读取速率在1MB/s左右,说明限速成功 if [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ]; then assert_true [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ] @@ -85,6 +84,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" index 2edb7dc..d9cea6d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" @@ -42,7 +42,7 @@ tc_setup() { skip_test "当前cgroup不能启用io控制器" fi # @预置条件: 启用io控制器 - echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -64,9 +64,8 @@ do_test() { echo "$device_number wbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动一个dd进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=5 oflag=direct &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=3 oflag=direct &>"$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') @@ -86,6 +85,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" index d525731..72fa28c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" @@ -41,7 +41,7 @@ tc_setup() { skip_test "当前cgroup不能启用io控制器" fi # @预置条件: 启用io控制器 - echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -63,9 +63,8 @@ do_test() { echo "$device_number riops=100" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动dd进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd iflag=direct if=$disk of=/dev/null bs=4K count=500 &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd iflag=direct if=$disk of=/dev/null bs=4K count=500 &>"$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" @@ -89,10 +88,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 - rm "$TMP_FILE" + rm "$TMP_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" index 7dcd60c..5082012 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" @@ -41,7 +41,7 @@ tc_setup() { skip_test "当前cgroup不能启用io控制器" fi # @预置条件: 启用io控制器 - echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -63,9 +63,8 @@ do_test() { echo "$device_number wiops=100" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动一个dd进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct &>"$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" @@ -89,10 +88,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 - rm "$TMP_FILE" + rm "$TMP_FILE" return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" index db94cd3..c8d6934 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" @@ -41,14 +41,17 @@ tc_setup() { skip_test "当前cgroup不能启用io控制器" fi # @预置条件: 启用io控制器 - echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 获取硬盘设备 + # @测试步骤:1: 启用cgroup.pressure + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.pressure + + # @测试步骤:2: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" disk="/dev/sda" @@ -59,20 +62,20 @@ do_test() { device_number="253:0" fi - # @测试步骤:2: 设置io.max,限制rbps为1MB/s + # @测试步骤:3: 设置io.max,限制rbps为1MB/s echo "$device_number rbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max - # @测试步骤:3: 注册触发器 - stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/io.pressure &> "$TMP_FILE" & + # @测试步骤:4: 注册触发器 + stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/io.pressure &>"$TMP_FILE" & - # @测试步骤:4: 启动两个dd进程 + # @测试步骤:5: 启动两个dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd iflag=direct if="$disk" of=/dev/null bs=1M count=5 + dd iflag=direct if="$disk" of=/dev/null bs=1M count=5 echo $$ >"$CGROUP_TOPDIR"/cgroup.procs - # @测试步骤:5: 读取io.pressure文件 + # @测试步骤:6: 读取io.pressure文件 io_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/io.pressure) - avg10=$(echo "$io_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') + avg10=$(echo "$io_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') msg "avg10: $avg10" # @预期结果:1: avg10值应该大于0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" index e2d86c1..04f2e9a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v2-io-weight # @用例级别: 1 # @用例标签: cgroup-v2 io weight -# @用例类型: 测试io.weight接口文件, +# @用例类型: 测试io.weight接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -49,8 +49,8 @@ tc_setup() { skip_test "当前cgroup不能启用io控制器" fi # @预置条件: 启用io控制器 - echo "+io" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+io" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+io" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 return 0 } @@ -68,27 +68,26 @@ do_test() { disk_device="253:0" fi - # @测试步骤:2: 设置io.cost.qos - echo "$disk_device enable=1 ctrl=auto" > "$CGROUP_TOPDIR"/io.cost.qos + # @测试步骤:2: 启用io.cost.qos + echo "$disk_device enable=1 ctrl=auto" >"$CGROUP_TOPDIR"/io.cost.qos # @测试步骤:3: 设置CHILD0\CHILD1\CHILD2的io.weight - echo "$disk_device 100" > "$CGROUP_TOPDIR/$CHILD0/io.weight" - echo "$disk_device 200" > "$CGROUP_TOPDIR/$CHILD1/io.weight" - echo "$disk_device 300" > "$CGROUP_TOPDIR/$CHILD2/io.weight" + echo "$disk_device 100" >"$CGROUP_TOPDIR/$CHILD0/io.weight" + echo "$disk_device 200" >"$CGROUP_TOPDIR/$CHILD1/io.weight" + echo "$disk_device 300" >"$CGROUP_TOPDIR/$CHILD2/io.weight" # @测试步骤:4: 启动dd进程 - echo $$ > "$CGROUP_TOPDIR/$CHILD0/cgroup.procs" - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &> "$TMP_FILE0" & + echo $$ >"$CGROUP_TOPDIR/$CHILD0/cgroup.procs" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &>"$TMP_FILE0" & task_pid=$! - echo $$ > "$CGROUP_TOPDIR/$CHILD1/cgroup.procs" - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &> "$TMP_FILE1" & + echo $$ >"$CGROUP_TOPDIR/$CHILD1/cgroup.procs" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &>"$TMP_FILE1" & - echo $$ > "$CGROUP_TOPDIR/$CHILD2/cgroup.procs" - dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &> "$TMP_FILE2" & + echo $$ >"$CGROUP_TOPDIR/$CHILD2/cgroup.procs" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=512 &>"$TMP_FILE2" & wait $task_pid - echo $$ > "$CGROUP_TOPDIR/cgroup.procs" # @测试步骤:5: 获取dd进程的读取速度 read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) @@ -99,9 +98,9 @@ do_test() { msg "read_speed3: $read_speed3" # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 - if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then + if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] - else + else assert_false [ true ] fi @@ -110,6 +109,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 关闭io.cost.qos + echo "$disk_device enable=0" >"$CGROUP_TOPDIR"/io.cost.qos + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR/cgroup.procs" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD0 rmdir "$CGROUP_TOPDIR"/$CHILD1 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" index bede827..ab6e588 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-001.sh" @@ -29,7 +29,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP @@ -40,9 +40,7 @@ do_test() { msg "this is do_test" # @测试步骤:1: 运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid=$! echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs @@ -54,7 +52,7 @@ do_test() { # @测试步骤:2: 写入cgroup.kill echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.kill - # @预期结果:2: CGROUP的cgroup.event中的populated字段为0 + # @预期结果:2: CGROUP的cgroup.event中的populated字段为0 populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') assert_true [ "$populated" -eq 0 ] @@ -63,7 +61,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - # @清理动作: 删除cgroup + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 + # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" index 9f311fe..7884786 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-kill-002.sh" @@ -21,10 +21,10 @@ source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### # CGROUP -# / | \ +# / | \ # CHILD0 CHILD1 CHILD2 # / \ | -# CHILD00 CHILD01 CHILD10 +# CHILD00 CHILD01 CHILD10 # | # CHILD100 # | @@ -46,7 +46,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -65,27 +65,21 @@ do_test() { msg "this is do_test" # @测试步骤:1: 在CHILD01上运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid0=$! echo $task_pid0 >"$CGROUP_TOPDIR"/$CHILD01/cgroup.procs # @测试步骤:2: 在CHILD1000上运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid1=$! echo $task_pid1 >"$CGROUP_TOPDIR"/$CHILD1000/cgroup.procs # @测试步骤:3: 在CHILD2上运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid2=$! echo $task_pid2 >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs @@ -102,7 +96,9 @@ do_test() { tc_teardown() { msg "this is tc_teardown" - # @清理动作: 删除cgroup + # @清理工作: 清理后台进程 + kill -9 "$task_pid0" "$task_pid1" "$task_pid2" + # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD1000 rmdir "$CGROUP_TOPDIR"/$CHILD100 rmdir "$CGROUP_TOPDIR"/$CHILD10 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-deep.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-deep.sh" new file mode 100755 index 0000000..3bd4580 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-deep.sh" @@ -0,0 +1,80 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240812-234221-157931352 +# @用例名称: cgroup-v2-max-deep +# @用例级别: 2 +# @用例标签: cgoup-v2 max deep +# @用例类型: 测试cgroup.max.deep接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-max-deep" +CHILD0="$CGROUP/child0" +CHILD00="$CHILD0/child0" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤:1: 读取CGROUP的cgroup.max.descendants + max_descendants=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.max.descendants) + + # @预期结果:1: cgroup.max.descendants的值为max + assert_true [ "$max_descendants" = "max" ] + + # @测试步骤:2: 启用CGROUP的cgrou.max.descendants为1 + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cgroup.max.descendants + + # @测试步骤:3: 创建一个子cgroup + ret=0 + mkdir "$CGROUP_TOPDIR"/$CHILD0 || ret=-1 + + # @预期结果:2: 创建成功 + assert_true [ $ret -eq 0 ] + + # @测试步骤:4: 再创建一个子cgroup + ret=0 + mkdir "$CGROUP_TOPDIR"/$CHILD00|| ret=-1 + + # @预期结果:3: 创建失败 + assert_true [ $ret -eq -1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-descendants.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-descendants.sh" new file mode 100755 index 0000000..aaefd37 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-max-descendants.sh" @@ -0,0 +1,79 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240812-232817-897631780 +# @用例名称: cgroup-v2-max-descendants +# @用例级别: 2 +# @用例标签: cgroup-v2 max descendants +# @用例类型: 测试cgroup.max.descendants接口文件 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-max-descendants" +CHILD0="$CGROUP/child0" +CHILD1="$CGROUP/child1" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 读取CGROUP的cgroup.max.descendants + max_descendants=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.max.descendants) + + # @预期结果:1: cgroup.max.descendants的值为max + assert_true [ "$max_descendants" = "max" ] + + # @测试步骤:2: 启用CGROUP的cgrou.max.descendants为1 + echo 1 > "$CGROUP_TOPDIR"/$CGROUP/cgroup.max.descendants + + # @测试步骤:3: 创建一个子cgroup + ret=0 + mkdir "$CGROUP_TOPDIR"/$CHILD0 || ret=-1 + + # @预期结果:2: 创建成功 + assert_true [ $ret -eq 0 ] + + # @测试步骤:4: 再创建一个子cgroup + ret=0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 || ret=-1 + + # @预期结果:3: 创建失败 + assert_true [ $ret -eq -1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" index c37309f..2376f8d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-current.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240806-235307-525430290 # @用例名称: cgroup-v2-memory-current -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v2 memory current # @用例类型: 测试memory.current接口文件,分配一些匿名内存和页缓存,查看memory.current的值 ############################################################################### @@ -36,7 +36,7 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -50,9 +50,9 @@ do_test() { assert_true [ "$memory_current" -eq 0 ] # @测试步骤:2: 分配50MB匿名内存 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & - sleep 2 + sleep 2 # @测试步骤:3: 读取memory.current的值 total_memory_current=0 @@ -65,16 +65,16 @@ do_test() { aver_memory_current=$(echo "$total_memory_current / 8" | bc) msg "memory.current: $aver_memory_current MB" sleep 3 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @预期结果:2: 在误差范围内,memory.current的值为50MB TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) diff=$((aver_memory_current - 50)) abs_diff=${diff#-} - assert_true [ "$abs_diff" -le "$TOLERANCE" ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] # @测试步骤:4: 分配50MB页缓存 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & sleep 2 @@ -89,13 +89,13 @@ do_test() { aver_memory_current=$(echo "$total_memory_current / 8" | bc) msg "memory.current: $aver_memory_current MB" sleep 3 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @预期结果:3: 在误差范围内,memory.current的值为50MB TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) diff=$((aver_memory_current - 50)) abs_diff=${diff#-} - assert_true [ "$abs_diff" -le "$TOLERANCE" ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" index 78a1c79..e0f3128 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" @@ -36,7 +36,7 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -50,28 +50,28 @@ do_test() { assert_true [ "$memory_high" = "max" ] # @测试步骤:2: 关闭CGROUP中的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:3: 设置memory.high的值为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.high # @测试步骤:4: 分配31MB匿名内存 "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 31M & task_pid=$! - echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 2 # @预期结果:2: 分配成功 - if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then assert_false [ true ] - else + else msg "分配成功" assert_true [ true ] fi kill -9 $task_pid # @测试步骤:5: 分配50MB页缓存 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & sleep 2 @@ -86,13 +86,12 @@ do_test() { aver_memory_current=$(echo "$total_memory_current / 8" | bc) msg "average memory current: $aver_memory_current" sleep 1 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs - # @预期结果:3: memory.current小于50MB + # @预期结果:3: memory.current小于50MB assert_true [ "$aver_memory_current" -lt 50 ] # @测试步骤:7: 分配30MB页缓存 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 30M & sleep 2 @@ -107,7 +106,6 @@ do_test() { aver_memory_current=$(echo "$total_memory_current / 8" | bc) msg "average memory current: $aver_memory_current" sleep 1 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs # @预期结果:4: 在误差允许范围内memory.current等于30MB TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) @@ -128,6 +126,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" index 8aca7b6..4148d6c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-002.sh" @@ -36,7 +36,7 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -54,23 +54,22 @@ do_test() { assert_true [ "$max_cnt" -ge 0 ] # @测试步骤:2: 关闭CGROUP中的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:3: 设置memory.high的值为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + echo 10M >"$CGROUP_TOPDIR"/$CGROUP/memory.high # @测试步骤:4: 设置memory.max的值为140M - echo 140M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 140M >"$CGROUP_TOPDIR"/$CGROUP/memory.max # @测试步骤:5: 注册内存事件监控 "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/register_notify "$CGROUP_TOPDIR"/$CGROUP/cgroup.events & - # @测试步骤:6: 单次分配200MB内存 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon_mlock 200M & + # @测试步骤:6: 单次分配100MB内存 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon_mlock 120M & task_pid=$! - echo "$task_pid" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - sleep 10 - kill -9 "$task_pid" + echo "$task_pid" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + sleep 12 # @测试步骤:7: 读取memory.events的high字段和max字段 post_high_cnt=$(grep "high" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') @@ -91,6 +90,9 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" + sleep 1 # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-001.sh" new file mode 100755 index 0000000..e20299b --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-001.sh" @@ -0,0 +1,164 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-175358-337059818 +# @用例名称: cgroup-v2-memory-low-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 memory low +# @用例类型: 测试memoruy.low接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为146MB, 不会占用parent1的memory.low保护的内存50MB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-low-001" +PARENT1="$CGROUP/parent1" +PARENT2="$CGROUP/parent2" +CHILD0="$PARENT1/child0" +CHILD1="$PARENT1/child1" +CHILD2="$PARENT1/child2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$PARENT1 + mkdir "$CGROUP_TOPDIR"/$PARENT2 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间 + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max和memory.low + echo 200M >"$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M >"$CGROUP_TOPDIR"/$PARENT1/memory.low + echo 75M >"$CGROUP_TOPDIR"/$CHILD0/memory.low + echo 25M >"$CGROUP_TOPDIR"/$CHILD1/memory.low + echo 0M >"$CGROUP_TOPDIR"/$CHILD2/memory.low + + # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 # 确保子进程已经分配内存 + + # @测试步骤:4: 给PARENT2分配146MB内存 + echo $$ >"$CGROUP_TOPDIR"/$PARENT2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 146M & + sleep 1 + + # @测试步骤:5: 检查内存使用情况 + parent1_memory=0 + chidl0_memory=0 + chidl1_memory=0 + chidl2_memory=0 + parent2_memory=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD0/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl0_memory=$(echo "$memory_current + $chidl0_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl1_memory=$(echo "$memory_current + $chidl1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl2_memory=$(echo "$memory_current + $chidl2_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) + sleep 1 + done + aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) + aver_chidl0_memory=$(echo "$chidl0_memory / 8" | bc) + aver_chidl1_memory=$(echo "$chidl1_memory / 8" | bc) + aver_chidl2_memory=$(echo "$chidl2_memory / 8" | bc) + aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) + msg "parent1 memory average: $aver_parent1_memory" + msg "child0 memory average: $aver_chidl0_memory" + msg "child1 memory average: $aver_chidl1_memory" + msg "child2 memory average: $aver_chidl2_memory" + msg "parent2 memory average: $aver_parent2_memory" + sleep 3 + + # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和等于50MB + TOLERANCE=$(echo "($aver_parent1_memory + 50) * 0.05" | bc) + diff=$((aver_parent1_memory - 50)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @预期结果:2: 在误差允许范围内,CHILD0分配的内存等于25MB, CHILD1分配的内存等于25MB, CHILD2分配的内存等于0MB + TOLERANCE=$(echo "($aver_chidl0_memory + 29) * 0.2" | bc) + diff=$((aver_chidl0_memory - 29)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + TOLERANCE=$(echo "($aver_chidl1_memory + 21) * 0.2" | bc) + diff=$((aver_chidl1_memory - 21)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + assert_true [ "$aver_chidl2_memory" -le 3 ] + + # @预期结果:3: 在误差允许范围内,PARENT2分配的内存等于146MB + TOLERANCE=$(echo "($aver_parent2_memory + 146) * 0.05" | bc) + diff=$((aver_parent2_memory - 146)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$PARENT1 + rmdir "$CGROUP_TOPDIR"/$PARENT2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-002.sh" new file mode 100755 index 0000000..e6cc669 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low-002.sh" @@ -0,0 +1,140 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240813-015314-638344032 +# @用例名称: cgroup-v2-memory-low-002 +# @用例级别: 1 +# @用例标签: cgroup-v2 memory low +# @用例类型: 测试memoruy.low接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为170MB, 会占用parent1的memory.low保护的内存50MB, 但是不会被kill,依然能分配 +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +CGROUP="cgroup-v2-memory-low-001" +PARENT1="$CGROUP/parent1" +PARENT2="$CGROUP/parent2" +CHILD0="$PARENT1/child0" +CHILD1="$PARENT1/child1" +CHILD2="$PARENT1/child2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$PARENT1 + mkdir "$CGROUP_TOPDIR"/$PARENT2 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间 + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max和memory.low + echo 200M >"$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M >"$CGROUP_TOPDIR"/$PARENT1/memory.low + echo 75M >"$CGROUP_TOPDIR"/$CHILD0/memory.low + echo 25M >"$CGROUP_TOPDIR"/$CHILD1/memory.low + echo 0M >"$CGROUP_TOPDIR"/$CHILD2/memory.low + + # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 # 确保子进程已经分配内存 + + # @测试步骤:4: 给PARENT2分配170MB内存 + echo $$ >"$CGROUP_TOPDIR"/$PARENT2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 170M & + sleep 1 + + # @测试步骤:5: 检查内存使用情况 + parent1_memory=0 + parent2_memory=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) + sleep 1 + done + aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) + aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) + msg "parent1 memory average: $aver_parent1_memory" + msg "parent2 memory average: $aver_parent2_memory" + sleep 3 + + # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和等于30MB + TOLERANCE=$(echo "($aver_parent1_memory + 30) * 0.1" | bc) + diff=$((aver_parent1_memory - 30)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @预期结果:2: 在误差允许范围内,PARENT2分配的内存等于170MB + TOLERANCE=$(echo "($aver_parent2_memory + 170) * 0.05" | bc) + diff=$((aver_parent2_memory - 170)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @预期结果:4: 检查low事件次数大于0 + low_cnt=$(grep "low" "$CGROUP_TOPDIR"/$PARENT1/memory.events | awk '{print $2}') + assert_true [ "$low_cnt" -gt 0 ] + + # @预期结果:5: 检查PARENT2的oom_kill事件次数等于0 + oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$PARENT2/memory.events | awk 'NR==1 {print $2}') + assert_true [ "$oom_kill_cnt" -ge 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$PARENT1 + rmdir "$CGROUP_TOPDIR"/$PARENT2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" index 3fe391b..de34374 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240805-225552-969242515 # @用例名称: cgroup-v2-memory-max -# @用例级别: 3 +# @用例级别: 1 # @用例标签: cgroup-v2 memory max -# @用例类型: 测试memory.max接口文件,设置限制 +# @用例类型: 测试memory.max接口文件 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -36,7 +36,7 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } @@ -50,26 +50,26 @@ do_test() { assert_true [ "$memory_max" = "max" ] # @测试步骤:2: 关闭CGROUP中的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:3: 设置memory.max的值为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.max # @测试步骤:4: 分配100MB匿名内存 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & - echo $! > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 200M & + echo $! >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 2 # @预期结果:2: 分配失败 - if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then msg "分配失败" assert_true [ true ] - else + else assert_false [ true ] fi # @测试步骤:5: 分配50MB页缓存 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & sleep 2 @@ -79,12 +79,11 @@ do_test() { memory_current=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.current) memory_current=$(echo "$memory_current / 1024 / 1024" | bc) total_memory_current=$(echo "$total_memory_current + $memory_current" | bc) - sleep 1 + sleep 1 done aver_memory_current=$(echo "$total_memory_current / 8" | bc) msg "aver memory current: $aver_memory_current" - sleep 1 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + sleep 1 # @预期结果:3: 在误差允许范围内,memory.current的值等于30MB TOLERANCE=$(echo "($aver_memory_current + 30) * 0.05" | bc) @@ -93,18 +92,30 @@ do_test() { abs_diff=${diff#-} assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - # @测试步骤:7: 获取CGROUP内存达到memory.max的次数 max_cnt=$(grep "max" "$CGROUP_TOPDIR"/$CGROUP/memory.events.local | awk '{print $2}') msg "max cnt: $max_cnt" # @预期结果:1: max_cnt大于0 - assert_true [ "$max_cnt" -gt "0" ] + assert_true [ "$max_cnt" -gt "0" ] + + # @测试步骤:8: 读取memory.peak + if [ ! -f "$CGROUP_TOPDIR"/$CGROUP/memory.peak ]; then + assert_true [ true ] + else + memory_peak=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.peak) + memory_peak=$(echo "$memory_peak / 1024 / 1024" | bc) + # @预期结果:2: memory.peak的值等于memory.max + assert_true [ "$memory_peak" -eq 30 ] + fi + return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-001.sh" new file mode 100755 index 0000000..068e5cf --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-001.sh" @@ -0,0 +1,169 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240806-100136-390417533 +# @用例名称: cgroup-v2-memory-min-001 +# @用例级别: 1 +# @用例标签: cgroup-v2 memory min +# @用例类型: 测试memoruy.min接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为143MB, 不会占用parent1的memory.min保护的内存50MB +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +# CGROUP +# / \ +# PARENT1 PARENT2 +# / | \ +# CHILD0 CHILD1 CHILD2 +CGROUP="cgroup-v2-memory-min-001" +PARENT1="$CGROUP/parent1" +PARENT2="$CGROUP/parent2" +CHILD0="$PARENT1/child0" +CHILD1="$PARENT1/child1" +CHILD2="$PARENT1/child2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$PARENT1 + mkdir "$CGROUP_TOPDIR"/$PARENT2 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + msg "this is do_test" + # @测试步骤:1: 关闭系统上的所有交换空间 + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max和memory.min + echo 200M >"$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M >"$CGROUP_TOPDIR"/$PARENT1/memory.min + echo 75M >"$CGROUP_TOPDIR"/$CHILD0/memory.min + echo 25M >"$CGROUP_TOPDIR"/$CHILD1/memory.min + echo 0M >"$CGROUP_TOPDIR"/$CHILD2/memory.min + + # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 # 确保子进程已经分配内存 + + # @测试步骤:4: 给PARENT2分配143MB内存 + echo $$ >"$CGROUP_TOPDIR"/$PARENT2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 143M & + sleep 1 + + # @测试步骤:5: 检查内存使用情况 + parent1_memory=0 + chidl0_memory=0 + chidl1_memory=0 + chidl2_memory=0 + parent2_memory=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD0/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl0_memory=$(echo "$memory_current + $chidl0_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl1_memory=$(echo "$memory_current + $chidl1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + chidl2_memory=$(echo "$memory_current + $chidl2_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) + sleep 1 + done + aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) + aver_chidl0_memory=$(echo "$chidl0_memory / 8" | bc) + aver_chidl1_memory=$(echo "$chidl1_memory / 8" | bc) + aver_chidl2_memory=$(echo "$chidl2_memory / 8" | bc) + aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) + msg "parent1 memory average: $aver_parent1_memory" + msg "child0 memory average: $aver_chidl0_memory" + msg "child1 memory average: $aver_chidl1_memory" + msg "child2 memory average: $aver_chidl2_memory" + msg "parent2 memory average: $aver_parent2_memory" + sleep 3 + + # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和等于50MB + TOLERANCE=$(echo "($aver_parent1_memory + 50) * 0.05" | bc) + diff=$((aver_parent1_memory - 50)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + + # @预期结果:2: 在误差允许范围内,CHILD0分配的内存等于25MB, CHILD1分配的内存等于25MB, CHILD2分配的内存等于0MB + TOLERANCE=$(echo "($aver_chidl0_memory + 29) * 0.2" | bc) + diff=$((aver_chidl0_memory - 29)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff <= $TOLERANCE" | bc)" -eq 1 ] + TOLERANCE=$(echo "($aver_chidl1_memory + 21) * 0.2" | bc) + diff=$((aver_chidl1_memory - 21)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff <= $TOLERANCE" | bc)" -eq 1 ] + assert_true [ "$aver_chidl2_memory" -le 5 ] + + # @预期结果:3: 在误差允许范围内,PARENT2分配的内存等于143MB + TOLERANCE=$(echo "($aver_parent2_memory + 143) * 0.05" | bc) + diff=$((aver_parent2_memory - 143)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff <= $TOLERANCE" | bc)" -eq 1 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$PARENT1 + rmdir "$CGROUP_TOPDIR"/$PARENT2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-002.sh" new file mode 100755 index 0000000..2b40699 --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min-002.sh" @@ -0,0 +1,137 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20240813-014222-140891925 +# @用例名称: cgroup-v2-memory-min-002 +# @用例级别: 1 +# @用例标签: cgroup-v2 memory min +# @用例类型: 测试memoruy.min接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为170MB, 会占用parent1的memory.min保护的内存50MB,因此会被kill +############################################################################### +[ -z "$TST_TS_TOPDIR" ] && { + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + export TST_TS_TOPDIR +} +[ -z "$CGROUP_TOPDIR" ] && { + CGROUP_TOPDIR="/sys/fs/cgroup" + export CGROUP_TOPDIR +} +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 +# shellcheck source=/dev/null +source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 +############################################################################### + +# CGROUP +# / \ +# PARENT1 PARENT2 +# / | \ +# CHILD0 CHILD1 CHILD2 +CGROUP="cgroup-v2-memory-min-002" +PARENT1="$CGROUP/parent1" +PARENT2="$CGROUP/parent2" +CHILD0="$PARENT1/child0" +CHILD1="$PARENT1/child1" +CHILD2="$PARENT1/child2" + +tc_setup() { + msg "this is tc_setup" + # @预置条件: 检查cgroup版本是否为cgroup v2 + if ! check_cgroup_version_is_v2; then + skip_test "cgroup版本不是v2" + fi + + # @预置条件: 创建cgroup + mkdir "$CGROUP_TOPDIR"/$CGROUP + mkdir "$CGROUP_TOPDIR"/$PARENT1 + mkdir "$CGROUP_TOPDIR"/$PARENT2 + mkdir "$CGROUP_TOPDIR"/$CHILD0 + mkdir "$CGROUP_TOPDIR"/$CHILD1 + mkdir "$CGROUP_TOPDIR"/$CHILD2 + # @预置条件: 检查当前cgroup是否能启用memory控制器 + if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then + skip_test "当前cgroup不能启用memory控制器" + fi + # @预置条件: 启用memory控制器 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 + + return 0 +} + +do_test() { + # @测试步骤:1: 关闭系统上的所有交换空间 + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + + # @测试步骤:2: 设置memory.max和memory.min + echo 200M >"$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M >"$CGROUP_TOPDIR"/$PARENT1/memory.min + echo 75M >"$CGROUP_TOPDIR"/$CHILD0/memory.min + echo 25M >"$CGROUP_TOPDIR"/$CHILD1/memory.min + echo 0M >"$CGROUP_TOPDIR"/$CHILD2/memory.min + + # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & + sleep 1 # 确保子进程已经分配内存 + + # @测试步骤:4: 给PARENT2分配170MB内存 + echo $$ >"$CGROUP_TOPDIR"/$PARENT2/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 170M & + sleep 1 + + # @测试步骤:5: 检查内存使用情况 + parent1_memory=0 + parent2_memory=0 + for _ in $(seq 1 8); do + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) + + memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) + memory_current=$(echo "$memory_current / 1024 / 1024" | bc) + parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) + sleep 1 + done + aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) + aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) + msg "parent1 memory average: $aver_parent1_memory" + msg "parent2 memory average: $aver_parent2_memory" + sleep 3 + + # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和等于50MB + TOLERANCE=$(echo "($aver_parent1_memory + 50) * 0.05" | bc) + diff=$((aver_parent1_memory - 50)) + abs_diff=${diff#-} + assert_true [ "$(echo "$abs_diff <= $TOLERANCE" | bc)" -eq 1 ] + + # @预期结果:2: 在误差允许范围内,PARENT2分配的内存等于0MB + assert_true [ "$aver_parent2_memory" -le 5 ] + + # @预期结果:3: 检查PARENT2的oom事件次数大于0 + oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$PARENT2/memory.events | awk 'NR==1 {print $2}') + assert_true [ "$oom_kill_cnt" -gt 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + # @清理工作: 删除cgroup + rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CHILD1 + rmdir "$CGROUP_TOPDIR"/$CHILD2 + rmdir "$CGROUP_TOPDIR"/$PARENT1 + rmdir "$CGROUP_TOPDIR"/$PARENT2 + rmdir "$CGROUP_TOPDIR"/$CGROUP + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" index 5d8fd46..709929f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" @@ -36,28 +36,28 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置memory.max为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.max # @测试步骤:2: 关闭CGROUP中的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:3: 分配100MB匿名内存 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & - echo $! > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 200M & + echo $! >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 2 # @预期结果:1: 分配失败 - if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then msg "分配失败" assert_true [ true ] - else + else assert_false [ true ] fi diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" index 6de4546..f447668 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" @@ -38,21 +38,22 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+memory" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置CHILD的内存限制为50M - echo 50M > "$CGROUP_TOPDIR"/$CHILD/memory.max + echo 50M >"$CGROUP_TOPDIR"/$CHILD/memory.max # @测试步骤:2: 关闭CHILD的swapping - echo 0 > "$CGROUP_TOPDIR"/$CHILD/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CHILD/memory.swap.max # @测试步骤:3: 启用CHILDE的oom.group - echo 1 > "$CGROUP_TOPDIR"/$CHILD/memory.oom.group + echo 1 >"$CGROUP_TOPDIR"/$CHILD/memory.oom.group # @测试步骤:4: 在CHILD中分配两个1MB匿名内存 "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & @@ -63,12 +64,12 @@ do_test() { sleep 1 # @测试步骤:5: 在CHILD分配超出memory.max的匿名内存 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 200M & echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs sleep 1 # @预期结果:1: CHILD中的进程都被kill - if [ "$(wc -c < "$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then assert_true [ true ] else assert_false [ true ] @@ -88,9 +89,12 @@ do_test() { # @测试步骤:8: 获取CGROUP的oom_group_kill oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') - - # @预期结果:4: oom_group_kill_cnt为1 - assert_true [ "$oom_group_kill_cnt" -eq 1 ] + if [ -z "$oom_group_kill_cnt" ]; then + assert_true [ true ] + else + # @预期结果:4: oom_group_kill_cnt为1 + assert_true [ "$oom_group_kill_cnt" -eq 1 ] + fi return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" index 045dd8f..04d3885 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" @@ -37,20 +37,20 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置PARENT的内存限制为80M - echo 80M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 80M >"$CGROUP_TOPDIR"/$CGROUP/memory.max # @测试步骤:2: 关闭PARENT的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:3: 启用PARENT的oom.group - echo 1 > "$CGROUP_TOPDIR"/$CGROUP/memory.oom.group + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/memory.oom.group # @测试步骤:4: 在PARENT中分配60MB匿名内存 "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 60M & @@ -66,19 +66,19 @@ do_test() { sleep 1 # @测试步骤:6: 在CHILD分配超出memory.max的匿名内存 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 500M & echo $! >"$CGROUP_TOPDIR"/$CHILD/cgroup.procs sleep 1 - # @预期结果:1: CHILD中的进程都被kill - if [ "$(wc -c < "$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then + # @预期结果:1: CHILD中的进程都被kill + if [ "$(wc -c <"$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then assert_true [ true ] else assert_false [ true ] fi # @预期结果:2: PARENT中的进程都被kill - if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then assert_true [ true ] else assert_false [ true ] @@ -86,10 +86,13 @@ do_test() { # @测试步骤:7: 获取CGROUP的oom_group_kill oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') + if [ -z "$oom_group_kill_cnt" ]; then + assert_true [ true ] + else + # @预期结果:4: oom_group_kill_cnt为1 + assert_true [ "$oom_group_kill_cnt" -eq 1 ] + fi - # @预期结果:3: oom_group_kill_cnt为1 - assert_true [ "$oom_group_kill_cnt" -eq 1 ] - return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" index c789037..0bef7d2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" @@ -36,20 +36,20 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置CGROUP的内存限制为50MB - echo 50M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 50M >"$CGROUP_TOPDIR"/$CGROUP/memory.max # @测试步骤:2: 关闭CGROUP的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:3: 启用CGROUP的oom.group - echo 1 > "$CGROUP_TOPDIR"/$CGROUP/memory.oom.group + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/memory.oom.group # @测试步骤:4: 在CGROUP中分配1MB匿名内存 "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & @@ -58,7 +58,7 @@ do_test() { sleep 1 # @测试步骤:5: 设置进程task_pid的oom_score_adj为OOM_SCORE_ADJ_MIN - echo $OOM_SCORE_ADJ_MIN > "/proc/$task_pid/oom_score_adj" + echo $OOM_SCORE_ADJ_MIN >"/proc/$task_pid/oom_score_adj" # @测试步骤:6: 在CGROUP中分配1MB匿名内存 "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 1M & @@ -66,7 +66,7 @@ do_test() { sleep 1 # @测试步骤:7: 在CGROUP中分配超出memory.max的匿名内存 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 200M & echo $! >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 1 @@ -79,9 +79,12 @@ do_test() { # @测试步骤:9: 获取CGROUP的oom_group_kill oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') - - # @预期结果:2: oom_group_kill_cnt为1 - assert_true [ "$oom_group_kill_cnt" -eq 1 ] + if [ -z "$oom_group_kill_cnt" ]; then + assert_true [ true ] + else + # @预期结果:4: oom_group_kill_cnt为1 + assert_true [ "$oom_group_kill_cnt" -eq 1 ] + fi # @测试步骤:10: 尝试kill有OOM_SCORE_ADJ_MIN的进程 kill -9 $task_pid || assert_false [ true ] @@ -94,6 +97,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + sleep 1 # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" index a76f691..1d68f67 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240807-205257-782673483 # @用例名称: cgroup-v2-memory-pressure -# @用例级别: 3 +# @用例级别: 2 # @用例标签: cgroup-v2 memory pressure # @用例类型: 测试memory.pressure接口文件,设置内存压力通知 ############################################################################### @@ -37,41 +37,43 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } do_test() { msg "this is do_test" - # @测试步骤:1: 设置memory.high为50MB - echo 50M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + # @测试步骤:1: 启用cgroup.pressure + echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.pressure || return 1 + + # @测试步骤:2: 设置memory.high为50MB + echo 50M >"$CGROUP_TOPDIR"/$CGROUP/memory.high + + # @测试步骤:3: 关闭CGROUP上的memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max - # @测试步骤:2: 关闭CGROUP上的memory.swap.max - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + # @测试步骤:4: 注册触发器 + stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/memory.pressure &>"$TMP_FILE" & - # @测试步骤:3: 注册触发器 - stdbuf -oL "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/pressure_listener "$CGROUP_TOPDIR"/$CGROUP/memory.pressure &> "$TMP_FILE" & - - # @测试步骤:4: 运行两个25MB的匿名分配进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 25M & + # @测试步骤:5: 运行两个30MB的匿名分配进程 + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 30M & sleep 2 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 25M & + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 30M & sleep 2 - # @测试步骤:5: 读取memor.pressure文件 + # @测试步骤:6: 读取memor.pressure文件 memory_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.pressure) avg10=$(echo "$memory_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') msg "avg10: $avg10" sleep 8 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs # @预期结果:1: avg10值应该大于0 assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] # @预期结果:2: 触发器应该被触发 + msg "file content: $(cat "$TMP_FILE")" if grep -q "event triggered" "$TMP_FILE"; then assert_true [ true ] else @@ -83,8 +85,10 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 + rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 rm "$TMP_FILE" return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" index 814971c..592fbc7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" @@ -4,7 +4,7 @@ # @用例名称: cgroup-v2-memory-reclaim-001 # @用例级别: 2 # @用例标签: cgroup-v2 memory reclaim -# @用例类型: 测试memory.reclaim接口文件,回收文件内存 +# @用例类型: 测试memory.reclaim接口文件,回收page cache ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -36,19 +36,20 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 关闭CGROUP的swapping - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:2: 运行一个分配50M页缓存内存的进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - sleep 1 + task_pid=$! + sleep 1 # @测试步骤:3: 计算回收前的内存 before_reclaim=0 @@ -61,7 +62,7 @@ do_test() { aver_before_reclaim=$(echo "$before_reclaim / 5" | bc) # @测试步骤:4: 主动回收内存 - echo "40M" > "$CGROUP_TOPDIR"/$CGROUP/memory.reclaim + echo "40M" >"$CGROUP_TOPDIR"/$CGROUP/memory.reclaim || return 1 # @测试步骤:5: 计算回收后的内存 after_reclaim=0 @@ -72,8 +73,6 @@ do_test() { sleep 1 done aver_after_reclaim=$(echo "$after_reclaim / 4" | bc) - - echo $$ >"$CGROUP_TOPDIR"/cgroup.procs sleep 3 # @预期结果:1: 在误差范围内回收了内存40MB @@ -83,7 +82,7 @@ do_test() { diff_min=35 if [ "$diff" -gt $diff_min ]; then assert_true [ "$diff" -lt $diff_max ] - else + else assert_false [ true ] fi @@ -92,6 +91,9 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + kill -9 "$task_pid" + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" index bf46639..1f6775a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" @@ -36,18 +36,18 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } - do_test() { msg "this is do_test" # @测试步骤:1: 运行一个分配50M匿名内存的进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & - sleep 1 + task_pid=$! + sleep 1 # @测试步骤:2: 计算回收前的内存 before_reclaim=0 @@ -60,7 +60,7 @@ do_test() { aver_before_reclaim=$(echo "$before_reclaim / 5" | bc) # @测试步骤:3: 主动回收内存 - echo "40M" > "$CGROUP_TOPDIR"/$CGROUP/memory.reclaim + echo "40M" >"$CGROUP_TOPDIR"/$CGROUP/memory.reclaim || return 1 # @测试步骤:4: 计算回收后的内存 after_reclaim=0 @@ -71,10 +71,8 @@ do_test() { sleep 1 done aver_after_reclaim=$(echo "$after_reclaim / 4" | bc) - - echo $$ >"$CGROUP_TOPDIR"/cgroup.procs sleep 3 - + # @预期结果:1: 在误差范围内回收了内存40MB diff=$(echo "$aver_before_reclaim - $aver_after_reclaim" | bc) msg "diff: $diff" @@ -82,7 +80,7 @@ do_test() { diff_min=35 if [ "$diff" -gt $diff_min ]; then assert_true [ "$diff" -lt $diff_max ] - else + else assert_false [ true ] fi @@ -91,6 +89,9 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell进程移出cgroup + kill -9 "$task_pid" + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" index 3969707..e21ac02 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" @@ -2,7 +2,7 @@ ############################################################################### # @用例ID: 20240807-191722-246340813 # @用例名称: cgroup-v2-memory-swap-high -# @用例级别: 2 +# @用例级别: 1 # @用例标签: cgroup-v2 memory swap high # @用例类型: 测试memory.swap.high接口文件 ############################################################################### @@ -36,10 +36,10 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 # @预置条件: 查看系统是否启用了swapping - if ! swapon --show &>/dev/null; then - skip_test "系统未启用swap" + if [ -z "$(swapon --show)" ]; then + skip_test "系统未启用swap或没有swapfile" fi return 0 @@ -54,28 +54,28 @@ do_test() { assert_true [ "$memory_swap_high" = "max" ] # @测试步骤:2: 设置memory.swap.high为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.high + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.high # @测试步骤:3: 设置memory.high为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.high + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.high # @测试步骤:4: 分配31M匿名内存的进程 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 31M & + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 200M & task_pid=$! - echo $task_pid > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 2 # @预期结果:2: 分配成功 - if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then assert_false [ true ] - else + else msg "分配成功" assert_true [ true ] fi kill -9 $task_pid # @测试步骤:5: 分配50M匿名内存的进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & sleep 2 @@ -96,14 +96,13 @@ do_test() { msg "average memory current: $aver_memory_current" msg "average memory current: $aver_memory_swap_current" sleep 1 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs # @预期结果:3: 在误差允许范围内,memory.current等于30MB, memory.current+memory.swap.current等于50MB - TOLERANCE=3 + TOLERANCE=$(echo "($aver_memory_current + 30) * 0.1" | bc) diff=$((aver_memory_current - 30)) abs_diff=${diff#-} if [ "$aver_memory_current" -ne 0 ]; then - assert_true [ "$abs_diff" -le "$TOLERANCE" ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] else assert_false [ true ] fi @@ -112,7 +111,7 @@ do_test() { abs_diff=${diff#-} if [ "$aver_memory_current" -ne 0 ]; then assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - else + else assert_false [ true ] fi @@ -121,6 +120,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" index 2b460d2..56fbc37 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" @@ -36,33 +36,35 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 # @预置条件: 查看系统是否启用了swapping - if ! swapon --show &>/dev/null; then - skip_test "系统未启用swap" + if [ -z "$(swapon --show)" ]; then + skip_test "系统未启用swap或没有swapfile" fi - + return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置memory.swap.max为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.swap.max # @测试步骤:2: 设置memory.max为30M - echo 30M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 30M >"$CGROUP_TOPDIR"/$CGROUP/memory.max - # @测试步骤:3: 分配100M匿名内存的进程 - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 100M & - echo $! > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + # @测试步骤:3: 分配31M匿名内存的进程 + "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 200M & + task_pid=$! + echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs sleep 5 # @预期结果:1: 分配失败 - if [ "$(wc -c < "$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then + if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then msg "分配失败" assert_true [ true ] else + msg "分配成功" assert_false [ true ] fi @@ -81,7 +83,7 @@ do_test() { assert_true [ "$oom_kill_cnt" -gt 0 ] # @测试步骤:6: 分配50MB匿名内存的进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 50M & sleep 2 @@ -102,15 +104,14 @@ do_test() { msg "memory.current: $aver_memory_current" msg "memory.swap.current: $aver_swap_current" sleep 3 - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs # @预期结果:4: 在误差允许范围内,memory.current等于30MB, memory.current+memory.swap.current等于50MB - TOLERANCE=3 + TOLERANCE=$(echo "($aver_memory_current + 30) * 0.1" | bc) diff=$((aver_memory_current - 30)) abs_diff=${diff#-} if [ "$aver_memory_current" -ne 0 ]; then - assert_true [ "$abs_diff" -le "$TOLERANCE" ] - else + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + else assert_false [ true ] fi TOLERANCE=$(echo "($aver_memory_current + $aver_swap_current + 50) * 0.03" | bc) @@ -118,7 +119,7 @@ do_test() { abs_diff=${diff#-} if [ "$aver_memory_current" -ne 0 ]; then assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - else + else assert_false [ true ] fi @@ -127,6 +128,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将shell移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 @@ -135,4 +138,3 @@ tc_teardown() { ############################################################################### tst_main "$@" ############################################################################### - \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" index f58f4ec..d115918 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" @@ -2,9 +2,9 @@ ############################################################################### # @用例ID: 20240807-200055-083750426 # @用例名称: cgroup-v2-memory-zswap -# @用例级别: 3 -# @用例标签: cgroup-v2 memory zswap -# @用例类型: 测试memory.zswap.max接口文件, 达到限制不会触发写回操作, 测试memory.zswap.current接口文件 +# @用例级别: 2 +# @用例标签: cgroup-v2 memory zswap +# @用例类型: 测试memory.zswap.max和memory.zswap.current接口文件, 达到限制不会触发写回操作 ############################################################################### [ -z "$TST_TS_TOPDIR" ] && { TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" @@ -36,29 +36,29 @@ tc_setup() { skip_test "当前cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 # @预置条件: 查看系统是否启用了zswap if ! dmesg | grep zswap &>/dev/null; then skip_test "系统未启用zswap" fi - + return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置memory.max为1M - echo 1M > "$CGROUP_TOPDIR"/$CGROUP/memory.max + echo 1M >"$CGROUP_TOPDIR"/$CGROUP/memory.max # @测试步骤:2: 设置memory.zswap.max为10K - echo 10K > "$CGROUP_TOPDIR"/$CGROUP/memory.zswap.max + echo 10K >"$CGROUP_TOPDIR"/$CGROUP/memory.zswap.max || return 1 # @测试步骤:3: 获取当前zswap已经写回的页数 written_back_before=$(cat /sys/kernel/debug/zswap/written_back_pages) msg "written_back_before: $written_back_before" # @测试步骤:4: 分配10M匿名内存的进程 - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 10M & # @测试步骤:5: 获取memory.zswap.current的值 @@ -71,9 +71,8 @@ do_test() { done aver_memory_zswap_current=$(echo "$total_memory_zswap_current / 10" | bc) msg "aver_memory_zswap_current: $aver_memory_zswap_current KB" - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs - # @预期结果:1: memory.zswap.current大于 + # @预期结果:1: memory.zswap.current大于0 assert_true [ "$(echo "$aver_memory_zswap_current > 0" | bc)" -eq 1 ] # @测试步骤:6: 获取当前zswap已经写回的页数 @@ -95,6 +94,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将当前shell移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" index 5634ad2..700cd21 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" @@ -28,8 +28,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用pids控制器 @@ -37,22 +37,22 @@ tc_setup() { skip_test "当前cgroup不能启用pids控制器" fi # @预置条件: 启用io控制器 - echo "+pids" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+pids" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > "$CGROUP_TOPDIR"/$CGROUP/pids.max + echo 2 >"$CGROUP_TOPDIR"/$CGROUP/pids.max # @测试步骤:2: 将当前shell加入cgroup - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs # @测试步骤:3: 运行两个子进程 - (echo "Here's some processes for you." | cat) &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs - + (echo "Here's some processes for you." | cat) &>"$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs + # @测试步骤:4: 获取超过最大进程数的次数 fail_cnt=$(grep max "$CGROUP_TOPDIR"/$CGROUP/pids.events | awk '{print $2}') msg "fail cnt: $fail_cnt" @@ -61,10 +61,13 @@ do_test() { assert_true [ "$fail_cnt" -gt 0 ] # @测试步骤:5: 获取最大进程数 - peak_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/pids.peak) - - # @预期结果:2: 最大进程数为2 - assert_true [ "$peak_cnt" -eq 2 ] + if [ ! -f "$CGROUP_TOPDIR"/$CGROUP/pids.peak ]; then + assert_true [ true ] + else + peak_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/pids.peak) + # @预期结果:2: 最大进程数为2 + assert_true [ "$peak_cnt" -eq 2 ] + fi return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" index 9a6d52b..bc88d27 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" @@ -28,8 +28,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP # @预置条件: 检查当前cgroup是否能启用pids控制器 @@ -37,22 +37,21 @@ tc_setup() { skip_test "当前cgroup不能启用pids控制器" fi # @预置条件: 启用io控制器 - echo "+pids" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+pids" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } - do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > "$CGROUP_TOPDIR"/$CGROUP/pids.max + echo 2 >"$CGROUP_TOPDIR"/$CGROUP/pids.max # @测试步骤:2: 将当前shell加入cgroup - echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs # @测试步骤:3: 运行进程并获取pid.current pid_num=$(cat "$CGROUP_TOPDIR"/$CGROUP/pids.current) - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @测试步骤:4: 获取超过最大进程数的次数 fail_cnt=$(grep max "$CGROUP_TOPDIR"/$CGROUP/pids.events | awk '{print $2}') @@ -70,6 +69,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将当前shell从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" index de8d2b6..30beb44 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" @@ -29,8 +29,8 @@ tc_setup() { # @预置条件: 检查cgroup版本是否为cgroup v2 if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" - fi - + fi + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -39,15 +39,15 @@ tc_setup() { skip_test "当前cgroup不能启用pids控制器" fi # @预置条件: 启用io控制器 - echo "+pids" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+pids" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 + echo "+pids" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + echo "+pids" >"$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 return 0 } do_test() { msg "this is do_test" # @测试步骤:1: 设置pids.max为2 - echo 2 > "$CGROUP_TOPDIR"/$CGROUP/pids.max + echo 2 >"$CGROUP_TOPDIR"/$CGROUP/pids.max # @测试步骤:2: 获取CHILD0的pids.max pid_max=$(cat "$CGROUP_TOPDIR"/$CHILD0/pids.max) @@ -56,11 +56,11 @@ do_test() { assert_true [ "$pid_max" = "max" ] # @测试步骤:3: 将当前shell加入CHILD0 - echo $$ > "$CGROUP_TOPDIR"/$CHILD0/cgroup.procs + echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs # @测试步骤:4: 运行了两个子进程 - (echo "Here's some processes for you." | cat) &> "$TMP_FILE" - echo $$ > "$CGROUP_TOPDIR"/cgroup.procs + (echo "Here's some processes for you." | cat) &>"$TMP_FILE" + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @测试步骤:5: 获取超过最大进程数的次数 fail_cnt=$(grep max "$CGROUP_TOPDIR"/$CHILD0/pids.events | awk '{print $2}') @@ -77,6 +77,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 将当前shell从cgroup中移除 + echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD0 rmdir "$CGROUP_TOPDIR"/$CGROUP diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" index 8fcbc4a..1eb80f6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-populated.sh" @@ -20,6 +20,11 @@ source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 ############################################################################### +# CGROUP +# | +# CHILD0 +# / \ +# CHILD00 CHILD01 CGROUP="cgroup-v2-type-001" CHILD0="$CGROUP/child0" CHILD00="$CHILD0/child0" @@ -46,13 +51,10 @@ do_test() { msg "this is do_test" # @测试步骤:1: 运行一个进程并将其放入CHILD00 { - while true; do - sleep 1 - - done - }& + while true; do :; done + } & task_pid=$! - echo $task_pid > "$CGROUP_TOPDIR"/$CHILD00/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/$CHILD00/cgroup.procs # @预测结果:1: CGROUP, CHILD0, CHILD00的populated字段为1,CHILD01的populated字段为0 populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') @@ -65,7 +67,7 @@ do_test() { assert_true [ "$populated" -eq 0 ] # @测试步骤:2: 将进程迁移到root cgroup - echo $task_pid > "$CGROUP_TOPDIR"/cgroup.procs + echo $task_pid >"$CGROUP_TOPDIR"/cgroup.procs # @预期结果:1: 四个cgroup的populated字段为0 populated=$(grep populated "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') @@ -76,13 +78,14 @@ do_test() { assert_true [ "$populated" -eq 0 ] populated=$(grep populated "$CGROUP_TOPDIR"/$CHILD01/cgroup.events | awk '{print $2}') assert_true [ "$populated" -eq 0 ] - kill -9 $task_pid return 0 } tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD01 rmdir "$CGROUP_TOPDIR"/$CHILD00 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" index cec9ec6..7d17063 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-001.sh" @@ -30,7 +30,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -39,8 +39,8 @@ tc_setup() { skip_test "根cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -51,9 +51,7 @@ do_test() { # @测试步骤:2: 运行一个进程 { - while true; do - :; - done + while true; do :; done } & task_pid=$! @@ -62,7 +60,6 @@ do_test() { echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs || ret=-1 # @预期结果:1: 写入失败 - kill -9 $task_pid assert_true [ "$ret" -eq -1 ] return 0 @@ -70,6 +67,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD0 rmdir "$CGROUP_TOPDIR"/$CGROUP diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" index 97ed1dc..6daa6a6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-002.sh" @@ -30,7 +30,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -39,8 +39,7 @@ tc_setup() { skip_test "根cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" index c58a183..5a24cfb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-003.sh" @@ -30,7 +30,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -39,8 +39,7 @@ tc_setup() { skip_test "根cgroup不能启用memory控制器" fi # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" index 2a1659c..06deb0e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-subtree_control-004.sh" @@ -30,7 +30,7 @@ tc_setup() { if ! check_cgroup_version_is_v2; then skip_test "cgroup版本不是v2" fi - + # @预置条件: 创建cgroup mkdir "$CGROUP_TOPDIR"/$CGROUP mkdir "$CGROUP_TOPDIR"/$CHILD0 @@ -39,8 +39,8 @@ tc_setup() { skip_test "根cgroup不能启用memory控制器" fi # @预置条件: 启用cpu控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - + echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 + return 0 } @@ -55,9 +55,7 @@ do_test() { # @测试步骤:3: 运行一个线程 { - while true; do - :; - done + while true; do :; done } & task_pid=$! @@ -66,7 +64,6 @@ do_test() { echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs || ret=-1 # @预期结果:1: 写入成功 - kill -9 $task_pid assert_true [ "$ret" -eq 0 ] return 0 @@ -74,6 +71,8 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD0 rmdir "$CGROUP_TOPDIR"/$CGROUP diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" index 84d2e56..1b257d6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-type-002.sh" @@ -53,18 +53,15 @@ do_test() { # @测试步骤:3: 运行一个进程 { - while true; do - :; - done - }& + while true; do :; done + } & task_pid=$! - + # @测试步骤:4: 将进程加入CHILD1 ret=0 echo $task_pid >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs || ret=-1 # @预期结果:2: 将进程加入CHILD1失败 - kill -9 $task_pid assert_true [ $ret -eq -1 ] return 0 @@ -72,9 +69,12 @@ do_test() { tc_teardown() { msg "this is tc_teardown" + # @清理工作: 清理后台进程 + kill -9 "$task_pid" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CHILD1 rmdir "$CGROUP_TOPDIR"/$CHILD0 + rmdir "$CGROUP_TOPDIR"/$CGROUP return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" index bd0ef3b..9bfd16e 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon.c" @@ -25,6 +25,8 @@ int alloc_anon(size_t mb) { for (ptr = buf; ptr < buf + size; ptr += PAGE_SIZE) { *ptr = 0; } + + printf("成功分配 %zu MB内存.\n", mb); sleep(10); @@ -50,6 +52,5 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - printf("成功分配 %zu MB内存.\n", mb); return EXIT_SUCCESS; } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" index ed5eea9..cb88ec1 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_anon_mlock.c" @@ -8,7 +8,7 @@ #define PAGE_SIZE 4096 // 页大小 -// 单次分配大量匿名内存 +// 单次分配大量匿名内存 int alloc_anon_mlock(size_t mb) { size_t size = mb * 1024 * 1024; void *buf; diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" index c163d4d..63b4418 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/alloc_pagecache.c" @@ -57,6 +57,8 @@ int create_temp_file_and_allocate(size_t size_mb) { return -1; } + printf("成功分配 %zu MB 页缓存.\n", size_mb); + sleep(10); // 释放文件 @@ -80,6 +82,5 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - printf("成功分配 %zu MB 页缓存.\n", size_mb); return EXIT_SUCCESS; } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" index 0adff3190631f1172ebaf48a55d1f76e769ef292..7b1de3e4c0d00576d01e657463530f304111744d 100755 GIT binary patch delta 748 zcmYLHT}TvB6ux(CZFk+B*_~C~MR5m8qSF0QECd%?vAokCSxOJ~1C_qigVstA;jV0} zPV3UzB`SLGCFrRa2gF2j%(SH^UwY`J%v_n0P*YOq=XORn8aVTvd%o{}=geV7qodKZ z8>a_7%NBbc+IsBNiT#!s-af@t8T+}y_Ze=sY2j?NxbInL@kMg{sXR;7fxHC{chJuK zVjNJF{3q6HXNa;EXIx}AN%ACBw80}plA(DYLN5)!pr(&7#zu|2b&4dr&0|)h{6oJ8 zWpa6wBv?eyMc`W#n(#mqMl_HeGlSP_@LC#f_X*xRTa%@!<}7LIgnO)L7c^M^Pmxqe zh6+iU>J6yfj1-ZiDc{HwTExQU1aHjnn93pOJzM%3(MK!968w%5v25?RO3-xeZz1u} zu#pla8?nLXjKD#c|1hRsf#x%&X?jmAkA|CNv_4NsDk%}tbP zQk%Kq61)uv&48H+IgHsd*S{ZE=1HpNs2!n++>&f?bHdn+US)VF%lg~jj0LsU^Wk$- zFs%c$`UaHZ8MgElp*5jQ^}0UU=*rI0`;u6)*q_ec9m@9ieo3UH@>^ZfiTZ4BBK!Q2 z&q|$A4ZS4ov#*1F#VTXXfTi@Yw1=Brp|7O&(-lw{fH(zYHy}E~I|jH0-rbuQ=B4-! z?t+zfhj~XmZw?m#EkTS!Xv>VX0iwgaBhFp58Z=1Fa)BCj@it3`Xpjg6=wPKEBXzQp zaag01fnv{!bDR42J_HE|`w7t1KqLHNwZTSwoAv~6T4FhqZi=h=FrrG;1Wr@A`XFvo cd#WFr@dxUu^IMQBXGNRp-rzaa6B^?F0(}?xu>b%7 delta 752 zcmYL{Uq}=|9LHz&I@_~ry<5H9%d6X$D68{4P2$Ld_OKl33PgoKL#epHm#D6KOKsIy z&IPY2LL!nR=%EK;UnDBeH1n}uDu_zTV(SVsC89r0zwv|?W`Dn#?`OWhnIALOHP$t# z;B3Y}?<#kom9Lz7aoE+1^Rr&70f&W>pgy$N9@3v_?Hg}wNSuhiE;x6`8gR@Bc$l6l zD8(I?QEwKna@ zBuQTo?-g?Shus81;+TD~?`x_wVa(grfNRE7UpD2-Z_Uk+^Z^mPuYh;%R>Js9%$gC% zH;v~j*b%VEjU+3Ig1sx(C<@jgLAy_Om>RP($41q z5vb~7vqiyf?lZX>f&ausv*ulh{_&RK+f zG5a_apLSlQ?edmn3pDCCnRs79jJHJpBHC+#;Pv(pvsNL-V>ri|lH|(Kr@_pLJn)bH zJpFx~H_BEx4(%EJ%UC2!^eM3w`e??M+#tS!MSX_lY-?Hm=)SDVv_joQWi>#Ls@vCp zgZ*s_j5R|{&>?lJfEMT@HFk@|2r+@atn|>Q zm7-r=74rx}dm$0v${lo}vL0SpG*XYdX;0+5YjlZ4R6#20xJau4R zgZihCB!>NCJ_wPR&t_^+7!(DOAVl?Ok(v<}+U>k)c;UQr-tYd-?|g9mt=Qj+yY1L~ zGk#9r7lFd3kH+8(8n-7#K7y0E*xKBg{Z&KiyBF62cm25?%O5^=&B|T6eqH>$Wi_GR zwd(m*hX&=Ms0zcSqeNQtFwVV&bPB|0^9l%&PS@FVgaR0tPDOpd7#r5&iXiE{&W{*0 z_?LPZU~+DWc$wRzS~$4&DyCbC>9GQ|Vji^0Kr1wKA>EXCBV4na=2AN&3JtJeEW7R3>OO(dFN~5zx`bvB`$v_=l+kFT`OGdSgt4WY6 z&8Y)`9FS%!#gk%Xuv?lFpM*Q50EfOnp#dY5UB#v~>^0JwBA#zN@r?698E-mm>~Rd+ z2vlfUVC)QN*Z*MbmFDS7M+&yn-;T@pHmyzCSC$Is8?aJfQ1GZwF#EU?!QQ1iBskh5 zxMG7~&lk-30-q0skpnCOl$ANgsv$-Ng4x4eGzh$CJO$q(BQ#KBqzV_M|Nk%tX+v5D z?v?w}5_LF_j%CKh*RQ=q`|LAsE6kej#A-OfU8If=G8-$LSvtSF4lv?@Ce tBifXmi>v9Q>}frU4d)^%OFNo*Zjqw~SGvA;4eh0(YZ7mj^?UDe{{UPRK!yMS delta 896 zcmYL{ZAep57{|}Ko4FUc&b{EIa!Uvbb#5(@f@@wgyQTvp7nK^lVfe|y2};qN%iuN# z&GRKA$jT4WmtL+PLPRH;8Wb8t)Q4&m!Nn27j3~=a&)wBLaCy%8Kfm)o&w0)r4&mVt zzG24|vAmRiQj5}KlH}kLy_Qi|TB!z?FxG|n!^1c^^`8o$)18PeoA zEh>0{Q=?7|C?VBkHX4GwpKmxKh|6Kh1d4? zowz7OOMNikI-#B*=YU1>ev2#HaW!3FwxbFmVlr>8=OIIF?ZpUv-$)BlZU7V^n$fR> zJwF3BA(C-anZv1in#gu^D?U?e5%|_LUwVdIGH=1#$xU;VikhllU#1{RAZ8q^|d1T%QHE9apN9!{mXbD7a$$ zFVq5;oB?QgLn~9XCvyA`rOVm*D|~||J~{+#81F$m^21~N20j72yb4Hfyi*V+KU>9F z@tGigke~mhG~L^df(fPlvJUK^=P_WF$7$wWO;auFZ4^`dSh})yNGB6ud|fF-)gCI^ z3yD~L#(w8hTNTvsXo=EO;5zt?(gh`wm(D^gkYCO=JV#o$?K`#u)YtHJ0}+OZs##MX z<74gDG(77JYl8;X&a%VJ) zTr4iZBhuYshlad$o5+G&mp5ouOg6>=m@>$O5@gAJka1ebUQacH3P_LV4QxHWD-+`i va@w1V-K5J~hGXQhcV6$dss>?6+#S?077a0QF8#=wIzo7E78gnS@;l5wMUFrk diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" index 1f125ad066de459c5f75082a42aa9009cfe01ace..2857c986b91d586162bade0cc7a03ad287d27fc6 100755 GIT binary patch delta 42 zcmV+_0M-AHf&q|%0kC)j6bn7uLeJhfC4%554W-!7ge?jG*|UrTj1U1uvl$fkEOfyU AaR2}S delta 42 ycmbQx#5kdeaYF^Oh%=}3R=MXkVh4h3rukfoTq)UnnQLYcV84q;; diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" index b2bf282..f416b54 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/cgroup_event_listener.c" @@ -14,37 +14,44 @@ int main(int argc, char **argv) { - int efd = -1; - int cfd = -1; - int event_control = -1; - char event_control_path[4096]; - char line[256]; + int efd = -1; // eventfd 文件描述符 + int cfd = -1; // 控制文件的文件描述符 + int event_control = -1;// cgroup.event_control 文件的文件描述符 + char event_control_path[4096]; // 存储 cgroup.event_control 文件路径的缓冲区 + char line[256]; // 存储写入 cgroup.event_control 文件的字符串 int ret; + // 检查命令行参数数量是否正确 if (argc != 3) errx(1, "%s", USAGE_STR); + // 打开控制文件 cfd = open(argv[1], O_RDONLY); if (cfd == -1) err(1, "Cannot open %s", argv[1]); + // 构建 cgroup.event_control 文件的路径 ret = snprintf(event_control_path, 4096, "%s/cgroup.event_control", dirname(argv[1])); if (ret >= 256) errx(1, "Path to cgroup.event_control is too long"); + // 打开 cgroup.event_control 文件 event_control = open(event_control_path, O_WRONLY); if (event_control == -1) err(1, "Cannot open %s", event_control_path); + // 创建 eventfd efd = eventfd(0, 0); if (efd == -1) err(1, "eventfd() failed"); + // 构建写入 cgroup.event_control 文件的字符串 ret = snprintf(line, 63, "%d %d %s", efd, cfd, argv[2]); if (ret >= 256) errx(1, "Arguments string is too long"); + // 将字符串写入 cgroup.event_control 文件 ret = write(event_control, line, strlen(line) + 1); if (ret == -1) err(1, "Cannot write to cgroup.event_control"); @@ -52,6 +59,7 @@ int main(int argc, char **argv) while (1) { uint64_t result; + // 从 eventfd 读取事件 ret = read(efd, &result, sizeof(result)); if (ret == -1) { if (errno == EINTR) @@ -60,6 +68,7 @@ int main(int argc, char **argv) } assert(ret == sizeof(result)); + // 检查 cgroup.event_control 文件是否仍然可写 ret = access(event_control_path, W_OK); if ((ret == -1) && (errno == ENOENT)) { puts("The cgroup seems to have removed."); @@ -68,7 +77,8 @@ int main(int argc, char **argv) if (ret == -1) err(1, "cgroup.event_control is not accessible any more"); - + + // 打印事件信息 printf("%s %s: crossed\n", argv[1], argv[2]); } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" index f7d917a..14b5a1d 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/other_common.sh" @@ -8,30 +8,6 @@ is_root() { return 0 } -# 检查是否安装了libcgroup工具 -is_cgroup_tools_installed() { - if ! command -v cgcreate &> /dev/null; then - return 1 - fi - return 0 -} - -# 检查是否安装了taskset工具 -is_taskset_installed() { - if ! command -v taskset &> /dev/null; then - return 1 - fi - return 0 -} - -# 检查是否安装了stress-ng工具 -is_stress-ng_installed() { - if ! command -v stress-ng &> /dev/null; then - return 1 - fi - return 0 -} - # 检查是否安装了dd工具 is_dd_installed() { if ! command -v dd &> /dev/null; then @@ -80,6 +56,22 @@ is_numastat_installed() { return 0 } +# 检查是否安装了mpstat命令 +is_sysstat_installed() { + if ! command -v mpstat &> /dev/null; then + return 1 + fi + return 0 +} + +# 检查是否安装了bc命令 +is_bc_installed() { + if ! command -v bc &> /dev/null; then + return 1 + fi + return 0 +} + # 检查cgroup版本是否为cgroup v1 check_cgroup_version_is_v1() { if [ "$(stat -fc %T "$CGROUP_TOPDIR")" = "tmpfs" ]; then @@ -107,4 +99,54 @@ check_string_in_file() { else return 1 fi +} + +# 获取cgroup可用的cpu列表 +get_online_cpu_list() { + local file_path=$1 + local cpu_effective + local cpu_list=() + + cpu_effective=$(cat "$file_path") + + # 提取所有 CPU 序号 + IFS=',' read -r -a ranges <<< "$cpu_effective" + for range in "${ranges[@]}"; do + if [[ $range =~ ^[0-9]+-[0-9]+$ ]]; then + # 处理范围格式,如 "0-1" + IFS='-' read -r start end <<< "$range" + for ((i=start; i<=end; i++)); do + cpu_list+=("$i") + done + else + # 处理单个 CPU 序号,如 "4" + cpu_list+=("$range") + fi + done + + # 返回 cpu_list 数组 + echo "${cpu_list[@]}" +} + +# 获取cgroup可用的mem列表 +get_online_mem_list() { + local file_path=$1 + local mem_effective + local mem_list=() + + mem_effective=$(cat "$file_path") + + IFS=',' read -r -a ranges <<< "$mem_effective" + for range in "${ranges[@]}"; do + if [[ $range =~ ^[0-9]+-[0-9]+$ ]]; then + IFS='-' read -r start end <<< "$range" + for ((i=start; i<=end; i++)); do + mem_list+=("$i") + done + else + mem_list+=("$range") + fi + done + + echo "${mem_list[@]}" } \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" index 0479225..c0a7f51 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/ts_common.sh" @@ -24,24 +24,9 @@ tc_setup_common() { msg "错误原因: CONFIG_CGROUPS 配置未开启" return 1 fi - # 检查是否安装了libcgroup - if ! is_cgroup_tools_installed; then - msg "错误原因: 未安装cgroup工具" - return 1 - fi - # 检查是否安装了taskset - if ! is_taskset_installed; then - msg "错误原因: 未安装taskset工具" - return 1 - fi - # 检查是否安装了numactl - if ! is_numactl_installed; then - msg "错误原因: 未安装numactl工具" - return 1 - fi - # 检查是否安装了stress-ng - if ! is_stress-ng_installed; then - msg "错误原因: 未安装stress-ng工具" + # 检查是否安装了bc工具 + if ! is_bc_installed; then + msg "错误原因: 未安装bc工具" return 1 fi } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" new file mode 100644 index 0000000..d1efedb --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" @@ -0,0 +1,208 @@ +# tst-cgroup测试套使用文档 + +## 运行测试 + +### 克隆到本地 + +```bash +git clone --recurse-submodules -b hmt-issue https://gitee.com/LINGYUNXINGZHE/tst-cgroup.git +``` + +### 安装必要的工具 + +```bash +bash install_package.sh +``` + +### 编译cgroup util中的程序 + +在tst_lib/cgroup_util目录下输入 `make` 命令编译程序,生成的可执行文件在tst_lib/cgroup_util/bin中 + +### 运行单个测试用例 + +在根目录下,以root权限运行 + +```bash +sudo ./tsuite run testcase/$TESTCACE +``` + +`TESTCASE` 是具体的测试用例名称 + +### 运行整个测试套 + +在根目录下,以root权限运行 + +```bash +sudo ./tsuite run +``` + +运行结果在logs/.ts.sysdir/run.result文件中 + +## 操作指南 + +### 切换cgroup版本 + +切换到cgroup v1,在/etc/default/grub的GRUB_CMDLINE_LINUX添加`systemd.unified_cgroup_hierarchy=0` + +切换到cgroup v1,在/etc/default/grub的GRUB_CMDLINE_LINUX添加`systemd.unified_cgroup_hierarchy=1` + +然后更新配置: + +```bash +sudo grub2-mkconfig -o /boot/grub2/grub.cfg +``` + +### 启用zswap + +以下测试用例需要启用系统的zswap: + +- cgroup-v2-memory-zswap + +修改方式:在/etc/default/grub的GRUB_CMDLINE_LINUX添加`zswap.enabled=1` + +然后更新配置: + +```bash +sudo grub2-mkconfig -o /boot/grub2/grub.cfg +``` + +### 在qemu上测试 + +以下测试用例需要在有两个NUMA节点及以上的系统中测试: + +- cgroup-v1-cpuset-mems +- cgroup-v1-cpuset-mem_exclusive +- cgroup-v1-cpuset-memory_migrate-001 +- cgroup-v1-cpuset-memory_migrate-002 +- cgroup-v1-cpuset-memory_spread_page-001 +- cgroup-v1-cpuset-memory_spread_page-002 +- cgroup-v2-cpuset-mems + +OpenCloudOS 8:下载qcow2镜像格式 + +```bash +qemu-system-x86_64 -machine q35 \ +-smp 8,sockets=2,cores=4,threads=1 \ +-m 8G \ +-cpu host \ +-enable-kvm \ +-drive file=OpenCloudOS-8.8-5.4.119-20.0009.29-20230817.1028-x86_64.qcow2,format=qcow2 \ +-object memory-backend-ram,size=4G,id=ram-node0 \ +-object memory-backend-ram,size=4G,id=ram-node1 \ +-numa node,nodeid=0,cpus=0-3,memdev=ram-node0 \ +-numa node,nodeid=1,cpus=4-7,memdev=ram-node1 \ +-net nic -net user,hostfwd=tcp::2222-:22 \ +-vnc :0 +``` + +OpenCloudOS 9: 下载minimal镜像格式 + +```bash +qemu-img create -f qcow2 OpenCloudOS9 20G +``` + +```bash +qemu-system-x86_64 -machine q35 \ +-smp 8,sockets=2,cores=4,threads=1 \ +-m 8G \ +-cpu host \ +-enable-kvm \ +-drive file=OpenCloudOS9,format=qcow2 \ +-cdrom OpenCloudOS-9.2-x86_64-minimal.iso \ +-object memory-backend-ram,size=4G,id=ram-node0 \ +-object memory-backend-ram,size=4G,id=ram-node1 \ +-numa node,nodeid=0,cpus=0-3,memdev=ram-node0 \ +-numa node,nodeid=1,cpus=4-7,memdev=ram-node1 \ +-net nic -net user,hostfwd=tcp::2222-:22 \ +-vnc :0 +``` + +OpenCloudOS Stream 23: 下载minimal镜像格式 + +```bash +qemu-img create -f qcow2 OpenCloudOS-Stream-23 20G +``` + +```bash +qemu-system-x86_64 -machine q35 \ +-smp 8,sockets=2,cores=4,threads=1 \ +-m 8G \ +-cpu host \ +-enable-kvm \ +-drive file=OpenCloudOS-Stream-23,format=qcow2 \ +-cdrom OpenCloudOS-Stream-23-20240304-minimal-x86_64.iso \ +-object memory-backend-ram,size=4G,id=ram-node0 \ +-object memory-backend-ram,size=4G,id=ram-node1 \ +-numa node,nodeid=0,cpus=0-3,memdev=ram-node0 \ +-numa node,nodeid=1,cpus=4-7,memdev=ram-node1 \ +-net nic -net user,hostfwd=tcp::2222-:22 \ +-vnc :0 +``` + +### 切换hugepage大小 + +以下测试用例需要修改系统hugepage默认大小: + +- cgroup-v1-hugetlb-limit_in_bytes-003 +- cgroup-v1-hugetlb-limit_in_bytes-004 +- cgroup-v1-hugetlb-rsvd-limit_in_bytes-003 +- cgroup-v1-hugetlb-rsvd-limit_in_bytes-004 +- cgroup-v2-hugetlb-max-003 +- cgroup-v2-hugetlb-max-004 +- cgroup-v2-hugetlb-rsvd-max-003 +- cgroup-v2-hugetlb-rsvd-max-004 + +修改方式:在/etc/default/grub的GRUB_CMDLINE_LINUX添加`default_hugepagesz=1G hugepagesz=1G` + +然后更新配置: + +```bash +sudo grub2-mkconfig -o /boot/grub2/grub.cfg +``` + +### 设置swapfile + +创建一个空文件: + +``` +sudo fallocate -l 4G /swapfile +``` + +设置正确的权限: + +``` +sudo chmod 600 /swapfile +``` + +格式化为swap: + +``` +sudo mkswap /swapfile +``` + +启用Swap文件: + +``` +sudo swapon /swapfile +``` + +永久启用: + +``` +echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab +``` + +## 其他 + +### 添加新的测试用例 + +```bash +./tsuite new case sh|c|py cgroup-v1-cpuset-cpus-001 +``` + +### 显示所有测试用例 + +```bash +./tsuite list +``` + diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154623977.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154623977.png" new file mode 100644 index 0000000000000000000000000000000000000000..b709c18e007abba92fa494979659a0b8ec651af8 GIT binary patch literal 15075 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

Ye7y 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 aKHz==kuccNwl`qFkF>bFScQmz|Nj9vS2?l( literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154831524.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813154831524.png" new file mode 100644 index 0000000000000000000000000000000000000000..c001eb7f15c400d43350e32a6163eac48af553d0 GIT binary patch literal 2448 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 Cgt!|3 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813155220037.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813155220037.png" new file mode 100644 index 0000000000000000000000000000000000000000..8b64b7ca2fe05e236100f49cea60d44ee4ba0284 GIT binary patch literal 2155 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 Xw@`_AIDAFL00000NkvXXu0mjfz|dp$ literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813161618198.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813161618198.png" new file mode 100644 index 0000000000000000000000000000000000000000..5dfb907fa78f9c2fcf1b503c9262ed5209f3ef2c GIT binary patch literal 20261 zcmb@ubyQVr--b(qxy>#K z(Di2)@f?Mft7ek)Ph`>JiDV^}SBpt&W!MQ#x4pEN-*G()L9EYCZxf7ryFiNY@%Gu$ zmz7_AM4TYj`Zi@DQ}#eccBQOR^@j(UJLOBC_4Y=#J&mlJyU~s{{tKwzuLHw}n@{Tw zd}NqmwFI}wSibPUqn-_im&la!{ErV8Xs$ZjRnvEEXkBcud?{h4n~ANT@+bxsUQD?7 z>PTJIh5E7DY$%?CYI+XVUd7(OiY(>&P+0C9duafng&+biJ9AqX)*jd|r%57Kv1Rlo z(h7^>=6!-1@YLuP*-jy4{7eN=q^r@R&`Lo`eXc04DUv* zvTcgj&K)M(z$YW^U~cBwoBtqg$EA*3c-p=y6v(tXLU-`|hhHSmn0b;&F}4&=esMRG3^B9jsd0If zDsAju8j33ZL<`&y`Aay-eBLh^%)<)Wyr3E>)$cVlf^+pl>;&k=pOAuaN!?5Hp?c!? zrIvSE=kwnp{EDJ~eHrj+#|VlmTD4TqrD6OiEVZ}@9Ud(l;7w)HC}Ve^h`b_bv60@+ z#+cMBe-3&|+Su12l+*ip<{x??AHTm$ zZL*-!G)K6$I!Y(0^$&82T!{!z6vOi^Cxd#x;iT$5*JocV%Pe!y9)9+zLRu%&l0vw} z?XDtE%*Mk%17Vf{X&PaS8>d3Iqh-02tDAXSM{5Y%NVE;1AhdHjrj2ndvQx7HMt6#; zsQEIy2ISq+>0wx(W4Di@l*^7SNGM`zw|NVKD^hA<85rkL`&taytaX-bi7A+sYBMtN zlCI?L&G;&?_1RP-Z&QVZwm}87Q{dk3ktfSk2ZJ84?MeQX8wahKSX1p)k?8UqgIzJg zhFb`4kUPgW+;o^~XAtpsa=fz!YFFFjaR2fbo>2$2-NF)$Lb%W>&31OLQ@CH`@GNy8 z$u6Bqs^mjPJf-OJylLuXrHRjD!z?ZLt!N4^Jf=Q@XAY8;^T25|9Ib#aRpeak>ZliZ zm(~p9XfeCzHWVk=LabjaRIAcp;k~-xilv@Jom1;91dDrDesNu51N>3$KxErWIQ_$` zI~#tO+m<=vz$sMT;PfMJIrp->d!BhyYO-xfi&CvCK<>cjiBaC-*s@T|k#Y0RaK+%e z)Z4yB^eSz*V5GgI2q8q79ny4f;NL-o66K0do7u#5w&z?cKtn&z{bh(QlP>oI_2Rj1 zXtK98_FApBi7X=>j``9h!)L##S}i(;U_GM2wzvz#*)Uh1o3x1KiE4F1ZjK3*56x8Y z0d3vimQot-;*!g2>DXO7{i+{`P6NYnjeoX8Hk1|Tj1feFjuPjyBadrH;yZ$eQ-yrgc>k=M!sf=| zLYG2k_zj+U35*e#YE_xm&hBI*%f@E?rcd(y1Gdcilguz$6Qjy}eLSPL1_&>w_s{Zw zFo$yYfUsc(SO%O_zHWffsw~q?TWTlr(C0^&&-52@j#}i$dL_F&;w4U+@ZPf!%zNt+ zLE6Jo*%Ac3YUwy)lBO4|bG1+=kCt7T@Op&!$|4;1T!wnmU>gq|!=Cj)Tw?}lml!P> zw9M3YFHV@?eCBIDt&;Z`F{IAyNNuI=V9SDtr4$^Ep@-P^6$;8$=@%#H<2@-Dq6C`6 z1DgRP9D`yqxW>B%cExr`%RScg{a2EBU*HUq6Ls5@XD(6c2@JQKlEh4{R>*WaWg;>-h^>5}Hcwm48*HP81 zgN10R?navyYPU(K+s};S;GTHuSESt+F{m0=9@UYXw2TP>i?FBIR8~*vAg>#~Ua*q| zSARg=j>}?9+I{lE$z)=Uotkpu0fSRtMoR~ePZ+K+D43M8`?-^#?fk6CM$(F~U}v#J z&(&(x`)Dk161BU`R(Nnz3$by;0s@~Ethfa2*C}l!y1`c2m2`=L_`oJS2g7pQ;3fXm z@p14HzmlK=9|hgd!YS{gf$>o+gP@J$WX&Srnl90^t6Res*>jg^f3Z(fBNA2HpN>yw z<*k0+Ti^DJkr8A_Ym33u=pp<;0putc;$@ycn&i{a-Z?1O+vyiG!-nnUx2V$<+{q&j zUz*yjSx)k0MJ3qaYUcw*Stx;E;}qVyF}elEQ&+ONfSv>x(-a>acSV(#(f59+BxX|7 zux7_Dt^%Y-*!jTuZz>ojMoP2Bs~@#r`|8-(0@^CnRR$|H>=@4wOwL4pqp{EHk1#5W~(g=wVS(#}SV9l*+{R!k;1e zxbs>`uvy1Ju!4jy9DPmUpg4x%2V*p#c=Ab07#44fflbRi$;CyM9HpdZ={xCm2k!1i zPcq9SgMXH*Xw!Nqmog{A&Y@1@E4>4`&wx}&FrXc%&x1m@EQX5|!kfXKQViMD7Exqw zAq;Zf>a9&!j%QZ3#)FV(Z+_T5nb7+UwUG8r@dAcvBn5Ooj>@E8{t8;gbIL26a+b7#N;rw%m zTv@W~G{wCop$-EjR{=KAyXZyk-DcH#rDH#zU|^;GI3Fk!ox4TiB2DDgN$a`S4(kL( zm3xkNu7_`#ajZxIK$fK<7eg_%F(>byxIP*CR#kq~B4;EHGBLk0+09V#5V9-4OZ;4g zNi%uqAJf#cgQxS@Fnh2;KX7>%n$WA7@GdDS?^WueI^(v5l1GAFV&qR~Bjp_VGNDw? zOxXao@sW*g2JJ-dJOZ6%)H=N2Bg^sWBm4u*jsE^A!Y*XD-=J5IB3xyk#Bj6vEhZMR zbiKfO+-EYG?w8rqI#yn-W_dO$J9=pO+3wiqVwTU-k#Df{|DrlGpIBdL-X3|*toN4K z!ojm*l#t|f=UVg$!mwNtcyQMI`FG{S+{2HT5*jS}9+Tl-Q%QZdFCznZX2hB}t@JGX zm!f4i4_HO)N>>EUFeojiH1H;;S^M6`Tf5+F0!zgQtV3a|r*q8cNt8Dh^=SHB-0*Lc zOB9_xnTtrJ??~3k`^Yld;7SkGea4v>F!f>(xIP#3wTXFPYM>F4* z7tzjOTF{x?(W=2A^Zp8#bzV*~`BeLSv0X23joI|NfMI`duo))e+l%yF_sGk1@pT#z>=t1fW?od`suB(}LHv#jmalm$CMRKPcEbjFng4o~xauvr0BJKn_9522iHE+$e?7~6FX^>Ee<^Kpr0aUqj4-y$r%%RE0KX6G49QF2vI z2;XjvQ+YZQ3tcS0NTyn@IJP*(4DGY3p8Ke}%*p9b>XfAwaW$tGAe*CO0a;9X#pnkCkr@XoGJo`GHymc z(Y15kJcSPH>i+rzlAy;=B^RH5)Ht{Kv7_%RgDBwX6;I-_4KAxI7naZ?KO`_A;WjFo+BwXZ_q zD6vVs%+c;h0?aduS$o-?vHj6cXh<3@&U1MR(MD}Y(ZrudBa^MzimLhrezOsb!6|ac z2{#w>`HcsD8G9qLbDLmjmjcJvv8VygG3o^1;*|Qc8?r#X`X-ISz-hLhTNF$GC5)zq zFDQyEm<}g&H92D0uT#Am>BBG$Z{2exR{lQ5bfyLPC!X0#S*}d%Qs)%`PGMwQWKHM$ zgLFy;C~;*$+18lyTFC;z`jE8R3x&y?a%(IBR1DqnCm3EHGx}hJ;KfC+!W;tXr5xzx zINmkf&f5r-?|6099Oj&NceqX=E($lnm~y4wDTAX(c@m!1$un>cE!`Hb>t(V*zM|1W zbeotq7?wx{=>+fJB~v}KuwrcgXxQSTj(k{QuaGO=6QxN;$sdm}jTsjPBQ`}>sDb5`ws`^}xb|9*Q4}tNwW)R(dY?ni zL8JJubfinY5JX5Kd8#cGUYRMApgdDO`@NXj47+LYKNHfhmT0;BzQ5n@Q*@9sMY-^| z(9nrmGkyFpDF1p-i-Ujc;n>f^YKo&;Rez zJYQMej3_>)Ov;*yohof5N}%3YT6bD)pgb@2{O7?*s?LN5ix4bDpAph$)qY0|zGtW$ z7K34~a|q@=yWmf8Vp{mPqDacxo6ELg*b!AxWJ|gji`dug3wjzkzXGwimv%s?78pz> zAES8Sjh1^Ot>FtKj^Ok0gitPwO%d@thsTITYJJ6!h2uVE|4Bs(p0mAAwcF6~R*w^B zfYT8{!3yrug%Ry}b}SWTeE6rz`kOCXnLEwlMND!K8yj*}(e_hDJ!gRQ+Zl)F2+Z zDzNGsz(|*Y_=AE+?|7b5tKAtdHkRS7hSP91T|gIU4S1Esgro`)U^pcEI)E(QcKv)` z-9XJxmkPXR*t}9YK~K!0q@B9wwRS|#TGc{hgw|ck1^1VHDMdz=~rH ztGWK``+Mxthi}fu)_a}2#J1k_%)B2uEw{^B^DBJIqp85L)a}iWfHcqoF|CdDluWg~@~!n6yPF~JO>Y}i7rAXF{_0;? z3Hs#^RvJK_YUBKn>fTIyQyUBkhip`-pS%@8IrV)vmU|$*w0OBp=0rYHy46Lt74&<)HtWpLF{VGcLUEk$&N~ z;NdU^G2H0!w|7z@Sfu=z{lUwMRZ*lZ+2gsrQEM{?PCazpvjCSVzGT{6PrqpSL0_L~ zs>>`9uo3P#?`jGjtfg^C{xRgq(DvI){n)mA8Q6|p0K5LDj^bD#r(IP3rXr6fQtYbA z4y>~i2k0l;rI^>d#G1Q&Nkao{8c_bd70$O-YE>>QF0D|i&&2+k2ifwy$hfc8w)shh zmAI7qmM`RH#ed$ERgGc4kL?vEqk)t7qFG|ch}M^YRMJ~I9ftikcJcr%DExYo38nM; zzPc}AYGGDE!tw9aRGwC#TdeQ>FvJJ2#?tVd%` z?H9C*qrr662C^ZHucP^BrbW?2vX}24aRR<{x9nAw3W+(Nn;YmYM*IxNH3q9)8pAXb z&%VwABswu%u}iWG^&&7J);XC*%Th?e9#N)_z{^rSH6+1&?C*X_o{gGJwcgkMW6ni| z0!m$lq4W#e)PrzY1jA%Qf_2vrEh#t99{Q#3s?M-dp4R-bg?yVaDi*h{zPG-+yO@+dqJyu z=rYU{X3ZSaC$wU9^CdFGLO=Y#$( zj|%^kM+a9}d$#)lE069-#*#ylp#QZJ9c&%^7PaU&kIZ50d+h^5J``Y~AEp)r=P}tA z$Kyo-I^{b2-adRmT>Q?HAQh(nb*D?5Llv%D{E~4`J>iq0L&yRw?c^55LEqJ}5{Xlo z7@MogKKA%8rb){H7RyRp9M+Z=LE(F@XzS>ktP zD0{6D#`|4DVNS1uW>Jfs(f^>LV*yEsr6WWq@dJXLePs50eZ%cm!JSQTxt+*$t~h>} z*$=fT6_afJ%-;tm@D4DTROh$f0Q(ha&4i@E8S+(+TdpM!rDZ_MM~DKC^{Mg~#?Bt% zVI!V>z6#hddf2{a*HuU9xwgar19A<#lY$#q-_xVEZIlQXpO^XwB15tZ_gS-LD;+!S z3`+x@K@e(@@HzXX(j`J1@mLEn;xL=A!j;acro&58%|a|kQSobAYxjqF#+)iLKgvfxM}zTO_)Jm#N;Zz{gHELjfB}~HvaB|%?BI* zH)ewGo7V`M{+ld9FTH*d^P6?s_w~D`Y86>9nGfbHvL^5 zg)i^lT2kAElU1dglXa#u5nxxrP3N_qXR|iypEo$C+P3N9URWyViv3+4IivoQJW@1j zFp|NKmwrA8fYJRQU=-`cK3$g|?aMyp9Lck9un>YqkZ_>UdcfnCQdQ;p5YDe?JNHa= z{`n1$$X$nXw;tlt;me>3P-%up@V*F$%tue)7z1hPt?Wk%Dt4Qe8 z{-P)H8Wngk_WR3FPIL9;IT_*w8K*Us-L>ynGEHlR#1zr}I$aaj_bYFn_3(VM;FNpn1SZR^!9faagHA zfud{kU`<+Fg(LGRekS0FKAT~FcYeg69#5a+Hz)rS{`@Tx{F_CB#7s)AWz?TkixOn= zV5BP(CKhB4XJ=2zxtAaol$&+9QrvmsYj7SuR|{WNT!@_~0u+^2;)xIh6jrF_qX&*h zHm|JBrNP(In;zkM%>N3f+uTj2h(r`W)CjI(sg~Go$kIMdsd&i}V~xuPP6w|P; ztDm!Aa0?#uOw5@@FbIn1gX zL_#Eg^Oe5CYT!R+a?igiXP>Xq4%LI%GIACWZp6pe{|e&%59EU@#|8sm6g`E;A(Ua< zkZ59LpB#=w_cU(6$Sr|CeY--th7fnoGQ>C3!J7`UfsI4VQZ8pFsLGMTBlCp;dkzk; zzTOOVrugpY(IvT>xQ6SmP$s+&%Y}Jtq@}+|f=0XEw{C&=;d;|_i1 zk!od05%ejMuqPa?)ZfGb!sABaJ?t|LX_C=&gQ>Agy69&m0~@S6yk+M$=`-Qu#ir&< z+)6Yr5%CZir;*`=M>QjLvMxB<2&iVXcC!?X3FT6R!mOq&Nwki>i21PB1v@+%IDWs` z7B1@P;$CxH9YZQ%r2?%8x*GX}I=ASbA0w{y$-ORn->WmQ#@IHn*+Wm{QeRGB*)%u; zt4uZSK)G<5+2P^O@yT!pIpvzG)&=Jf93RD?um$qlbrSQQ}T} zzqL*bd@;7z^QD=1CP!-CRFSem_y>ISvkErHHg{}rQG7k72b>y7)fcNoz*FXh6VI0v zIyk_W3$r(8n(%SMk#+Z;4?C&IL*2Clgnp1MVW@|383~>taKKaSVe71{qcEWLMUh30 zm7Kj$WvRNXd9IMf*=rlWJdr^kXkAcn=KhqaNqOdXtVXL-DM;J*rPhRA?+5c?HD*+` zuK}&-r&}@O+h_%}Ai*{x9YY7KZ7+B9pfn?`9HMyBYzaExPtW;11XL^0+Qdbjq+?Sp zoDJ(WUjtj5zi(r>MMW3EabBUY1t~9@^a`vwSe+DQ(AyUeFeC3fC%0N=mUtgvjZ9Jk zq_KnakcLvVFb7h#O3Ay0bVzREc$HVf%{WhtB*j?a-Yrkx?784YoFCUTa1oUTmcinf z5ay^oz-zD;m`*afsHm;fD!9G00tdoc!8RHg*9thy7IXf&;@z%*< z6LNpUGwk=5vHZ&u2?SA>@(DZ9pca!;VZnYV6f^O6Y0-P=79(a&HNsr*#G3Swh{@DB zzmy+%eeN$YOo+Qb_O%n?k0>oDxhiTIleE50htIrW43jvX!Cr^AFU%cCl#^HiPrL~FxRfMbRTEIF5(epFT`EGTQ_kt%nn{x@JLA@C8U|GDJ3PO!LDo0l1 z0O&Oi^~NmPT(y;QgSlC`Nvefc!JU54d!14j)v^NL}vK^ z7@2L+v{S@J5X2Ns{!fuv9nE88HWJ6XOf5-$NYn3z*&f7``R(7tP~Jgf1i=(i=@3fI zEV3k{7xsQn9~#4HY7VEL1@r@^57m;`;X*)=kP-h>;OrBW0Wl*aWtgo8HKZ49Vx;e6 zgT8_HnH^TzI?wA4$xh`IAnHqVybM*8Cn10~oupWx_C?CAu?&6XM<`cNPU7Qz0+YLG z@JPQ&0R5tphk^_e?+7hAm}3(4ysceB7CwDNr$*K;q(`p$JZywUu7b%GrK6;-rZ#OvpFO3j3E`Vr34SGo2#DXpz!W4IR zT-SDb`WC+kh2+;Eh&58Q{M1gY=t86c3ipzI{!#=;3N;Ox%r2{vB>@2hxtPDcT)ydA z$^Q>ds1=lxEpG%l^Yyd%RdW0*F1)(V*Sv(RQ4xO+*yYooYP7Bj!6xCDG2F^4J7dl; z?^6gtwpfR#7iq@lUNQQm2}yi5$El& zBtPJlzIrx15IJ&o?>JCr8sx@l4iCfdTj{mrzec^~kX^9BA-b74*|RKS(oPA?%3E#g zJh53oZCYZ?hhN0fZwKF*suh_@eBHD>Z+>n_{Ea$)>}qd2Uq;M+AsCuB^*T;PXnE-g z!Kv*_NW~4XO>HK2O@&xDjHKQ_ix8^0sq(ce8es%~HLffjRYk%`^52p- zi|naClegE&`6q)L3w~7|ddzl|c-g_!Z(AdTk7{kV%P}_9wwU<`y*-#JG)xn zfBz>qy+H^CR1(cqa?UkeQ{^3x-%mz=G{fs5?W0>SL%(bK`+atQ^s}>$PRjdhZSbvE zCMf8)bHWolvJr{Nxh;W`8g-l|SMtq4&mO?56+adzJbs6JG*=P8cVqXPGmEf(2YQSj zpeP+8g$GXA!ahc8Op51i)})kAG`eJ`a<9!eWrqf#a$`+|K&t6jlZ~!vZZ^YDMP9Tc zxUg^k<;EvVdi28hM+M90am%g^2jCTAg%HwLPp#WtQzW&Geuz{7nqIErUwrE^+q~h( zd3u(74TZWXlu3Ss^?7fxdxvMGCpwLOF-q29CR7Rwq$Cv2YbM*ZNHnhl<~B#>O(d%kfwrHi)M* zG`8@NQRdGk)~*${%Z-)N0K#WarRl!jPZHyF;$?7efGA%$-LzS>FJ%O?&#&F{>g?(` z$RFM3fapZA^Lq92f#SaF(ir17{F&*&01KGR^q`cBX77hJ^zmwZV}+S;-Cd6-Qss?+ zK7Z&WmX84$E}jX~($C|CQQ9jTd0}&E26o~X1-exq3AiOpou_~-P{}dyq}_IGKB1z_ zdeb5+=8iN;{ZL6V6CEhiks!MTrj^uO*oSq?$Jc)!D>$e zHj)X+e~xI9pH6U=j_1ua^Q}-y`0z`fy=e(zhE{Iw-1iY(onZM9JwV3%utYBHVAj^I zq{LBe3emz*eG_v5 zm8aEsI~#THc9i(~)$-VaT8P)B*+`W&=C4pqOVyBS^}eVA?}l>Wf)B9C!ioAYPhNxP zvqL8T1^h@#{{p|+OB>flkFL-;=(vpJARfW`03G^zz@k))=BdZ+o`I;vQ zy__gAD^vYeE=FhSTyJYnu%boM^gVjnJCof9K@$B?L;Z@zfl$l$t&33W#xRP914E%@ z%4eO$jutrEmDOqx6|hYNGTNjo6@0<<_)(_VAiA(w016d$6nbqQYgWG%nL{QgW)VDM zctH{BA-PT#%_9?Lx-jAW$%Ip4c#oFM;ZC@C^{A_xp^rkb1U>j_eZ^D&j;%qx)l&ny zwQz?nDhkbmko+7;M$OyW_5OrrVUm|_AsgVhhmHwQW6xLa?8!=>Ilj4EYsrf$cXOJC zv2%g*I4gJ+sTZCdap5`r?7o+m$E4?L{yXTaYp-rSZ=wEo%GEGcsdrCqp&eq~C+@Ld zI{Zj@#A<{y_~OahyaV^ji`XixvA7y0PNZLwJ+JJPh|ndp>TenX)Q{uL#DR5`rhL zt$ANZQ0v~TrHY2|)I1WSiFO6@fJA^%mg?q=#H*f-_VLP%Nqow7Tyn!yCO#bE z6^k)@%CADg6cyFYA$E2^kFbdR2bMlPN)+c}1W;G|LhlhA4TCo=e{qD0Irc&@nzG=5 z{FfzAyoztvR>F@8Hj~#1j+4Xa{gZ?5+}W!wr3y!19y1hxR|u`10XWPUXy2CD_P?i9{Ic9ZBPkoLur~M#PT^WG~i+8Vb zS*9%IUfgT6)LpUEoIQ`rKwBw(c&s#;XO;p+WIc}!tU_N8->Zr%2)hZEA)@fL&}|>% z@EVpsc_%pZ?j5(ns__D|v`?V!aa_jfpv3D%)1Y1Z9lmlpPg=&lSvQ_0%hxDN04dS6 zTER9~d+`~1&;gw*StdSPaC)$eHwk3ODC~YevhB=*WFJF4^jBOJBm(W;pclADX};_N8$UWyA9`vRYvq_GZn#qx?eDy$$5L_Ijj zYh<@Kf>hOTGsM=Mwq4d@fI_kf93+?KFJEA93Ui_$T54H?YF&*QZrVf73 zinu_#8YW8--grx%?du@-l`_?oW^$IWf-O}G70zH;D3|>eA&v6)gWvwpqPv4fgIlAh z*!z4wv65*IJ?i>SJj7~j^wr|l6M}tl@hrCdKM2x+#-mt?b6=)YbL>vgo@u-}EGF0; z*{+zL@zDHDDaX@qS^`OfPjV<))OpE=u$oJkM3liYB>sNK?K!doa_gn!{;7frvBzUiUr@OtWYhG^`*zVk4nsX;B z9uSzsDkilNI)W@Yf+n!zI?(pfg+Ph?*5uQce7~R#ipwD3P@u|}%0~X_K>!qV6?v)a zz1qDn&waPVbX#8evxm}CYkTd%|9C^cL%RFKp`-s^e(g@^Hi5nDLG$)?1;GQ+m4C;j z`$_CQ&pl>nrR4gX+5-%}yW|J%dJui>>z9;}2Jf@d1~Glg{ITUk=r{jNc3Y9Oi}{7Q zvH1?!MyMnV-NJy!4_r(H`VYC_Y5zA$gP!PDhTm^>t}EM5rm);V{^v#hCq{GIuMB{8 z7d@2xJ)lC@{TkvD;T~3r-t{v{lNoI}97O_()|m5t7wCcQFeh-HWn!8;M8`AYKU9YZ zzKr5+m0f3SZHVpcReCAg0C!YqE66+u!f*Sugpc!M^b^3AR3Dxh`lT_a4sDoWJu1D? z{?3MnS;H1>A-5sJ`>Q8D4~EV{Zc1K_&7?pvOw!2jp6KcarN5&+>n?l8Ew2CdCcBZ} z=;a*$!a5BHfU|f(*Vl%}fhlKZ>#TpTi~V+mwf_{El75Nsvwim+`2!0%V(Bx@3Ey)5 zJyJ?;06m#C@@0S;8He4MO8`9ABn<(k!Iax;dhV|7rb!Ya`~)-X?0h3^M?4n{FH(Lv z5L7d#t74o9csV6p>QIm9b6x4-xEPxlJ3dhw74f zzDD@L*GCs!HVhgen~JR6^s%qM?s&ioG`utSdE(H1*+$q771Du!Me}1`fNR$SCcMs7 zlO+E9*Eip9H{(xzd5~p&jG>P*QJloqt*P^wc3G!1Fc<;D_oepbT-hM)(7F?hfA+hV zyuO+w8~8-T;2)4^w!NX|(r7Bm5rfgbf9s-YEO<>=;;JiGCS;ur_gLmtteF!!8`~v_ z)6Bl@8d1sbxa6^_tW@#-zR=_MzKjEl2BA>BYj&=M#wx!uxvF{S^P9o0Ry9tM1eI0C z_MOti{|KHdetN)YMx&kmLrgXM`oI(K?5w5Pw<4!#v2>TUg&NZD^A_hOT1;EV>GHWO zUH-^m6aL;`+f6yf50MEcbX0+-wQk1j2&sG+89TWKKfKg>knW!ofjw?hOv;F^f*^W8 zlTw+GO=Am$6)IxtxEQ=5zFolZEsr%#eFEw*8fLA8J5QFB&nX0HEtJ1V+6B!v^Obkr zD;Na0Jhw&u21IWQ-*xb*vjOY3KYPy||7>Kbrcy{jH8j&?ja@rlwWHe4- zIe@;Pi@9G_2Qv7gu?(sLOku8xH;VO#|JMhLw57IQ_G*lub6`cq(B6xr6mYQ)F8)^l-Fv}G>NRxb@U+P? zU)gv#6!K7V=yQNGK0EU!i1y8*TRGcpsa6a=6Ix1I~cx3BOTzWM!X>1#q#q%93=W1TAh zp@+!8fJDu_1CTtZ)Ywj*Og&!_e7w0w=-*W8&@qw z5k$$E2Wim%9e6sgQFzf9&MVP~pGew0Q_xlT-T24Q${81vbrmEMwD|zIAx*6(oglP~ znZQ~G33w$xqO!J}fq*k^54GCBtpBS!M(Ex+nB+ypjV9Pysj z*RRW?a8gn|kJ>z+e@0h!;lwfaKBPl`uN zVzR?BOK~8Ib*QJ2jAK@gMHf98y!5of%E^0D(l9ZvP1wzcK9Aj&6$iehr5ehi#X+6B zJdx`P!{t$E#q=kD8mDUv8j;O!st5z}Ek@v@O{cMJ0H?fgbRz>3sWfmn(YqE}TC?(Z z-kC8&+UBHy%r?shD74LyJWE^S9eXiQ*#cu196L=xi4``#V!Sj~l-gjHq&JK9Dp}|! zqt<9atjho`qQW`V@EFki5UtP83=C7COW`Kx_-ITMdrdMW+$xOTY;P+{z)iM`wwY+y zH}=!!YGG~qBx}v={yt_6?s&<#V-Y>kUB@jF$IyuI70idNJX%n-*g#V#o&8qt{NhK3 z%R>}neT19zU?MhAUabfp;|!qVn5g0~zxo0-9>R5)+=Y2JL*TtL!Zi)#w?C+jL3jkW z-{&u#{>5avk5OxRw{$P?!rl2RI)Kb04kJDO?lEETq(>snv7WNcbIkFs`ffUS1N)R= zHwipn@Bw#hy5hp-`w|vcWhnL1D{;GEFBNENYY&%$4Sn<2u>>KOEcKE^LZW@=;$#Mf zk^M!ozKh5jxMwuCePQr~_x@%qUVHgoY3BM8`heT`$>Ei?pi)~~4y<^L(56Zlc5^wt zS*!;ogD2I`Q+E%b@Qj$hg_JH`z9Up7-t zpvT0oLxp;=mOJ(jnWOiKxo%j|Ue%k}zCao0S)JogQZx2%O6-n%PL$U0J} zZJwF|U7!-tqNMYoY>u{zH}kx_#QIOjG4vSspd*~-Q(htSrg-L+Qg5InKwSV~tMY?@ zgfi4jNe}sgMCtn84$r+M)_6P=#X`RSSBDams{NODi=(qmmmNz*YyT>+H z6Iep5XW%>M+gWY+(}h zp@ch3Ud1FdhYtM#*+75r6Ck&t#pH0}bC)`M^C9kLnh!{Y(anZm6-khgnQoze_qW~n zIPw$29`_0r45H$ac`4Oti zxNXR#?*)qYEAwZRPuD(C;Y6`wR9&|DC`W2&H|yBnOrKxF9lGB#yInsHj#fd@4)m(j z_PnMv;EmJ^Zid>FtBZ7I&y3yQh9q5})wznYEH{E}xyaA(0{(Gkf$tKA{I-@;QZS}; z<1;f9RqepUOxBeJ&t`lVAjNUmghx)y>T)Z1qc2ZW;X zmmYTLd@|$sU=&J* zxzLU`@_IA%;Q~@^>b;H_2WuI~?xe&Z?M~S<+wKm1og2 zwpHHixDsj-3!1meG`lbD>(?aAayKDXIq*b)beZmal)DEK+R59U{Cea%3e)n?Vg$76 zg*NF-d^mH$4t2NA4P2gRKm_C6g7wiu-2g+%QZsU7-F14GVf*U`9=6n4@6qz!nV;$yB*e zqCwj_-}S*$rc!rdT)i)BYCs6j7tORUbas%A_R&q+aZlDhx=GtKGiB?sC_mH*m2fh< z3YsMl+aX0udA>gKEd>?4jRVw)24k8+v}yA^Srwu)7KT;bVrp_fOE^+T_lcbUDEz6^ z(xQBMlvh`0>Z&$yprvV$+ypk8QI^9>fv}ol)xiSc6(64Z{#J_gQ3Z^?{@hCh7p5R! zc7ypOkIAi*HcOQPSr)Tg@m~OOOVkp*b59g@G0h0vIZN|6Vh!nyu(A-;`*mRYMu41W zLPE(HYYrT=PhPMVqvOrVL|hz_o)ZE%v%WJmAPLj3=<@7Kr!C z6n&KeN03I=i_SOB#AAjpqQ9n{v7;7j(F|VlP#tW_ZUWav;0cWb9j{fd#h>XADj>r? zL)$W{P;le>00V-M;A?Oj-nA3J8{u@Z%boX<6L9V6c>DvLA{ z5!;>cEU^HULt_()WFW*AMCG>NagTxUEESILwYMq+t_Y6g|f-$eSsh(;_iPQdB9nt&cw*?Fcc46 zKQvfXns9zm&2Rnv@TeIApdIyLeJ(jR8^r7(iW59m z%gH$aRXNo!n3 zKB+%J#R@4#|>9jEAx&0UuOP1{H~E44;D>3csojuQn4#a26Pbk z5788pAV>VY@9eetpwhqRLEE0iXVobSf4_bCeoY_vz((E0y48pATU9DZ751&rz70rY zJ7*dQsag3_V?IgfD5X^G@*8E%2<^0VF>+n(px`t32CaN3x=6v9GTH(~LZ%P=Y|5%F zjQ7{d<$UT>V#-3+wuXgQtv9XVWGN74+YGTK_louR)OP(P4VT=a#nqN%`#8q;RNlQ% zjzRd1ku|X~`piZDODKsd+PhgXq8%@Q%VfeI^nvrb9 z>u^vzN#dJSZY5`jVKFvnA?h`v^`@&6YO!h$JV z7Jboy$bmy&;Q52=BJv3VxE9hHlDIGA2DWdTbKATsBPhMR(p6c~58GhH;hQ`3f>-kY z^$>06J$M*D5=LT}tGdE-=TcB!?ro1)HanPX3do?rvZKCszrK6L?iEHjszK>K{S*f( zCL9FcqWeuJxlz;32NnhZ+Mb#zFv~*(mw8lKI{h016S4nYG;Rk8gq$XJ9@7huqo$9_mTzjIod7JB^{HeVl!kR=?cJyFo#yHl#a(T_BCPY^$UKlJyA znq$^hpB+TmPi{LBu!?nbu+DE7pHu|D+QCNc1StxUn?44txTwS))bJU8)d_Z7r^Wf}! zIfLqJEWg3(Mrn5870GWR70#y*JCQglaD_PmL4(*v149*$R5uNbpGr$6cxeM`prk!8 zn~D=1&Q!vIhASP(J3ArS5g%54jD{nn{)a$`h?Y?w5LMMw$`T`|@*D$3CBMLOH6n&v zuxYd`uWC}LMHWwg{xTExMpy5GAn$qb)=xgp`U)1>g!atEpOX#|SoCKhAbP*=|Aq4? zj1fPH28bxX$jE5_YdY1tFU7^&0C@Y@?dP0u5PKD+YC#-Fu1BG_`2=0u=zRUZI6)IP zyUKM7CV)i{C|m!QL~FguNO!6RFc0PbhIzpFKm0$&(L`->XOBXVyHc`fm3%XV0VkQi zN9{)7Gd;%NrZFJS)Fn=u=kNEKY50J-yK{J5Dd*(~?+S*};b;FFi%olc5n4Vz> zhfp^B*x1SL>PI;$N2OQ2U4(-UPX7zh*ugSl>jPMa#vJD&c3v%xk^v94GjJ?mm$`bucX3hrt-YCtly$el{)=r4@f8Wrw4Rc)ZUMK zmQ0mws^zQcqA%5ec_k!@1Sr5?F+5k=?HiAf7XfLejgqJT3-F#w&c4u&FL&nD*t3&9 z5{h8A<;Q^+%yKk9*iNbVkCf+bD;SPx&H>!mgdR(T6DTD{pYq8#S=r?q4ZDm=wuZKS zay8z!-J@2wjPCgd%4-s!&rbtcC0E7*_xTu?#NrPTdeebb>K^CEYXX``8WIi1S`~_( zb^gx=kZR-rI~{2Ff8plaUExF@>t!o9ysmJp5St3$HwF($zR%fn-KCxY1~*uy*yHY_ z+ZuR)3rqOpop}<2{-4cYR7_o{xcJA-U;A#^Ojk0wTzmgmx0l|MxNGUc>QxKM^?^eM zTaE&c{7_q%D8-VJ9lZIR!V1m5CWu+*;``S;Rsd&?1Q%8;G80>-vkcf2S!afo7Z!yozBy@HXo&H~Yc1Z4C7mcf^008YIsHZUuYsXsn+wSf9y0LI2Q*UrdcGa(gdmp@* zyZlzzO7y8`SH7oxK4HJVEp$q-^bV`rvG!q?+IDqdA6xR)>*VJ5i%lv)= zr)#J61f7m*T)xTu&yiCzzf9z-T++}f*Ya~_U%C8=uqnnLCUhPtTE=|L(C5kB#Dd%H zCsib^&phB{n6M!8D^FHc$lXmIVGZB%bz6`5$)EK+RW|GEm2XdEr_D_|B0htazd@n$ zg-3NtTaWzD^Hn|i6@PT5NJJa|{%+!QL#%P1+Cx|F3%#K&`ZY3GW}v^-iJF2&{?hfA zt?H>^KNUl8-ykDAaoe_n+=E-Z1YSJS zyCiPMhdLGQ>}Rp-E3TPnrR*17agKA7u1suLJ@0qmTXOco#g4C4t~&Q?&c3F7L~gc5 zweF)^=Yf3+MTL6NE0R^W)Qc}!tvFwB>U;j|9k)@NdQ*LWZFtTrSF!%>v5%43A@4tK zUa)OD-{Ekjf^|2)vd#H->c8aeZAzhXH@-2=EWnD}cgG&q yxcoVFz6Lmz{qL~-|5weivk(8Afn{>|&wn;fp`Pd89)k|VWAJqKb6Mw<&;$U$EzHjV literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813163729651.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813163729651.png" new file mode 100644 index 0000000000000000000000000000000000000000..71f2f53325892be2a5549ba97cbcce5330cffdb3 GIT binary patch literal 18417 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164446290.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164446290.png" new file mode 100644 index 0000000000000000000000000000000000000000..86054156bb385d83550aacfbbab5e05d153086e2 GIT binary patch literal 2719 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 Z{10t^l3BINvhM%@002ovPDHLkV1hvdazp?C literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164459881.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164459881.png" new file mode 100644 index 0000000000000000000000000000000000000000..f0fe10fc47b6f164b178440bc915952e06b145b3 GIT binary patch literal 2136 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 FV1kT{F)siB literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164526945.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813164526945.png" new file mode 100644 index 0000000000000000000000000000000000000000..26b97eb88e36190e6e2a905efb105053c2a456f4 GIT binary patch literal 3178 zcmZ`+X*d*Y7aq%uWz3B1TLxLnnz5B_k}^bMLb654nkn1FP-bi|Wf|+6J&Gtx)}&z+ zDpBv0$i$4KNeolA!Qh+TuRq_9@6U6cbFSw+&wZ|QpX<4wznq;;LWJdn0RR95Wp~^K z0N^p^+Gc_v?%Go(@DczJF+d$hqOqmSGOHl!wA4^8W7ZfyJa06H4Xv*n zg@1Q`McIkW8hys_nJ>9vnXt7A7v)DTitbHD0R{0&ZV;d`UMU7D9L5bQNK6RgC(JaP z!*AA40Ru#?7&6ivr56X0(K_ua=~FYblE%Icm-eU4PWG&&C@-&wZsP{!An_ra)4kRj zN5G81W0&6UE!PO_#A_rH?huwP0q@mB$`*%%W}VGdiXe(FVmLCREkIhBEw$2HV`NrBSFh5v#+?cu#-v)?i zcsz7Z_H*SzF9r*eN3=s(OL5lKBI4=za&*Ms^;0Q7ucQ}VY3e;qBi;vp1f;?YgDUcF zJZ4pv%z+c+Yh7{DALs5+LciEe2XJ_Rz$zf%=E?$*v><~){#Q!1|LI_ zR-ANAyw3#CS666`Of_$kTvz>eDtk~Bv%t}MX!zZtNZ|N zFC+e*G#Y-#`Bky|rn2CGL(B<9OwdiWtwDel{IX`5$M?z1hsU>)wCQ}xPJ=iVWB6r;T2)R8XJ_y*aaEIm6k^GMsPXYiNxY&Mj2;sT8PWQK2zoW}GN z8WjvfUfjzqwsP-P7*b3feVM74oFkj+PHNe+_YPjQ>LStk$W=UpGBTMkKR$*8 zw-cr<>`j#t9TI$9jL`8{goYY+N3&0)6fQ#w!NrI*=UZ^L7BU~535I;z5IV2a%wY2Z zrUm+%O=wnuB}oS0p=_NtMRWo#;bP6*lM^&PpF|BS7J;VM>~wcN)c>{8D6js_gm1J4 zA$oL1?c9PMU0}pgOv-w8-uCiWa@}UITdPR;;r^6sX4kf=azMS?=?9xv1t;y=wvNFB`W8%|!!8%AJ3TUcvW~Sm zLW{0SQ1=R~3bkqBX#1wuO-2Vb1$?%*tTd8&+d;i!-)LKl*F&D zS>ejbQKSv$z!Qk{0hvD1ZpPA_K}GO4{yFlpw1*aWrId(lODl9f%gHCF*12OZb*6K}9J+-TKghXhY~} z>A4NHNF2|Xmdy@OX!(rAPE=x>t-Jt$b-KJet;a#ysZ*R5yU&H>=Z=Wphn|!yI2mQ| z=+5dp!al0xNL&+2sCW0J0|Q^E#q72ZCpJ0sbauU0_gSurHL`ss#4&9(u(M0bBsEDc zbUv}nq*;}_jdV8HZE~WMYH0VLF$RX8dxPKK`S9(-uCVizR#uVZ)PYcUw0UhvHhX6* z##Vd@B4|9^80qoYcSDsnvI^Y$ghj1v7Q>~P%WFCE6BJS3UeRo|qpXkzlinW7%bj1< zPUUWnqXqFER^UXJft4So>aWu#x^0i+m3H?$Si=Or+>g8gZrG@@r^on_qQTmw8Djj% zutPOVNYNLg$fVm!>1707d8Fu3f&YE8jR7cv_zUVW;cl%Q1a?s43UICxC5PJwcgYEP zt1{-JRS|k=Copu&b^o1~5ps0>sDYCd!HdU>5IVx+D%P^-h>+KApAYRLBjR3XqeC_*&>Y|%}nkIOJLLMYZKF22!|takJGi>_!ARU1rd zx%i37iy{ze$dUKRG&v$DyEWfJ_;u{K!UtR6yyJF%hEgzw8+AH_BDl{W4r!(wVGk$= zV;<}VQ|J!%?F}zuBfSTx*DKEFo#LEFQs}CXEENi!D+GX)H(o#@NN+F&0#C@Xjp$K`1E+PUe@xiU3 z(4ImUqR{JIn2trYG|E;r5f|HxQrZL7LtejV5+i~%f?4#iZUpx3qp@MGeV0OC**JYF z(r|ibxNup@*inpG>%3lQL!lo^sUZvb%X91bEx5Reg8qy@&X!yL|7-3aK?dONPw(WO z;L1(;2^QO2Q6_@i17w3SN*sklGkN4qOP#3%yYvU?YnVYANxIkWb!R;p51{iBmO(v51idH2CF^Zkp`Y;{*b%sM1Bx$gko1`4;wcc* z+Ta}+i*Lm#tB4+WR)B9LF0xa(+#-U~>JeSe;9KgTA8_I1P$KAtO_v2UKe2=X=Gncq z=5*?>F)k3uzd){o<+srz})(X zAlPW&OXM)qlWt*51Tos(CnX)bOq3?HpN?L5l{l4$GkGt~xjd^j!Z5rv)X7H#`D&>` qoJ6U=$D6+;l3T>@+5fM@kyigP) zJ!s?17KWeiayu7+gn$WT3oAu%3SOUuiT)6&jp`VOo{rE3g`!Wv%Vk?@_%p9FLXGVJS&!nNF*o|78)%w_rgd=&I-R=uw=ZjH zj4PA!pKe0CRIF>A{Dar-%K;pjG^+^5ZO$3tEL8i1!KD_|{c>bR`qZFQaOmDTC?z9w zrdscy?+j>Y{`s14V@0mp`&kP|wG>(7k#Tm04X4^d#iDbX55}wU0OeW}BcZO3CMB|p zcwij5!Yna0V)|?^li~ZcP~dm^I>vBNCa72QyMDCV_;=%5zkK2iDNU8>iYtFF15H z4NYq>7z0n;(9M%OGF_*mX*3=tC>0CWe;YJwWnONz1tXXo<=P3ap7-xQDd<9~Ia5-!ob>}P-`QANYy~ZdhLWjCWHPxBp0S)i`{*Mt8|K_Nlpo|CH1UEpNi(4n+MAC6? z-v+)tbY>pNzIBJQRpi(=?rI6;=`P-gs!jC5gh6*Tt55CjfJvbggw#e!Ve)Vjnky6A zRXL`}fbYR%(B|f0GL<%^QnBdRHufoWwJr{M_QjjL+QhbP%)=3l%Rw++E2Uy_ew4%M zy+tpjf=&?YUBR-wwaWMW>$q-v!6|)LY^4 z1Lm^XX*{Qvv?jWW@kp}a3|la+Y;4=jI2sQVa=RP1z%9_f{FR=FakMzkR$g z>;a#Ff{wj2prKs^eQ1tf6UTo(a;`I}#avglgfbp+-+%}qalLH~j z57M5BMW<$BUmeV}DRQuzOSi*}_P4(^*uOS|FsqIFLo^2Xe zCX?T*v4mxbbyodfFPMkPC-r~5V4}R`Rujro&EeM;y|`8&{B-1 zJ#^43$EX}oDmVccoE%@7&jS4Y*(sd>{I`m(ErXW z6Y`8Mg*0B-Cg+vyjwN)3vemsj{28ujLP_3HGD-@>IN|s;l0Nm;F`Zh`jRK3lpCPwuU%cWzJ*6Y89*EdhF?ZJsUSAEb}E;n=tqiN(~UwI(L057gLUZZu3-0 zUWARKHN@H4=Ac?4A4$W+L7si9SfKaJ3*x#uI)R5s%Jm^U87)ug}4cxxo09cdcf=-Qrm#^)kAUU-gO`*9=uS)=y;j}eoC9>4DA z^~s62V_KO`+XH&fyu^N&Yzyw1nT;J?Z=G>G+*Hk;zWy{D&aj2{&;hYeymWZD28-(e z|0KU|6Mcq7*qw@|LlBzz{oTOC8$Pld7~a_uQ<@2b+Y!Z6aW^oW?#%ZLidRFugL%Z% zj32kdIrp7Xio)e*l^ssiV#a#bx+@l)T9Hv)|0O+#RBd`| zDMLz;_Ga4PLeIqslVRF!V8-)Zv38hh3kkb{G3BQ{e-=HKZNnM15W41BciKOO6lax$ z+t}@%*hz7Z1-u7wb#E5&j(qdmC6T;03p~Mo!1h+;tI9FOEqM909=Yw>;y?0{wXiOc zNTyi8S+%*iEn%O!Tc18_^P0mt5`@-nIKD1nwM4Q>ERY6DBofKTBi{{_NF*D9bXF3H zWFwHyN+OYL1kzbaB$AClIxC4pvJpsUC6P!r0x4@8LdqJ$^eY&lS2*TTnvk-_A1`Yh zeGO^e*LkF@@n#@pjbmhVt4(yei6V5_NLl0gSWecM)`id?4F)?A8?IP%JcZh+K9jP> zQr38rWsPZFpaq4wGB@QJWmu+>vc~T%YaFJ}^B5X&hhLkmyvc{V%Yy93w zS>rIP9S>27_3iWPo~uIY{`irTlr?t$LdqKdf5;k7$r8_rlrqhKxDQg^ulr`QMS!4g-#z&E|#_K6-JT+cR z{rh++YrF)TFaIlLjU|%Bkg~=fiIg>#NESxQ8h->*)>tB08Yycmkw`Xz{{aJm?Fsqn RWAFd~002ovPDHLkV1j7P(l-DA literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813175842360.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813175842360.png" new file mode 100644 index 0000000000000000000000000000000000000000..c2415fd5c5d888b28a8ea47b61792013f91e968c GIT binary patch literal 6329 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813180012630.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813180012630.png" new file mode 100644 index 0000000000000000000000000000000000000000..d766a73561d004d8a92f655aa89bdd33430850b2 GIT binary patch literal 22187 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%0AyX8qk&b?=XJDqeq39xibU!Z2YB~ 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 i{~XQzJLP+#Hj@)e4hq3xd`{o#j_KQXW@4rv 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%0AyX8qk&b?=XJDqeq39xibU!Z2YB~ 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 npQXt}U literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813193042254.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813193042254.png" new file mode 100644 index 0000000000000000000000000000000000000000..51fa8ccc46e0cb4876b6d9c29cedcc2270b94229 GIT binary patch literal 6840 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813212218088.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813212218088.png" new file mode 100644 index 0000000000000000000000000000000000000000..c84d8cfd70d7230eef099ef0efa8947c1cb43bff GIT binary patch literal 19318 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 T3dYMt0B&;9N>XJK2EP9nGI9Zi literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813215939420.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813215939420.png" new file mode 100644 index 0000000000000000000000000000000000000000..3b906a63ead6a589bcadb29d5aac7ca55205a731 GIT binary patch literal 49471 zcmbrmbyQXB!?sH!(jf>)mvn=42q@j%4bmYUlG5GXNJw{gH`3i8z3BcXy7zwf{>6LF zcg`OU9k9URa;-V9=eqBkKpCkIh%a$of`Ne{ihdN50|NtJ0Dc9&fB`DXRPpzN9A1@R*UoT;1LKD=Lg^>GOsgSOxcH9lyQn+B9o1?EO;^#Tem`K;$BbI(_w(7jkxRq32 zq#$@)aQ(U7utDlUKvZxvLsT7n-vn0A*OjIyvSS9{o$_Rrl)n6usfJ7T13i;-MVN)h z;c9P~Pcq>&Dq~3~{y|dc_y=dflI(~p26wd#6{-v*A@Vs}S6?N#gk|i^wPJgQpEGOM z=xpgjr$78q7aK!HX7GPT^XX5})qWV#!F7{hcPTTYJ;#w6gXyIA&!U?p-rAfAH%B%< z*O`&(a44{6Xt2=zA(G=Bdx%BL!Cci!`#N29@25L%-V$WrY76Jn@pt%>W21mPqNBHO zswn6p8ruxFXa|MwWf79fw!b)d1Xf%-XM^FvH`yCmXJ(I~w9;&VG$6NEvd}MbLd|rI z6&~*(a5UV4U)#VQj(Uz59NL%Y1_bZ4L*`NQ)Bl)x)U4O^!!K%-{4rj%canD0>5y1u z^Ry{Itx4phm)(nKQPCk|xss7!rwez;aj)0z7xt;K_>p8?$9#6qGLCTerx<26VIQ{n z=da~nU&Gg{LCtI*6~*AfO5Z>R`o&(YyJB6{sh$-}zMvKqeblub&$}~yHvyg#JBPzF z%i4wmX(YL`m71xOJf|!+;%1qZpbwIl!HVj_Fym771`Qf=uPV6Z{itaW zBwx^KQD50nxH4?jC(?+|8})PFy4{H-oTDU_Q~eZrzdYNPGa#k=o>?w(rWFIDZRO>s{>u-#;Z25ZLG zpX5XkMSc)v(V=MX3AFAp{7a|X^tBbN?0%?TSrurHQbQ*`(M+`G~o#k6vRrrkwmah z=Qi14uj6=x(LWIJkZ!iJgCwicT=vB)qQJ|$9%`g)YU*Dw4ERcc+=qptxl!q2OQDK* zxXl~ySM45_9joRh(4J;I%!+}lix;zy-FM|b-hJ)^r*4xzeaf!;#&^_~b4GW`OSDbk z?of1ui);GJ6k4WE|AJ1>5pPPp9M=sM0<)0l#?YRd4?JSGI@e`#WwfQ#DcO&V7U0P~ zf-|JgK8vLXA!O3|aD1hdD&}bqskYYqq@UD>9cByW(Mo!0RZ|ojYV`7)#6)G4j3KLd zB#hkLlIKPRMy6*Ew(SnuzGc45;;GdHuiUHyU)C~QM>(!6jhnC+)2M4d(!_k<9i3A{ zCGyo4ie!601^8n~ujuuId6-T&maZk7T!>Hn%G&48l`kwQ*z6^Mu$kTs=N z?MpLZdBV5m$g1#tp~72?!I;nx6WquVxWjAx0K9GJrqH9Sa%@ZToK75{I9BJP^3KFy zr?^+cx&u7|wpBExk5m#e$mvzu2+qHpjWTnK#(}mfReK0CSlsE*&2BZ?J_VKNoOs-$ zQ4rT~1x}+MOM@UtD%v!dk&yW7dAupuL5W>eARd@Jvg22KFw1A9JGA#^WZF#F2Nks%9Nu{E!gm;9_#H-|#R5+BQ zdwhLrUS}O&aA-pf53r_V(8@cfdk>#=XPiWFK`k3lAbE^~Atijk;Mey<+vN5Fma6ni zWjd6IvIL?hsWi^ro0YqkDy)$ycxLTVIb@#BZZOxK0Z$%m<7bK$*VYd&k_KKQ8Cjb( zka`U^o)abcpWKmKxG`HK2=J5#lGohD=L!&#_vY={seU}NgOJm<;hb4(rOtl`o*`_o zvU=niqf}Wb8dQR1ufvK+G2Ks+hAWJrFK0WOCQ-no>&X+^Un8(&;}~WdZkwvX4P@rHGJ}}H-DCmpWaBPeMGaw$S5@Kf*1S_r<`_h zI#OG_w=K5+G{)2daeR`ePCbN_HD(tU$nwPQHo3G^0H^;}QsYN2yA71u<*f zdhD^OKBV~UHW-d>FjNt;k3A2#JyEI3Fv&D#oNM1SNse_|Z+8@*x^$4y*#>1q2%z`W zlr}aoik40_k?jw5-4-4cL4j?q%l7k1?chjd!!{~)DMDH+T%}jp@aR4?n@oH4FZhZ= z2WJ7d!eL*FWZa&fBdC_E`f4Ls4Uzncx%8xfM&GZ*LqRAH2vG2?-3_g&O*%H}n}yN9 z>zx)uoII=tro^v?n@g!{76q0^ni z;Hh;FtdadfH&7|a!KJO}C2>bVWpngJOb!Ynk-M^0HKJnBQyWaxM-VJ$->x)-H1Wx7 z_3-sA4`RDD4dZj@*PVc??NW4Up#fztJAd~VTm-+^Y4^KRz zOS3wR@yM$s-R?&8qxP76^pX>;968F+K!C2oBHFXh?L7kQVLO>f?fO-KM!d^gq$CE7 z%k>(IyR3M(aH6CQh=U~0(64)%Sc4+)SfB^cIMX39BxkBsU4`UhOVSSkTpo{4A(*if zUXY?{?^zHtjFY3d6Q*XFu~VB@Ejvpoj|&>B;oC|n+y_?~z$kCuz^63c&%YexsnrRA zf0_Q%!HBi!?0mpA994UP6=-h?EUC9H`Ewcvi`}gqSKj6W0Jw+IuSnQW>;sYsFiRs zB*|;beb+N9G$?^4)&njG_GH-Sj$7v&=E$pIGETAd;#t(Wj8)}H^=uo-u<|1Wx}m}#k5xH ztJp3d{;rtN1=2d1Ei)+(t%xC_Q*JAcy|0BDr^b(FNVTTVi0B|qPP}8j9Dy`hT54|0 zO2J2e!<&2?z39O56%S&5?g&c!b?fUp(;?vge;E<`bv7hj?eNQuxIDVVv@R7_jM_K? z)8d%Fd$)HoyFS+qfY26LWo{q``k6&Exr5UkN~Q;mG&Ae;yc2~v8!EhzYwX>%<|8lv z7{-BZ<0yE_2O~eHo{T3NfKl`a7-;Is5k5e0o3_`)ERdvWcu1zdPkJOxp%^_j1nwp^ zvn^e`g!+x>z^lsU;wXcM!&*ynJ+)m9-9`FpElhW!=OG&QyL~qWO&W)hC7ioq!1gRO zXsV4cc7Y_JOy{*E_fd1oy|e8~vBo;_j_yr(M5AikXf}>y|8~ZM>g>(+ja_bxYbX6z zX|5Z~gen`0fY$ijf%h#L3~CFgC0 z_h16Q&k>SX#bKeH1;RurCLnIFWjlR$D@BxxEn|K`LBnx|LVetQMR#OVxviS~aRguC zc!A+8`6z$wBW#32mg)H{)n|kR*3@`Me{Z?l$OWPM<);VCw9#Sytd~CpqfqrNCO){tf<|NJm15TlmTPrA`qGTX?k-5w=v0HEa~nu0l@k3C11_PF#o5);6UmwfD5X|K zIozC+xcFr6RuMjMw55Lhtf14nv3|_NV6$ppg4`(X7=M!S;nwKp7~Z7Fm|N=2>M<_H zC_tJdu^UkNugrHxvG49-X5XDXXIf`c2(< zO_owxk*re$#`8LO(2b#`#pm&*;+eI%VWtk^Kr59FwD6k`CZ*EG`!fi$NBA4PeNpiu z83Q#|3e3>>#~;M1VR>$QI{!gLMW?YtS+ULUHlCa5w9ql$RVvQzn&tHHLXFgv!z?=+4i}z+V9-kd=?)4Wrsz?R3-|Dv zrW4YUpU;~-7C0vPTs@#7f$gO4B*YA%MVz?}i$?9Pf=|A}-B5=uhAwN+g;x`(Ve`Ao zOQHYi?)(_kfakB>;b7dO=Dt(|5KRDC)lT3lN#lh38eQb@4FIEGP5f(YU7;E)d@nY^ z>q(mAM(;^JveaC(^ebscO0f&cGh`X};*`1cWD}+iZG-Wq^uR7IqH&h}9YM>otvRpE z!LVvh-Uun>E{HZhlA=dW)oEZZb-y_A@}))p_O(aU=aS1K+_v$hW+4UJxagLK2cd6qN`{YoXb!V2jBM6R&fP3Az=v6R=Gp6g-~5=| zgodvlwNnmcg_TaT>*dyA=`@L;=qmL(d zhMru^o|*AR$_u;g3N%9x6?_M1@7SEX&R&jDuXl)iv`xp!tAjG!Uog)Ej`U&?4W4KQ z2FtRB&I0Sb^vHdc{d0+6Ya_>u)9qXLHJ$V@t&Z671SrKN@858Hv1> zfAF|k&xfpwKe2|`#S5{dKXEe_x*cn`<=c^*t-+2{3qmq_RI%B4b$r&&{^+z-=mmf& zRew#UdH>I1;Ov)g9Q@G;{`&J_m!m%J4m|8(|EmL>QlIL`cGn*5**^FU5oDv~&U4Ed z+jl0OFr3=z9U7~;oM|0Jng(^F$TZ4ra3c^`$wYCE)uh>t9~@jRzDlyV{Fq^^%|g7i zL<#lxx!f5xe4{3>VD-=q6))18tTiRm|31oV-Vd=9y$QNA5x%l#A1=PGuOFOMr_p=H z1mev$R9w^HsQ_LTv1f%N?ibj09UNOcxkP zRs!Ko0!49W&@Cl~IT>V^JOlDheP~Un@nT@DFc^=nI9m91{P)^QtD(vvDyUQdTD2@s zd)57Bdbd5!a3Ar?>1Ii=9Jn-?ud2OHmw=$S6!k9O3O&(XDvA1>_I(94I{lTpfnh%98jLse@r(33*<96!VINot zYFdqZO%ZIYw#kR&mh7Fu!_tcAHUD#=dD9!&CJ7!Lt``rrR4Cn@Ed8`LAE|&RqhQ(3 z&|g6TS}S_k-7WY=Z=&Y{%8MxE;;xzKn|g)7&PAw(f(01ZiSU}Go#{IQV{F&r7Obd& z*kT#9h3MT%JT-Zz@~f_&yP^VUcQ1}!k7y7ocS&{~_qwyUw90~B6>jlBYfPwO{fI$; zkC_;uAE(@XxfcYhyNP6F0=^R7^!3WgJzZMTMOp50FP9#>C|?f#J6e?cd})6Xv|||| z<9B=X+qd<{ya#sNmV_^8ARUU1c_KE&R^cHJ@1wfq&o^3>x1*7Jjp})VU}I0OK32l? z7u-2vr+Qo;E1U_hTPZ=&H;6kiYF9%%{a`Z8NNC-an&pt5ufv3__9f&Chjr=qk837L z-d3n)NVwq5E=T&Q?&MEUiY}iYkoqw$61x7aMqqhZm-QIFhMs+qN`YbQCm6}smay6C zs+ZA_PA|*M9$A6wfhG+uZC4WpuA8E&HRp=8Ve-9ZRh@aK7T#Ev9H%uQ!8nQ}ao3-ghY%r!JZEd1 z5QC3~m$3xlIM>6Q(6#hMS+&1mZoq9AO!QPQqihw0>ZMpv)p;~O@xY%_h-u)wogf`%=L8=(VV6N* zw)1l>R9O-iKTq6U>KrhPkW@UPO-*#o>D`}n<+SU=va-fVjrd2?b}4 z@G*M(cI$0DaJhL{v0A%X6k_b%9Lk_0#b%s#s2JLfA9QLfxRxleP{dA)VmdbO_|2+D z(T3AGXJN1Qx?k%pIIA>_-wvg;HQENDJINtwr}e$zlveQY&wjHimBUF@wo=X^dj}^) z{c$Bd%KG0~Raow_YIJmVhaDxBUoq;yVWMU>-5`-Qid>%T_|{!|d?#h(0_o)-1iku{ zI-at?@@A0=XaB_v^GF!04sY;?VJJkAvY|F%jp6VJo5aUOMA884m)<$uTmr0@_(mOh{Vqa9iy#94M*13g&#p~6_=%V*pq>pWi_Rd_&rF+%jEAt5 z?8TBE*qK#udDTbtf8ocdy+W9u%x)(+>tssJ2L-xIkVfoSXL)4nd>7f8Gb2AM+AGp;@mEHbhfCd zHw?Zhi3yH>w!^4xaMcg_-$6A^?(}N#F(j{bY=P1aBfO#3V%C98AG@8PvjD3~!y<4< zQo`o6;L4(A>|rsFB?gvIKx7+FF%FB=;~w;d`!8XN$3J4lb+32g8gFw0-u{!bt9|1N zIJ37i6&-Vt)#lTlA&-NO=Jf9r43I23p)S;Fiz(SdVgL^S>eLz-A-y z>DnzSODyA?q19=7QKT5hJ>ayxb|pD~Z8Xo|LZFi-a91CM*yMzE0Pqp4?EwP5c8ZkOPZ z=F>an06$Q5fJ(l|9;Nu9z(1GtU~&ZV9V@Wl`qn zW5SY!#~YZ*Dts}mEn#hHU(AH0SJyfaPmTReQ-#a4Ns|9>($tn8akgZ&S_?Aq*=zc0 zeQK|HFbsqroHeRg8gn>8!w+JhmbdS|Q@QX6I4-Au9FQ7DM`$*m@~EKsx10f zDCjcC$SpLa>lj)0+k`$p5he8?*JOORm%(p}j6A!0Qz~8a(OtW=`dzB4hKI%X0&!@u z&Uz&L@;3`_-~9tshuj4YqM`H$ao0KjEFZAZx!flBITRm2NCwRGro70 z)rVU#YD>)5r4ceTlzTiO$rR$kU3-0wltlVUo08KqStlrqngM%#(Hx;rV&E4wnI!zI(sR9lvB+p0Uf*P@XT<7ySk&!Ens z#`lfnYRZIm;{)L@Z=`asJ45fX?rDn7<;S-e6sL*NR*8MQG;Jj>#awLn?y8!Q+|Ax> zxhoqzt@9!*Ly(!NZMAmwTT+gq_M%6qIupl~9uL3Mdf>==zc9KzLXg5|r`S#zK zwZdY>RjF+o*$)lssd?%8EarGLOq1cF=L_l{mzy$mkIf6H3tH~Z@EO_Iz}YkdY}JTh z!B*sCsMkpIKH?#k*&alv4L_p0GvGQ8b?m7JJ#4|G!5xNMdpgfcf(^6%;BP$s&a5m2 zXQyD8*W*d+RA+=-MMOz3W0jKqR>{u-wRyRg1TE|8$I?9X>P&Qtp|y&dUMV$jUPan( zi{D-c?dnRg0$JI!JspG98^vbP&46tLlFIV%&08ZFNExw4*GsEA-h*q8pgUf12{B90 zdSh^&NIV7m|G=yV8^snrNn-!XtOTt=%ER6q?N(e<`zChq{u7ez8%7S@+UFtB9^(J+ zu=To&sq4=!z<)tlRX3EbRy;b-k?%9`-fHrg7hzvKrBLGl^$N~)V4mrb3TfpG#&Kw_ z{YnB}2!MRw6ZiZHB!u6O zc*kI14oKU-J)ly4n!tOO0wf#KNKp?w)QKRXd?|L;Ip6-xYE9pbOe{rAGxWq7?SL?U zl3CY&4G)+4=N7ss53}mT#{wkz6bZ|xY%R$UxtJn?J&6i48DVJ_ zopdyenul66j&Fvqvu4cqoDUNHn!fHu!*9Yz*i8Y6sYyK|WDi&!YUL16ayVrk>!e}6 z;?KrvT=9%Ix9F`PK0K-7<%15NalGpH(F!)!UYFKab^k#IC;emNs$!c{;!gTg;}s46EM55J?|&VVz+ z&+CRa!N}0}iXTCsvyba#{j%d3Tgd`^1*SvWUy$lKaP(Gx;q*M{XjX8#YK*s&UPQ=G z$Moa}C75d7Tde7Kk5#K&Yg(Q3m>Rp^dVo|l^Os5`)T11AgP5Zlf;l^pZE}zoqY*7! z2h9-^=l3OkRdJ?oakL3fW*wau0$~sCG4-1KGx#Tj9hNCm6y4imLv6kCZ1vl*L+^eQ z&Fs?c)Q0^Lqb9hEZZJ5$Dx4L?Aysa&2)K(m7D*dfP6A7O z)Yv=IF^}G3Sxe;&AG4D$dty`++NzLXwr!PUw1`xA3TI!qFdZ@8v-JLSvF+`EVs&nZ z$V9byboQs{mm4zP(yO@|l71A^iZEZx;7RB>bBt_qYu7%9CP8Hm+1G`qkjnLm)a(Y) zHBd|04QEo;eqh+@mdr-6fON#3jvURvrir*nLR?V7Rxqk7=J?XoUotnbQ|l}xI^F{I zh560aWpdBtp2o3BK>e}(V0r6hOQ@d4z*VpHx_8`Ey$^5ERtT%ymD^+e9n!<E;}GN+z^bfOvCHx3Hzlpm=0G15z5ko z#oOpJyY`A(_49#4m9Uce@Xomk=J=QfPk-*Nl}og4+sDr|H$!T>RTlf{7MZD%u;uIb)pxSqe{#3IvWf z9{15?)?L`XER{bD+2vZ=(7Z8IUzTT|pAMzQumj#JpQSf8GJZSG>$^&Q;SfX{Yczw+ zZ$m}?{p4Dkv0(baugG1MXrd;NnIatv79wPM5fZr9=i*Ipp?9;msbeb76kqjKd3xN> zN0$ndQ9^i0q|L3+e4N{ArT@Ys%?TcjMWY~_7%Q%^*`c`^u8j|dDcYET$e2<;2LG9@ z-(XK#BPvc2i%-yz?W6OsS?2;HNG$x=O1b*3C_+z4bgl&zW_a}?pWPMy3oM>#E@u3k z#jHj@XzQl9oT9~y|J9Hp{qC3J4_E2RlkMx&f{E#&koCy67mRtNXkW?4jk&7wPJnY3 zF>eZ|OO*6i;l9Hj>mCSJOJa{!+!~j&htQ}}8QMP*di4@c)r=UR$tESB>>xva)-)pi zIP}YVQiMBcfxAeaHY*Q4!7MH#5_a^HVRq0N2%!L&p>Z4mKy5LCF)| zk}N*hi*B!`kX0YtXuxPd+(+@qck)SQTJgZypEAz7vlk`U=UX<`{)ffmw?7P<2|Qb) zZ#MnP6QhRh#2PLY+ZBSZy_0BV*m2i@6lX!HxhMr!`);1WiOVGp$>J`V zkO;HC_NMV^H;e}UN#BoZofedz3s=d#F%;{oq=S9l8U_mEc2$={E1SvJK~tFtGe5Z~UnjHjj(Cr4gCV z_{#>GUbS!q80-bsTu=c}`FJHJZJXKEDE<^uDTNB! z&-}ufWP-%`x}T|1A-QWxSl#%uBba`#iMIRO#!XH+Ccj0yPiza!$m zF(jAa15toGF+p(rg$fTqnO85d7c>J?CmXiv%Y_oyhWTEehYq3>ZZ#{?LC9&4q(3xG z=?Oa1S%UYM_FPtC=g&^robwY?x|71I*kMu+!{&ItGnnm2n#4hCbstje3dmVXeWB~3W(C=#i$ zX;PI9?Lp6dQ`2~iIdI;8idjPCy290m?1}G1@a&bNFT~_XPIGjo%QrTlr0LX{-W%we zh-oMzR!yO)8^77>MYZZ!dYhPK;8O3T5= znu{Ao!7L+;C1uU9W8fy^4skM1?(Swq-Ndo zQgO}qw%Ew;UZqo3f2Zo4)Y{@o{5)Zt>oa}`ofgYv+%qH;E1%L94LY+W*}|n~?`GXk z>y9osR{Ox`;mn^V+4I=^6B;i;{k2}e?V_*hH%Qx3$%}jR6s3q3zEU#3;`-RCP^VUe zmbW5ua)q0&o-|#p`g?C{jjFrYC{M460j2f7V0)3fuWl*@)^vFn~gQES8v{(-z$>l3PFc#g8vX zqEuW}8dSx;jcn?RuXlN! z$NoW(;&QLzoAoYoIx*6n+5O_#of}Di2ksBJ^L6L_WHkXSJy={!i%xl#xX;l#5l7Ke zHr)OW5UuZ($l3xT7!5RHM8Sz&X^R2+!nJ|zZd?&_P{c5VLKey#_a$Y=Y*`R3G|EzH zZm~r$j#9P(aXUq3qI!FkL!)zFi)^=KqFqvSK@Z`?0kuaDu#<_-+_5&dL`m-7fwEKy zjV@1MqrrOhuNWN;kFK~c$TlEPM`#YrvuA_!-h=H!nOYb_Efn@Ja34QuXi)X7Nm|!> z4JEbX;hIQWfwn9)e?gHL+$y}H@f#jtRV0$cMc*Z`n6z$Oy{#=8%XQJS%~2Sc!a#ns zq=MyEpP0ya&d}@hZ9Xsx*%g;iIMPVS0Jl>V9Mqk3W2Yz@MN8$(&TjML#PpwaRHm~1 zn1D&3vvWW*Hz((WvPAYVidUI-vt|xr%V6=X&_bK0 z|L0BSU!_i?&KgCSSZq2oBqK0$+{-xLR^Vn7bP2smuW*_8iy_-l?Dz^TI$LOg$Y{Zk z?`*-3-uGVErpEQOJ4L&qB^0RPzD{3IKdcH|5{-zQD||~X@R4CJNOEKZ>V>06c=@XY zZU%pC1dn4TIzF&v#~Z8PnYkN$qU18|$)63*4=PBE$;o5T_1*DXfBMLe-p2<0)a2>H zjv9r5n+GcJ4#c!KgB#3k1S0oW%xAr!!T(6iy#~43|Iy(raFYrU_u;=Zk<2ZI*8v6W zh@fH-41#$870Rb4W(*Kmn}hv(!iKvA8S}%f1R``;W!%!p(@^~%-wfWD z&H)i(>$;qIa~rXO&&t65x7X28otFk;v2b_$rV=%XJ=Bgn370SO6N#hbhbRl?XTaqZ z3Qc02Tt*$Eml-+PfHr-NW*`2;;9c(355IAn1o564*$=GgKU;b(Ky5~pdxfE*|DP%Q#AkiZj(~GS;gLihi z(@s2VXjmK^88GJ6k5n9CfHAksbaLw__;@b^({&7EL`?hYCX8g5eHZkqx$JHH1M!K{8e;xpZF>9}zJB*M z@f{9s9p*gfKm}F*{hJghY!0fkLdtCUwIcf5Kg*tceFg-)-$OvUZGfe05n6c5kF}+m znUY#s$e;IcwlS0DMoT4%`oaJ-^k^h7K=xtD+38e6N`tv)pwjK1} z>3iX@qqeRf2643Klij?Wnke=bgUwEAVf#jjjrle=RXa<5EEcb7*{a;OrQ_ep^3{dI zqmh<$E~Xk8>0Onhe>ap#E-n#aafp=9&HaO4#F-tq+qd<+DjoD;9T;|P;fwc5d<5`d z!QA0@Tb%$%;Xpl{u#%4cD`1*~)85|iKSW}X?%r)y-X*h-Qtr(wL(9{y!+)ybUo!U{ zJVZ5DzbFCKoCw!dEM{7z{a#>r@@Eb!^FUcKRPo&sZ0Az{*<+8dfZe z<$dp6-e!c6C;1?WR1DEfZJiAAaBAnaG#^q5;qJu592Rj4i))hS+l5xPAj;QiPe(Vd zm$LhV+{PSUK6$P?tv4#O0wm!zGNWW*K5!;l$OLyLEVDx0za-FvWa{b_R9Eku_H-$nDLl1!sOfyAa z1JPY@FH!ohVrW9D+ySag$}g7e;u4CzdL0Ps z1ZB)cfp{4o0<^Qyo?Z->I_7N5VVbxecb zcWlIgLZ#!ndsbS1y4$|`YcY4%ot`CJ!A~F$M|UU=-G95uBayB_sLik0Ap9KQaRufz z& zt@haVfF!tWMRI^%Plx5us28rJCs510k)FdVXRcvn({XbiI&q{K&ioWvc^Y_#I&|NF zXYxFpIa0ay_#;Vw#T}jt^;uV#iCh(!DmBzrxp%cDA~J!DR7ul*2BPar#Lu_5X+ z)+o^w8qthnMlJ_wxgD?Lvzw(=1GgXn393bVKEw~4U#cdwvwM|B^xKN}nwpp~%oXKa z{+V-^06BL7Es%3#?EF3Ft`G~_x_t5d%vfcGUMG%)oB-)d@&YkS{e#}#P}gziZD7jy z;o!sFNB3R2HG%Ldo8~s#DI`WAcgqf%AK>+0PrCN@)7`x%Urt=5R_8>p)<)H!9z(Wc zb$`755WD#Es`1*9=3-;IIIb`5(U;bHdb{B=x?Y@six0~L&f>E}F}Q%(2dV6~pIi56 zhVNpgkC2UrM{2^-mIP7d?IE2F{k;jN$^;+P+9PB@-PY0e#_@%mRWj3o`TPgTV?o{X1;P=I{`v!UK0#LE$iN}$ z!2sHHH0)-WbzFf)muKW(F}8%%dlqOC7vPzGuFG~D8{0uqU%#+}7qO;?rEl%r|4E+w z;@Hn?&;Dr6S9MlzB2c36xn$Ypcv^cRjsv}Wa&j--5wY#VOOBOCnnLq8OzZ&C_t@W{ z7)JLOD29Jyi6ag7K1A^mwFAnQU!ubos~*k}q@xA~4yo+x5)4P~H+6Ah6d_xvFvjqPzB;d*rJ1~MU!7FdXnYz#Odfml@&?-1kn!)vUwF6TwUgtf>@-4+Efa-a+ox^L_cfc zTA~f>5^}JX5R1rbEA?q-@v1lJ!$-k9P0m(E$-hEtk@IirKPf>)r4MBK)*xIHVeOj22^@M+RIu&-1GP_qfRu3_)GS-@=oTOe*f<;GRdGswYL*4~wEp@sqQfkPm+Q*DEMWzU2a zLF0-U+9zvEVXpZ`0T!G+xA*VOf_{GI+pSZ0r-W#@lHiiCTmaK(kl~>F9pjeG>oriZ zoJ>!#4h&9tvk6&Kx$r(r-^e5zo@6Bz^*!H92LcKLX8Jk7X`I*7^ak2wV1&In22Sj|6%*H(_6}OzES{Uk=Ww2lkl z^$!H8mp(pT@wD&LJln+urKwZEF5W*6ftE;r4}p|lk-|vgQ=E8^9K~))d5d?oh?5d- zN5`M;w3MYkJ@0<11E}2@r^2q$MbGDuzEd`7pnea~E(lB8G@b}^bbLTIrg7Q?hNF!F zj1<==q(DHOq=+KXu<#me8~MktHsyeT{Bf-chxXbk`1Xh8PS>UufaL8_;1;P+ZjHQG|b|l^WRYC zQS}UUz4T{@PrxxFYKcFK^A#5nZM_7rR5J$t7Hhr>QStsREa^;cf)IVbC%*Dy5aGAy zBMsq{mm7V(#L=uwolr+P_Kz!I0eR|?1$1D>Yv??dn~OTM=w7ejkiN*5i04 z_5%2tJAGK}#Ajm|z#>Bo@tiyVd#e0z%J6To^J6ND%O1KrP~U7~)Sz~9wei9a7yjMy~}tWfy_>FY!xif z6_;uvUBitSNG&)F)PERRl02JK7vNe*)q&f<(&wvI!H=)@EPZXP6UDuf#;=-qm0mWX(K!;hfqGX4KihAGd=@WZn*Ec&}LlvlbbS;Wu${D`oB2R#(klhXihZKv)_ zUXxCfT0mNpvFL#ZN*YKw3MHF5$+>S@{CLwdC}}hNC6|Sp^w}XkzA)yOSuq!^`D1x5 z1G}j;Xa`wJkC)zdMU0#O2R_C>7b!fR^qmqdJ6d6tN{=B^AWNqSW*J;;N->Ew)e{eGSRG*3!!NRgoeW1Pt+%+D z+p~Xk;gonDCa#y9a53T8!@1q zQ`Su&62md3q2wH$SzJ*Be#An)(AM~`ggg4f4e=-n>50yWZV-C3Wc%5G|BRuUwPEJC zPvR8=-W%Sp&jqJJxQmJ1({67*_J4XtXZ|qSp@12Z@!9D+a{Ib6V(NkCMx-I+J$88X z$=%$W_8{txMYMY};AZ-D=BB9KRTl*)g-IxX(VEr!@XamaaN?XRkH?P-!BP0d=C%GkY87LKw`t=C3-;&X0gBGSKr+#}3$l4P? z>v^&PHC~Or6yp6pMrHidW^BPnVgDLZ7i<*f2$MO#GeORin;W%`S+K&9&bMpMCZfxh z4-{{N)dwo@t&wGiI$mgT>3@%_-`?yk{O6H4m$MF#Jhi_(070(0$3OM_?mSNRX`r=g zXU&}bN6Y9F_^b8!KbEocKUzjd&GpU;5)&%@cM0v^_oATajwi?x%_e%-C;hR1phwH- zH$JIslKu}gTK8RC`7?3wVHKxAs@`&fk}>)4-qp=J4HE%s{eV9&M7;b0A~*@rW&AI6 zG?&g(_=S!J3p!1kKRCiRstBIVf$R+!KiKR#OG%6b`f#^hHwx<4J zUx91mxX)2muR=y7za8;=D+9v(h)^kDyjNGZ9O1j80<+7#%ra?5!(K760U9bIGMlLs zhdkLSQW+wIRw?1vK%B2nXgSyN{U0lwe;tVbfD$G@dex9?r z4=PgpIk*`>Qu~dFWS+kf@%O=r{C0Vknr7i9#fc|Y%_KJBVDfRM9iolcOL38&;4+_O zrit#E4r!pjh7)1J0zW}!I=pU0Rz+d@E?Y$g`>a3s@xtCbOo1Wb7z(Sudyewn5y6&unpTb(U}@ zMv|%sq3IK@u>c__S_J@wmAbB7rF;CyeL3WA0d)U`_T9KUotUfFSsZk2B{wrp3Co|$ z&8w`5R_F<6C+YI*-u>hdO~#`-Xi9_zFSK zg7T5HX-Qx!F_u_U#`NNUNs+a| z7oJn(_h{_}+PpVT1Oy(8V0(^~I}*IwP#4Wni+Im7?|kX>$J(Xzfq$KP^In*VtOM|O zk2}lDPi6YKhi}DLh4*wBb=j5lJ+RJ3)pynBGTl%+hO4mb^DtywUm_lGK3=_me~y3$ zkeHaB1s;lNh7i<$UCaDZeE(_tea{7qfxV6!)6gY>bo%8%j9&Pc^^|Ga(NMBwdbwrw zt+@uulE~4fVHXklFTQqO(a2G7X^Hl`0V$Kp&Uv*d=Nq5VtPXsDE%uGB^iIs(=h(uq zvPl7Ykn>RarQ)WZ(iJ#|Bm1zl74)IGqc>TIcF2PS0Z<5Y?HhP+-ZNTdyL+DtocQKN z6H1OOUjh^F0|v?xpr2$uaaGw7qG^&lJzX%fSRSEkbRbw-z%>0sw$C+zx1PV{OT)PZ zumX!)V9-JMg3CxP{d-0;WMYTR;!=M1;JBvh@={zvS#$AH3Z7D8}>TX6T_9s)G(?yfrSyU6@!_MX`@_3m@dw^VhL zN_DTSb^Y%9dLCZFLx3ej??Sa>nV|-g0~Ke3O?uA{N*WQTo?_>Z9tHXwDdt|mtHc7( z$UagG`i-67IPTVj{VF z@32^9hIak^W5_ouAXKd4_!BBhQ48u*uni2Pk_9{8QArbJ|1~%>bUja`WP59g5+nXE zgEO3N$gx{&OETRth(x6$zzkv;#0(ar1sB8dJ7|sgIPEWJr*6;J8qR#|awAMd%!Tlv znb6vFTDRLRW&#^(J_U0PrNDxcGp$Bmp@RqPnQQnYvIx*uNMLSaYxmv0M#7k)yq4^j zc0?B`qj)P|b%_tf*3Op55WDu5P>Y##v{9gNZsL9hZenMm9B4;?R@1TAh5TuHhkQf` zKibXe`%dO+jqk;y3mui=kJ3D=o_nK{&rD#j{7luV7OPM(lwhDfT&xmWmNwcq6#DwR zYk4uHmn}riT6RYNWGkYY%mUkotmJL}7ZIbF>;GTG2u-VY75Xz4QNewC30-@6^AKF) zYVsc_(Z_v8i)8P1t4!Zz=bC~c!P1T7C0-P=Q+^gjn;DbgOPJEi-2^7*NjKAfi~B?{Kj+DO7>=X-24gS%CwRmw zTl<>)xVa$vaxO6j;$I)@ z_z2owx1L~E@g`UR2D%|IUI-CU^1l&ck~?X<{l{Lv_S7MWv4k4dLI>F&kVmTGth~yz zvD_Hsg@f=IZz6*Kwo!;0D6rS`6FARfgUn==5pFVC3PE2P1W|OiHbXy&&vk_;?CJJI zIFVAhhgv9BoRU2)AO3fh5l$un4EsaZr)1U=V+o(7aKuK<{)BX!?Kho=XX;KIuulPa zeh2wo=~Bn1)BU$TdZp~IKKfU6CW5i0twHF=5zY5Z55evWBE@;2jbw)H2kr~2n#lIf zo5j((De^0km#pzK6P%DQ2-niikzAnR+%3Fxd((&M?~^hoZNpw0tEcw}p*tD_mS&27UK&W#yGVyVe5T>fj%PEdrqY16#un|R?TY_Av%d2D@}KlJFpk2{y!zk20e9dHtkGcb`g3(xK^u= zQ9+}BCk$}tN-}1#2L3FiQGcI4gnStCugiyA0)S$dh(y##`=gNqHCM|34MZOXjpS8{ zD(N>u!z!dq<^L17RNa_*Qt2eKSNnQO;$Y$zH+utY7ZRv#{TICvm>Bxd{N+`a9gxGS zlf7}jfuoPU_O4n?);)9OdbZ{m`wt6;ekQuZf@MUxm$kNWM^&@>fU!y^KYi&FGfQ?r&?P$841#+FrzgTLN$R{YJf48$ z5ks-h{p{D{kJKG>jB^wOLz>(vT_*g~fHK+qC`r+1%xO!XreALo0rR?UUu(;1EzHKK z@zcst-z!-Hp6}LY&(zzE|HD{BKgGwAdV2obOib@FN+bQHED-5509y?gh=qyob@-5$j%T99!&c+Ck>}3d zvq>%l>L@HLI9XtN>&V6 z38Y$NIH1uzoyGm+!e`12gpRg6FK{^#+m|Ht;o9PsmHG1P+vj6(J16AwKAlWHkGmB| zFY5LUoJY;eqpdZNCw~G5>)QSFJqsRygwF_dNYUcz>8E4Y*a?U@H*V|dxhchBO2|%6uy2z?@dhhdQjs#< zx7wlpL6EG*e-R||aj0oi+Yy>8g4be(1*aFAk?VIo6-2W&BA>ViGEgCe1;!Xpz8J_J~y!Jls5R>(^QQy<{?Z(kjlTX4w z+ie#D&9c|HTvj*3M9V6zQU>vu^%eKV+FMFW5UGMqqa#X;!oQ%N8lt}Z(BC&us{Zo^%3|>3uobcA@v|rV z*baFpXTmlOfO(8eK9HX>V5(po?QQfhPAck}A)4&rr=5i8}5f1w~xX z4v>;J;~BcJ7FxF-V(TSuG0BJLsmFO~xLY1c+yPk796&4sbv*0#0jXi*17l%#X)-OS zmDHo^VHS6v-);pz=0I~Ivu@uWIZx{ryHSdY?~y63lvn~dh9l=wOvlZjLGB>`l-1^uRInDkHnV4?Dm9-GLTIwd7atdPu1%d!@OGyOt!$3aN5XYXWtbM@8>!M&|27D z@w_qG*S`~tUWZ|62rfT)j%vMzw;~-rcW>7sMYnYLU{eYk8)4D829s!p>|s`mlVWHn zQirG@kyh(otse|StkKE~Wpajk@lkeSpv z?%pe$EH&K1TokWiie5X=KnlNyuY0*R?ti5(e}8H8f#0qbaz_`gfP%pLeF^n@hW8<1 zR)+(m7&3+?lihsv!DS2dJSztJtipU}ddEjM>bchg=yWBcOYSc|TXMgp9plyb5>mKh zt2o7T(L?P=hwofAMxqhXN1hEg-|%7YP-}|b?UHJ$Hk(CcqN-mCP1_6$BjDEs6QE~l z{fg=J@=$}cgH}8Nv#j#&D%GvZcZbIJ?RQhHWS9C1umCVJ^>!O3>K${ISb+oV3#Q^P zOav>dS&zLT&nb<9couqy2%E)3KxfO3j&r7Y_o{{aW}MTEo!}5Nan2P>D|wu~PSzJ5 z(^9As4d%_Mhv|uK|APd$up_AkAAf|ICIR7{HrG2oNwxSh~O^ zl$P)GVyo+Ty5 zJ3r0Y5}~ZPtyzs>B)AcQ%OoLH5TD2Jt(^W`FpMBZ&PJ`{W{2(BM5Cy2M`9}FW{80M zV}8i%$5J@lK6)K+FP6hGF-z;+hUZs5@{3)8mMT3-BOf{(&j}m7Luq=0F@hYsj&Qh9 ziuZnW`Fw#vRe~RAWvdylJ_h%P_#8#>Bq^!O%yk({>jyYpXKL%;#u=q>G&1}7NlSmj zOdS^{#LU0IltDPKpRPzV%TB6LojvbKh{Zy4<@=R8yTD>&b~!<-JWhR`H|wOqZF7Ln z@$+@vf%iS72W1+AxhSHfxjS7G@2_IECpEV(VQ$uABFjv2mEyZ(3B3EU?Jbu+IUz%8 z+|2bXm%=fTf9%O2y-8K>^~`}MPwd9Tx=OOeFmc;;`mZ<_WTsQ9y1*A?f=cI6y2dfH zCt=zOhGzbeIjliAK&R(113!`OseQHI$7+X7VU(zC`P#sJo+aMQCIVMYksM*B;nsW< zEt4oYDi>3D73_(7siL!flmXqq!zx*2DRZ2VEI?P@|Ik0Of_J^ck8C#oCDe9&0p4T# zl+(g9uH@+g!h=fJ;2ZlHslE6##j)pC$R2dE38kDQ;heFAo7lIeA`fIA9iW~EdB~9` zSD{&ffgF)(26S8=W;5m22w$*X))2wPO|sRE4;`QurJn2XcEB(9MDYMyh+xZYJ&|^m z_zHt>8}d)tr(CJoCTNL&74X_8i%AM#F+xG{(G`7QrRgCoexDla_qB<{c|4|mV3dzq zikZJ0`&v#Kj;W=p=L0g8+cr@umZ5$^1OhW?s<&iOh=1FSjPJC{L^)re>5HW$L8ATrZon5Kuo8`*q%+{>lF%~|&i1Gm!&erEYdvSW3nXW3 z@fH!JdkPm0r7L{G?ryfDeJRV(S&dY5*Gz)#d+JS|IX9vHa;M!8YF`<6)$t;B-ru+a z{Y=p9Rx`aB1NyZjL3bCsN>Is^@Ff`+RDRu)2~^PppJ#i0m%AM_xV?XhDqJk|9sTM) zRfGPa5AmeNy?ot#&p5tz$6z$%xnAd3;kntdx$l#imRs=H!=H(}p$NTyKYji&%R*1| zxWhJ0HM#5RP_KPKNGBYWRORsrF2$mm2DeZ9Btp?c`p(rrDB0D`s-(?aq%6_uDLahU zknib+Lq{i}#c?pYhqR~PnWG^1+?|xt2Gg|F-0nP*i;96}<#sbx=81JlrWdH%pBdb) z?M_Dy8dyI&c3l?{QacN0%Tg|5eO9hZmu%176FPrNye9 zqXu3Qs??p3@7v+xb?a&J&#T?uE`V?&(A0{wh-Mg5R9i*3P=fn1M83 zIX8!e^Sqy|p-V8@F(x@J2*}sVfUAYDO(K&kUCo| zo!CbQL^fMbQ{95Eyw`T%`(Dgxb#2&X&F;5n2%>zSJrPbXQkOiWw+vh~0xXpw;kl0w zPxDxf4D->WWxA=4SI3x@4TtT4VI>!b&P{ejbk78n zn6_^?8JJk2fnOf*x8D)47kt)5%Bf7B426Ll&kKA`W+QSLv4K?*$m?JI#O4b68IR`E8-%WVyG@z**B{&xS!i-i+Hb(W-Lbnmc=y1L(dBN$|uK{I_+2^ z6|E@4{!8KOH}FM|d%ycVnAu8uj$?&UZXo8)Eu?SyET8rpen+iDD`dgjxjrW4TRyzz z*#kb8&iL5pq?ZJChCT<` zK^_J%VX{94_+MnSp6=Qm*x%VKJa9X~D><-?_+kLmiYCH-LKF`i;mm;(B!`)fu zwTqpMtny6!7PYwQNC0)FZMBylgF+R}3YQWD+WCi#I+r^i9&|8>EI*P^)u}FD4@6^tJea*m)xhSD^3#l&K$3?JJoBFHd6Rr ziWVWbq}+;iT$L}tb{)bZUQ!-i&9srphQl984bLBO>O+|BN$W=zT7@CIg3mN;8&+V@ zU2e!)qo+D>X%9J7jJXrl`+psWPL|2j1~^%@YcB*=7rGdU_yC03Gpraxj+cv-RfWvW5 z^XepfMM$PN5RX7Im)+3d>DQ4%tM*?1>*gD_*xZgj|*GQsC~)QP#D%<}kioSA_CIw`{ijE;0R!wfE-R}4*9^@JRi&WDAd zZQ?Qn3m4u=`owxqNpVLF?rDxmSq__34%Cg-W*H0~c_2q)4vcL#dU!lv9@<;y>g9ss=q%U}jVzlS>#vOig`(r}DDiL7BC_$W(wSl;2{ z_xo=sG7lFX3=8|Z^B%D; zlwKKip1_YB-b;r6ilTtxx=~_r36e$?$j1SQ70{8>jABAvnEfRCDG7pFR=;X*~}K#OjdOKl1raU!+) zU?9gX@sQ&N9zgEYvyMv!?}mS5A!0l``oUYUyHA3Dicakr&`hNWvg4>+g&Tb{Ktx*F zG2X!56HYW7|EWRw!_ZbND=bNS^L*L0BBB7BO$GyB2xrA-fvdN!+g(r*CqgO-YJ2v4 zY#uy{aX3=Vw0wMqrKdI#QWp4-61Ao`;-FrkV~sM>oy@NbW ziYgaVMK|x*ot>$__VS&;1aPZq!b0mlHqHpxNkTU0d>HC=ZnMfk9ayNTH(8zB&s8hQ zQaS>aAJ;jq&T!j&?+MuC6Xy=HQsK7KRR(}L$Sq*Xsjk%G* ztu^q^L>T5DxYxzFBfTa}4Sf-``YA{A&bg#ZmmE~h89{ub1-uH$Vmgt{7=;X4i-$kn z#ngRXQM+RE^tL;Y7-v?0OswZaUND=`BKb%S%0zn)i_wg%l1uP9KjZTb{(5HO4-zEb zRkmoMpFv5fz>znDk^l0lOEqav(|jtH>?ki`7DBqr2`>o78RgT@m>yr!Q}p{q(gA&m zuNQgvYN(sG|!)m{mB zj9a+WXj=-!esp+YQ#Y*QYB$NQ6&4t`-VY-F%9b`hB#JONB(YJg>jSwyW_Qk1R(;Hs z9kn8xT7x1Z1?)0?(pgj>rK352y4XgtaqpB8LAp+?oj$EYu{VW=9%TfP_n&94ox!9o zZ2yJJeF|8(a-S$L6h&50e()fQ2_z_6ia?g`r=P4$uav9Yo({XWZfsM4ys=#LnJJ`M z8O?VMRZoJsCEF^AjtBZ4=SL`mAJUzP#5Mb*=3)=*V_mj65WUTuG_#?W9Pp4U0|&St znq@S~Q{)Nt$@#lGx<<1^9*2EYgVwT9_Pkqpab5b~4Q*uBPPAENHGa^H62WBl8N}QS zmSlVe$&p7)`n*QP$BD1Ouw4&x7{Xj{QiK3=0G6S%~2oi54QdJjsaT$e}?0Qe4$Y)a??gyDFBIEOb7JPOVG+i6e_FJ>m)4$mKzHO8ac0(!-} z_5j?3x`>L>sE8^9R?J`4#x3r0k1k>u&|U)0qhd=m6RY2fq8AxX#$d;i%Eoxf+Rg_l zG9S!h08b6`qr2An8VyB}WawwKw&&YXJOpZwH*x@kd_UY}WcWhQl*>+vd>ViLgb}W8`Thl|RT<4Im0oCD zzq7Dc`31H^p>r|*^PAjvh8fx)&`xZMl9y%HT|QxEddX)eVd_7}6ISE!-m5w;pQiN* zwtlMaJt0jm$0PU-b||0Y?5=`z>TzrP2wO99zdKriV4}_9%N2iF;OvW_b}w~gFB63H zuG`y|11ePNqO^a&;qFL*J10F|;{2P+z2-Jfz~nRX5a51gr-hC7$s8 zje9=?XZCRL;#i3B6oi<0)BT4)+SXiw!vVo+=TFt6M%$Nx!d};gQo1P+=rajCs zt+3PeBz=NDCsi~a|RAG^Pv-FxRHMBJf9Ny#7y&fWxvByAM{d5J%Q zLEKJW_HR^S`70t~3BC2pVB1*bK)tVqkUwQHaJTTy*`nA0Gx`yf7~z|08t5@7-4t}ggJH1Y;w2B&N*{)}jn58E z$0Mhwk^($3-((x_6R&-qPWn@udl zqe0*&w)h%^FKJ=d15)Dk19w_>gj8zp&s+{ri_7KtOQFClNm!fi2kQ4kH;PyHc7vXbga;!oNvdz<}3alC6>5?8JGF=eQd?0{F|}pSd8M+vcx8(qs@aY-06JPCx;y%hhrjMlrqAjlsrUt0gWwA&SL%M2_YnGhkYRM+U`6!>S5LYtq*He@4Ni68xd`{bD` z>}V&dvYSFGMVL-0uY=1(awq1rRqZFzxN(3?v{JUu>E zk=rC5ocKB`XAAN)m97@`pKIyDv6ZlY66NuutXmVZ6$y#P01-JqCuTSC>G>GAM^DKs zh6F6W-RnP(uA^?AIfd&+(M?DS)s89^;+WU&?~ra+nkuduv;y0p5co#h-_X>tix)=I z;EGgyvbBAL@%fCcsw4!qxqmy(R>v$!6uzs!QXO=XjW*0qx3tmV@VS)6I!-Z_tY+U3 zHhHN*&=6(Tj{VePy569Q5C%iq04*Xa`$tfPpa!_HG69H=*mUsx6WpwK!aZ_ zf^b9)?VRvJPM4P`;0c1|_BasJfFxNsus0t6V^`Dt+Pcb@>?#;NxqompNO5j&S8s(8 zbrxcVJ<0@OAE0O~OwH}Cc_Tg#SVR^9zcwDLOgBxwHzoPP!}Q6QMs#iQn5Rdp@Se%) zFCblGdiR_@E4IsbmQ#F8_dX2bX#|p5m7UIjZv~#KhmXC|cnZKP}EU#3ULxxDesv)|S|& z35PEwuEXpbv$1}^4$;qhp9=1cqZ2Vi@ot!sgj^b=z+KM@qg;rvm-YK-%KhbfXT+eN z7cs=kfveExtC7r{TC6Ab?<2EU)*MIq2li1vSSCa0Lv%`)h0IENnV|hF7J*OzGt~w! zVPeM5iswg#i|2%`1~=O9Zk=@HA)^j*yodoBxzFw8Lv>wVbz_C&juOd+hkX=E!j`9P zq)4T}LDAm{xvTAT+Hz{ph?tvPf0gk$wk0C-^@A^e(U=^+=|sJ{BG%^QKAutj;srODrY0Da@F0WK)%aMhTeEX3p3jg^Eq@kz^i2zZU#-BK^^oaiG{j&M~bUF26wIC7CI9=@XDb2Ork#mc`)2=Z%Gg zLWXGtf0sl0h&a$fG|FwMf|Dsq02Shj(cK(-+;-ry3wN$y9kmcIvn7uU3D2d@!g=Xe zh^k&mmAHgfxb-zS6bkM{UmWjOBWkZ=+Ent8(7@zQ##_V6Z(OdEk+g8AO$;zvapPR5 zoAG9b+NauzubEw33YLAaC!V2oK7ezDb7f&4Sm9q4#HAnj3^aoyl4Pti!qb7f_4ma}IPRyjc61!s z*pEbXSR0EC#rSX#@g-wFyKNatk703PL13QLyghy8FWH2#VIimJO&sRCJ)8PX3&T8! z!Q4Q^ky~ZmiuRP+Bz!^5@0ncgwD>>@hfE@a=VULYcZ909yh?g?5(TAo%Q_%oIXoY; zSpFm2cVHz1Hm4^bmGKvc?(sFuxyU@-&WZFL8;1*;GVt# z2iJELWd0w1Z}vL2L0(;1ZsN00MtRMM+}HVR2ioxBXbnJ->qL_9Ut21WM#LQt4(;)9M6`ynmHX0GkaZWw>&p-pQ_e*kl+>)IdgT zS9D`Op2U24HLv=9+pjlW7ZX7{CG?2zorAsswfZ)z$C24-x(wg#rc79i;AC^*+5sw( z4kyS+o;Ky=am;DkRCdp;JhST=TnB)%N-V$046hUzOr)MvMHsxN8Plv(3&CyoM z-Eb!oNrP(rpEG~emjX--%AmVCqc2(d>cFAKu8YAbe~Qt0i@uW5y}&ZQBzo^cD5Z@7 zMPzRaknwe5!0^DIAiCwa(Ea}|lKw|-eLI?{<9SP=d#c8OPg8VT!(+Q7%%xQ=v<^Vs1E|6kReJz_BWI(S>|I3Gaop&V#QhnRQ!DJ3IU!5h- zib7igtVyzloCoqaqB`~IB-@cnr3S@B%%dFs)=Xh&#gTbeF3ZE)FvulVQTERq-LNo^ zGP%^-9!p>+q;jDSCf&c}x%fLv2TRD0K8gHm9F28BAW(fg5{OxPth${=a7B{2a56KZ zijfU`QB*Hk^bANN<0DFjkcjnIu&NQMRWd0m3wF`l~iG=ONjE4ZqB%qhbn&LUZ{ z>y!Eu%L{-Q#(o3us+W8uM})MJew>3+0PVm%$DOU{&@`2(DC0|&iKjT(UWh#UN*nEc zbi_FVOLUKRj^Ge~Z{rfkCDzZe$Z1s(Vu7QNdL_u<8b{>|sUbFTyBge`K#~@fGx@8j zJR%L91k#PN9ndY?OZUs8193EV%Ei2GHhGGdOw_+*&o_vpso8FpBVexml$E)rXV@w|oK?k20St8d2Ae7le&*B+CJD z6b`bQ&Vp%HrMoy-tz3y2B&XLjP|@Zw;I7Uk8AR*bc|9{yAxSlyj!`-nUJs&0x#KWJ zbu7z#IRT#G|7Lk9Pw^cDw__7#xor>=Y+TnNR6EUuv}PhDcaza7q8Kb{@LYCJ824Wb zAidZZj*{ef6d+H-$HdL{jC_3JX>J?;+i|QdlGzA}1w|1LvXNpX{AG}0Bm%}b(H=MG zB9cbqskJ5!@Gm|(Q=E&1eD8KJ^>v}>efV+2`vzg(4EWs7e9&lhf6>HDr&z*(gZ>YofOeP#r!|Bv`9A z_1o@+s;ewh7O_c~{v1SPZnpIsATHbbvOZgA-EYYMjyA229Eb2zs)r~feb49ez{4Dv z=ig)|tPK@SaF?w4hvWF2e*cWifaoEra0@aL@yr>6*tuezdXv6+yR?E;AMVt3TL6#( zM8#Q4TRjWQ&@sS%n4?$ECA<{~)WxoqiW|ojJ+wI`v zKfVc52O3qOg$b9-(bOC)`J_z6VAbcn-t9SQ5IM9hBLs7ZCb^a9 zz8Dy(;ldr-8)nKDINh&##l0fa=|Tfao;70nk&O*g}kz?YAZugi$9uUC*IrzLyJpOqQx@Ia_og- zYeH7mhsGKp-NW2VQ+;k^xw2h8gY~U!$b($nyx8P(3TbxJg+B11wK@swdBmq*du^RU z>1{vu`)o|=Af8vsf`V3|G2qF^?wM%dQOc0id5lj1-eHa+NM%P^kfIpz&g3ELWhk7Jc3<*4mhtY8u%N1rf9-B1D*^)OjA_M9T_mO z!@`b|u00(w^`{EnIwusDoLogf`;?9~x0Yez!O1GbVC|7*nq!Bd6&|wY6zhJgo3kW> z@TE^{&>su_ALxBN^Y1JUrF9`Y!f)x_b;bCcjAndWx9wd(lS9iAzJs8|g?2QtP#xnW zsaS&QO6PRPcO486cj52EnBfIrFOKm4hPZh&|2=VUXJKd$mF;9lotup*l20aXltJ%H zU^=<6e9E($a7t*6Ak10>G^B9lXW&%Pxg*@`(@Wp;vk>bXtNpbkZ`dez z4?jaHK-`^HL;>HCnAoLwk$Cky_YVUq8K)Yj`#O9hXGR2`obYl2O?!>GG7q4Fg}R<9UR!v5EMP`@o(emc=is?(Z5i8dYqF|Ak`S+)umwh)&x+~NX?92 zBBp#k)I&tvBZxh@4)4^q4Mxd+kE^-*=8|1zuld8JVOP=q#m;hxvCI5AFSxJ;SL zJlNbm`J_sX255DX+X(`Y=2b9x&<1I^PPHT-vcQ*(t{g`SKiTmyms@_;2!k@DCLNe) z>cO5a%TAI}y)+!(bj+n&dg3WW18C8JT` zV2y}UkKhVsy?++|_(Ttw6sW2B&EUv1{Lp9rcJpwDc|G~tr5IN(m zFJ27XHb2!+o*b8K2d$v?qMR%p z;f}OQ^%XHpUl;9I2+VdxE<>b3Vox+?1wDR&_xMuwit&=;4VfwNec&!QCzkT*D}8@i(XKnhpMUB5c`tS1U)^!cK;Y!An`)k zI&C!YbOMiAgU|e#khlPfFN{|AYA*-WHb){-9Kehai&8HWa~K993;*2($XwU3cXoqm zx;N!N&K(@~ePu|G2*@B$RW{gae?sYN{P?kdji*O^Jpcw@r#i!YK7HnKMA3gZcz!~P z(t--m*DFl_&sNAk5Ip(R((p6a`c4-;>vNt^Okn%|I;Pj{q7hqdvmA8&8eS!>KXgvq5UFt z&V9ER{rnw4UN;D337)>kk2frvONb$|ocDO66CpqecZm$B89; zDX<^u$t$KAUDS-;zA#<;J8N$&^Cx9AY_)LPfDH4=VuIpVhHVKIu_R7!s;l7e-5kD z)E1#}V4+R*)5G@4^mlM&%(>^u#l9D$N+xGc)@sc^v9@L8Y;C$(x0FlXMV6HJWO}u2 zW#IBZzFWE9)p$6q&)jgjdFOT7O{lw3&~Z$l@fPFGc=3J0s0T~gVb9pb0QTI5;lho{ zw;h^O(mh&Ex5&-ZACBrggRK&F=+^!6NvO&d>M$KgYTCVTyP&Yo8Dfb;kbHYua-icv zQPs;;zw;!h-jM0q4JI@y8qnTWct8(ueb@dvzQ`fUEhalcQ3^;J;{kC?2QQY!czyod zhq7dw?{9{zbc|#gM!_D|=OI~gT{D4fd=o5(Cr?(68zSY(Hcn#uHs2OSx9TFUl95Uq zq=uyzpfq{$5i8}t=D-!(Lni^1KVr~{eX8knqK*07Nmj1VLABxKnxYCL&n8$T*E>H+ z7iVLBG~nZj_ab@S&;x@QuaT57BGK1{h+`S5gQDf^K(tIA4aS^FcM3>*s%yNzU4AR> zAz?a@H8;d_F!iM6J7 z*Z;_$!}MXyMM<+=^)cuYbRWGhBXGEY?@kl-$|VsLGXg6;{-Js&o(wfGYVE_b2IdSw zz28J)R%ib$re4r)1S-ziP#}ux6Mfmrs~hL{WUt7Ig-Sku05y0(o8oE=v@MEY-e>Uo zBjMlDqA6cvb-P6iProyN@0y!8Pn)eo!9DQ14}mzWA)z@$C$~+?kgP2Oh>Xkq?YjEM zjaMeT;cX`jl+Pu;0K({3w0$$l1(ZGU=x_TAl$$w^#Jp4sUo?~DXB75s-+JR}MyYX3 zxl^FoQ#!e}h1IryJq^;_Kmxt?}wnz9kZ!Q_@G3N;@0}*XUG73%KA8MOA%Vpn0b_#+LqWGU34;rWKHas zFj$w_#gq}Bf}UpSMWjgAE$sYcNH%Js16<#vVQZ@&M-QMa?Jm)2FmtS6FKpbE1!Ic~ z041!KUvN#r0QV{8HF7?qOyP4--Oo!yzIGL-%I!E$^7=#&j ze1SyqT+H%s?FOD~6T}57zO~%tI5D?iAp#QG;m38n2z{R!1%z9`eCwW54E8W^P33aS zxjMZ>r$b9`K*ZyK%{gZH;j|4(u^S7L@p^!Cf3rIFG}+7W#C)g5Lw#$txi)`vHUk?< zPVMf%*tPW4ypWppcjPgI;0gKx4bbaB>W`<0e!RGHJ*SD)C%%w{r&coB1b)Cy0t>TS zvx<8BIB5ErHNBjqVOE`QJCUS$^9GTD#eu?!0&X8y28o1xExx`YId-_4te648Fopd{ zg*_>(+~~#V?O}}{WMQyunO6G~&W;YDTP3z;1e1!o7lOc6DaRvyi}UR7g@yVEpWvQP z*uM>|cs+NMhz|l1j;X3RFiAT#f{FCgF-N^epJ%=Kgw)&x|J7+P7vf{_{ws&1NXVc* zMdU3x_Zh%%8Ecme9R!GQ{~5$xMLIx3%Qd2+DS$3+ieH=4TmT1e_ub9I7Lm|B>y7Cg z*Ks}agGR8Z)ljw%qyqh`))?55znD<)0H3ue%53eJ304s0mv8GjGKmlkTSFEawN6CL zV86EQ=EN$wN4N|(jY8eh^rbM#bw5mfZ#xN2J~L*o{xC1XO1~5T>$ayQ27^p@k88RU zlo&7}o^gZHz2*v(xH83!Q`4=Gh|oP^nXMmdm<776fUy4h_3Fy6dDowD zcS+2kk7-cr9KXeZ!-t3=`0()80JpI$!E;H(l@;Ui~rjUhsS zr!X^~T~1+&LX{rxwaiD1IYU1Vo_0|-EBTue1N!#y6{)j{^^o8I5V6wDK-il#J6w{o z%#gPllif>O;sL`J(r1enq~~epQCK}|*edb5fDPAwlb`*B34LODeG~8b9q5p|>4YMx#1u|4G-a+Rd z@8I-8mbpskwBp|crg1N(FGeJ|^!+inxygU@d6S^qffrkrf=#f-+}pmkenN~;ImV+w zKYq`W5m6#0%A<0)K3Pt+4N5YO!5ghS8`v6z(wL)~WYYeU?IkOqD@{tk){RJ!{KRuC zx_UWpg> z^W%a5;EFae7gSI6-kRJQ*yWmlMDK-o8byS3KubHzbQ#!zf`n}$ZP2x=^xpGwXaVec z`rANcSUoQ~tf81=-W&U^8ENA~c!_RRKJ4*uA4mGdm)G4<1dCq&1DpM$OoSP?<6+ep z;iULC)&}jLk;p*%UXRxtInPh$&%f72gBfPtzO^zK0h>Y#=vr$1Vnnr* z4!doaP$vB0$EUu!-5BR_q~(8O`A4!h9j+$tQW)4h#Eyv+mPZq}>!n7w_c2U48`BPq zT?9_=e~RpU&)hxKa!YBwJ-z21$Qf$E?@d6p42K(788wTf^pNQpc-=N(==|Zio9{I*~E8UCgf4a8nn^tUDv zM4@pX`K={1KF@y@m{Wt?1v4EZnNy?yS-Iw2VX9@5^(X%Rez8FYe;75kjJ`B z|5|2tXITlTa9-B!GtxFs?rZfk4@++gq=OsbwdYe|Fq< zS7?Y#a;6yZZU&vZ=VPq&e2L^QG`s4}k%ddsbW1DKjt0YRz;x7=e{IM4&oXZ>{xFTX zWW|e+@NGY5Go^B|fm5 zY?bdTH9@?$CjAOGkq$|Spr8F2V>&F2J0u=tH;atAX^UAl$Wm;PfNwj_9wEo4E@M{c zG~OXWpInc?pdt_}bGNjFba3K15-Vl7g1##;ZsT{5^&E4jiZgfeVyZ&JpQZP=eY%s{ zn&~@{Q=%vS@O)3Ers;LPz;JpT6`#jPw8gWNq`Gz|e;-bp;O?cLTt4rvN9#=>>HSWLtNBYa$PSPYI{J$#At(W{_uJ`=#$RIZhkH9*t>11} z$b8jzfY;l1LNI>5$f~;BWsGKWgY90Au!|eE-!@s#HGj|wpxvb{xKfQEvDWUU z9^4i|j|9gSG93)#MAKw-;rcrGfsH!J9zj9LgrDCzqo-Cv*Z0u<-cE_qQ_+OSLi)9n z0W1>pn_1OsHX*$6r4K_TzOuG8pU4^2qp zy)5*si?%}>Ev_8d$jm3OKSlWbig4X)o&HVm9of?%5;{k)z6D*Ipcjq-i7(AR^5o zVe|_3no0Pb0gNM_e~&rMe*AZmLMUwt%c<^hWmN#1`c6+~dzOZDsOiQ zfSu{Hbb!IoZrjaOTNFW{ca^CcweOS5ImoZ?XWe^1|VT)bAt5N zppQ30>dVn*)`iL=?*1!l69XnA?Z8fIlf z*$ZhSrA~XZ#7Y3jURB=02WTIjbEIWgKTjweP1r}^SeBxKM1qaFKm87}_6YI0^j-nM zzGECCg#Y|%ja>Y~hXwSY%(RlxU!dVcLE~hkH>z2Pe3p9Qr;p8n?~XC1LE|7(cam~z zF8-4Q*O3CU%Dur-HV(v)+)eLUQ!f=4Shp@ziaFfvb?^0r*X4#esM;&(s4R+ zxJ!r6HYD2P$3T{b&3AY@Z+s;jVG&AlxkPcpUxqwwF*+V&^4(cJXK~T2?|l(C4qsBh zB?9Ii!JM(^ne9;4WHppUn4FQJm*FmHDk{bLB~#`exTj7BAwv!#+}NV1v+sm?6P zC{ZSb6N7|@MMk{&gU#rFd|~$SyA7GSHOdU0hua-HmnWZu!UL!~j361Nuv>Bi6Q6Al ztVaJ%|0(@+vS=yYSGhQf@&2lfJ-@l!t=%!~lbhSDpbypzHpDY@m`z# zK@~*$EH$=BAA55oh_s#2Z{bS~^ykbov}ip!x9&$O4!E+gqs{zBohr@_pdFGYm&WUo z$MgD!!u@ILcb72r7Hkg~nFq!7hJ&8o9mVu49MNO-=qnPhqv8xHQ7JUg;h4JNO@CmU zfttP1lndjC!w$6Lu(ypy!G(}HsN6;J&`YDU`F3KS+i@s!!D(rP+j7uv%< z#iqZ#7xnn|xfbaxautvbSpk3`9MSC7?%jT=@`h-WV6Zxy(5}k+1`UAcWkFAjc>r?z zdOrhIr>Oq_nZ*51TzAlKxk`(9$-2{+&`f+eCAUZOuPOOvakOL`pN%q@dx-XF8r|j1 zEK^AIxwde37ht>v4~1MhtCtZ)#|UQxHm;-Ma-{;XUlf>J_l3Rc1v^stPS-VZhtw*cTz zN4Aj#(tBpG*Pbk1?3!IH$uF-hEPF*tc)?s;t(LtMem)lsu+#-ezb)h0YTD%JUu=?G zRg)e7$18$%Iya6mOEi&-7?MX5mlGbFvrEfO;-@1h#AADtmPjL;Y!pkbEa8n8&(O&( zQB8*oNOakvOi}OEKP7w-3sGSC!+)bdD2cSnR2n8dQ^N=ckOY?IB+|&gBMByL|3(r5 zg#L{rD84?$N@F!7>(SY~mR9+Ud#xmWJ*+tXId>FqPqCzD*0ZwuKnJ*TAIh+v7doh$ zb<9ZuTcW-ysTO5f-wMO!CU%xcQSpH5AIz7ygA>2mQr5eill#&7dKyL(#!9hbem`Y!B|LY^R>aWPw(kA zYE1O~Z7h4~@3a4TRLGYbmz=b1ay&LY1Ivt-M=OL1&|p*4=$r*U(sW>h}xwB74S!^|1KBn)w0>V<3n}< zde@v6{V)Ggx<*K=73BK{POyQ~4tc)MIrFbb>z!E6asqqexSS={(qa)7A^;qg2{yDp zFSE&x#&b5|MvuudV%Yeg?SyO+v5Sei}0CI@5^L3Pm`p^HfvZce7;wV%0W`dpo z7hFc`KMauC3Vg;qTjsyqC)U*;Xug0W zVSuPwnr`V@IU13;3Ub|`x1osJJ0M#XoTbN8-a`SYH01x3uGIJv7+^lcBQi_RSk2{A zM~^9MA`67G<3-;M2wq`JYMEZ^f?pJYqz%}+JQPL^QhI^)tUgfO^P|O8TIV`^&hG;= z%^efe&!@m(ZTaqy?`8)lccTwRt}A;RHq%ZnyB&+D{$*n*8(oN1@;;-OMWr&?*cwsycaMSIU6C@I2xQPJZD zfQ)Rt)xx_=JfRf+>C|$+Wwt9xYt;2GPK>*99{8G$>}%#x@{+M{?c1@a(RsY3Ux%0! zY=3wuo$yfmW{8cxM+=FPr5!W-ckS!?HQ_vfL=$RK}<^zE!N$yTbnH;mhuG1H3QD?hY~zPk~lA?iw#yVjap(+Cmc- zflTP6(4zsyJ8pg=X#Zu^*;hg7`U9ig4k9#!1HDr94Ip!-5eIG5g@Y zmj7m+pUQufTR%gzeb|PqLUTwJ7{T(daLg3<|0o-0ON6OVd)Uf1h}SC2R@r?7V0w)W z_;K@<6k;9islXKow~zg5W7+))k9g<7k!mDz=3%(*)C9|2jf+;nBH zx@VH~uK`(v-f&lecfOJCg*CKlgLi6FkwQ{#d%z9`!X%!cE4$3ucQ|0=OQ$AK8U=fY zUy#6;neH*v=nLeEcdFzwV*-m1mVWB3+xj*63|SBa?Z33ce(EC`o4Gby$N&m3#;x!_ zO~ump8k06;-)w5D;S(V)2iz^=@tDS3O)sogG3KK=#5qf#fZ(Rr(o{JnUMzd1H+Y|6 zylfy#MLmK9-Z$D`{t@iE0}EUCQ5gn>f{3~g|F0vlO=j;uBeCLPc7HfygJwJ)SFN*A zryj}CtL*R#huj^91J>o=YY^Xi$>^KIlt{N|JPG0k0AirCrQQ`BiR8I_5q5v!P1%UT zb9d@}AKb&~w0|DmCe0A*ZbMA6ZX|q zEMEugBHCGH7YOsPXs9EDs8@aQSd?N6MJ26+x6WC1{eUF{UcVV4$NGh1PpB>^F)(Zt zlq24Cspu7Mee-MmGGq6a69!!W7v}!2>;G_d$_+Nakb&-g_GaO5Q8Z6a6QoL-NL3aq zj0+6JpLyzCJs7tLzC_{q8OHG~uQFx&=sjHv+ZY0fqC}$o>CY(Xhguq!azkSMMs%rs z8zbQD@QR(VB)fz|5>>s)>6qwFHljdqZeVXOFeXDZ9>B6C|3Kq5(7%86`9v43i>||d z<(UJ2W4Titk$5bNxxV7oTb&f%B^MNYWENwNdTGo5??R zBy!P9{v-vS)IN{`g?a=QU^BXjKLT$OGZ(ia%b7CctH<^5zqPf(UfHL{vE*!tc7M&f zQznUWv6aX%j+TF9-LH`kTMzLHGE1Sp8cQ*ZxkQ^nkaS>QVkp94mME1wjC4-X(Km=) zs*c*Mi=p7({jV4-PKWXCvKyMxUK!gEa-MH47Nq-GKZ_^NAa7$xKy|mLUz`Q;&A2D- zh7=h4x;Ala(o1uof=!15UV-n4`I6p&No3A31kUmf8lF!7!%44XvdN__dc zAYL(Iciwx%vTq`yJbhr|u*s@z6gp{v>t<>@IClFTQo=y*fLvY?h^x19iDv5^ITK@V z4a6hrM0rdX3H)G^OCNPC&lKG(YF}dd|BAcl2&?azuPCn3qE+et-Us7R{m}po6eCuZRch5%0!7xysxyyuoE?|?OV;(9mj|slTa?CMqQ2Yg z_kxi!aHc0xNH9%PC%2IZo&264>XzVLZy^AiNOf(WMk7s@-aHh`mbSn>J!5kYBk7QK zV}5ess}8T?_A)o*GclwH<*g_hfA( zrT=e++T(xX2F33h3*|&RaYGj;c8Ljl~iyl%h#|8fAT_@onF+iUls@rvP;I_+7 zFW@;5{D|?84*P`?7aoj{GUMurqh?+RM#o-mSp?dv0gUiotZ%_%1no~0F?m40*Z>9J zZbc!S12kIPiIQZqh^*UM4FpI&juqL+K%I1`7kx-Epr8>gb=-xHLgKFUOo0j!34^W_ z@+IAYWpRMxgu+Nq-K;5~J9SZq@iSw#)5ha`tYBo>uz;xUoKu2N1> zQWJuPDIlh0`AYMAd7%WjX=)hNbhK}}-`CXTuq=F&ePC*nFtmYPhgN*?4l#+bak*eM zW|Ns#)oVa=>ufRLGSrMd0Z7`>hyA19!Il^2*>$Q4B>{dklqYDDan6FGm%ahGc?mMx#vpd)jWa@7fAvA9xS+&hnRTzjjL1vZh0qi5 zVB_`9)VohWugm=WX-arJK?yQ6RzYlec@>xQ5Ev{II$yBPkzM4}csV?RwjG*v3w;K+ zb8ztM=W|?iiM4U>%Yhj{FNqv4*0V%UqdH*utlC2bLi-2t;3vT)CYwG16JVto`1^uG z6z?Ak4*eU+99DmlvH3Z*MBSjn(tv?Cm4Y12vzWcjU_gU z1DNA%&Fkg-J*|HRu1wPz z%QabJURIZ5n5ZeD%*Pf)pgjeoGf3FObOXJMG{!MA_!B)sl*y@bAM~{AsmCFlW+u(9 zkD$UKfze>t2~L55c|Rh+;rLXGzUF!Y?h`inJ=~DwFVoONPcLCy{)*g4*1QWz&?4wS z-4vEF#uh0`nv@rnc+M;3sgyRk2kfeO=t*U}$S}r0QI=jK5{MIbHsal+DdIpL@#`=; z7|!Uq)@6Q~*YFslKf>z^QaXIyJLqXk=q4l%TZglGU|z5Kv-LLz`W{vq{9H2VMla)9LtuXi;W$jZQkM^?W zze->#^dr9G1LKc>bif`|X&waeBjLT7zYlAFgCJms=sZd4`43{*3SuZ0X0D_5o$G-T z@a7_^{9;?zQ?*$PK2e)W^=I)TYHto&j*@ilA4ZtHw>uTQuFi+W!e$pI+zq_oGC0bG z7;N??k1_c;B|p&0*Y7;+f)y-FjvvR1$sK67WTyR}V04=~Q#md9_SK@k$LZFyIbhHw zrae#Dh;jmI)a>=7m<}A-j>Jnzv!9yAwr@mEw2I3k`kF878%`bv+m?hlNEM08?>+#p z;mswtT_5*B?Lh28;yUjRInBTDP~5VW-JWunYTw%WVmqw&T%}!PupKtX2;^9#rFDLt z7s>cxj20+HWTFiTis-rfi(X~`Awb`sptoR>xigRp z0%il^&BB^Jn3;}ZIeY>YMeVTqVdjCYSvyF93Qc~u2+IYv@Y)M>J7&16fQW2cp3*#I1cTSxo_ zO*{ZF3@3dx1?EdH3%4uD_8;g4`_x&t!Npo^xn_8Wp`P*&a+O(_2LkwmJ&Mm1UTgvz zXlK9n=KxI7sPNJv9hfMasrUka6Sh14Nac&1QDHjqATJ#ury2&i#P)=4Xu<+8O_rW3 z_ZLs>g^JTtCKmVS^BC-aCH7&Y3b4djV}hFS;Io_PRF$~$_}2GA_r?DhSm;&yb6|l! z+0N*XfrT!0om7S?B8r>*^o%NeyYV~64td!?hNMly^h5)e8wUGMN{5}gyxT;FUa1g zY)_mj?upcMC_NN{4o#7R5x`UqTyG3{9d>h^9w3kAy^!+R*N@=$`_jk4VI$;R;>G7r8^wXZ zsh64)crs)z;S&0hlf=FMGHVGn=cHU>-?nec*^g%fUbMU0-s~Jt{mhlV6)VUlJ-G`Z$J5r|;}$z@s*mH>l{c{PT_i|A{HfAk z1-eLG9%8l?wEAK4m2~A}H(~uW`~6Oo+tTY44BJ62H&SgSl5i|%l66ZN8~KxoB=_Jm z5SCD33B+$r&sML~DAo@8^nBQlPRWY5nTVe$ zuM(l%i@Mx%a59KFMHZ5x00rsReb8F-W#C=#;P|mb67)vS(!4Le{TP=^YfeZ=U%p~P zS+f5HW%7Xd8Ets%G;L)<6;*ops?|{WcZwZ4DKSGMQQlQtE0FD_kDXG1FBrZ1Fdnnq zi~R>;5Mjp>T;xx=jRWMa9=mfa?h0oeDgRxjZ<4WAe(S1V#QOGU=iPS_$(XHm%WGsS zS5P@Qr54Un0@*>_xD*R!II9sj=kA7rk5F<(i1)Y10~ECAXb1RFG#e_Fx;IW5RXOVm z>6LUy!7bha9@W04KOpmdso&ZvZ(^QmX^VfVyD}yh0E>PuZ!V7@(y6d?gs3EwkfW2C z*^n~(p&Eay_|~}Qw>(kNIEgyQqd|6Z#w+|rZjHURPfxd%j!Q4Aa=5WXFrC%8*F=OS z2x2X{o0~?UKvbbu2sdEQHZQ!hG&-MZGDb7o{j>8)LtH$DK5GOe70Pl?_d+{TcMv2& zJ1RU8zl?6b&C505G*+Zf0Kby%#92CTl<&s4bmKH`y7GB85C1Z1*0X&m-5PhA(->mC zL?=!?b)p^7YbmE+(j_*XoauJ+6z~nBNaVtT7#%V)IFjSD-uyKcXpKt&S`1*EREq4# z$RB_;y<@YeL3O^QVJ0{p+9=GlO_%vnW|OG4u0k!1cN{>+ll)bM`6jmNKLG zOGp$nh|h}tmB09;U%waX)2A6Fd%z!*30KiXk8smSKcRGmbfvOd8~pm3>k$u+EyMgV z@3DiCtIn86yKLU~3Ij}@w>QDr&Ou;i4C#x9~4-xu_Fg3ga7EUpxhs@VnTn zo#g?)Ivu{K4lC5JM*VpBoSi4XwjVm!JHCFLO~%xe3EmY(6Y&hMtnTBP!7q=PDzqni z(NmA2xF_1TABgEW6wwExNpz%khbNFH^_Das;iAxc`tZ~sn=_Z2zDqsYJ@X~LLP zq&~;!t{SUMUb*d9I(CoBkVn~F3{g3c&6z6Lp1ecj7m1Asw5yN~sIu>>>;BMy*h(%W zSpza=i3&F#pG-9$C7u`@;i)}W5IyKeiV?!GqKzc7q5M5+)(Q@_sORC?&l%MrraPT4 z3u+Z1C`ky(SDZZb_wn2A#9r;#)it&{7Mfj}=LH50~WBv#C6aIq(Q4RB_Q? zOupu(i6)$eG1k&eSlj*NaT5`Y1QC0~pV;3|3pURuyx4tqDNGu+cxq0V$7U5JWWj`E zO1*TVS3nKH9VOLn~;u4K1dCi1gHt?AUOtcs_= z_gi%R!+0J&hL5u*5PEJ}CMbs_^feW-AKLJY8_arQ;6>{mGk{~I?-biygdzLKMnZ%dI(@u4FhmFaO6UzqBJQ1^>udne9W zFSC9poST9!eGb&7jZqk1AGYEeA=gk~f2FvDMI6d=a>5cSOMB_W?LeXne4akmMx-+R zo9x4fe9t&*aDh+83?`BESTW!#l6##9-aG$LML8;#xHZBj9Y|rY43YHwfob9 ziu;VU8OU9rpZB%sMP&ZH$@;+(fk)@eePqV{$waFFwafhwQwXz?^+d{eattV<&Ml&gjOJ_~!f zr&;0-DW6C}@~n>!l!0`2yO+UwApp8LG@HHHu{n|ecfEe(!)b|r2Y;nm9{5?GL{scD zXJ`J~0u6y^vr)#rQyG&D;60!72km6+cOJn>pL5mz*Ql0VO7uLgR~tOGM*?RpH)t;B zo}$fAq#sHOa;0Odr3WYDv4P3s{f-Q*14z@#BtqA31C))~xYH*BpV$kE`#({%MmS01 z__pdI`c~H`G*&_Oty)VH{?S=^nbCpx8{yAoX#9$i1j@=D@l@a5gM&CHrF>&7V-p+0 ziYR6K4IY-q9Pnl|KV27~zw`{Xd|nXbC&zF&0!! zUtMi%-81k&^SHw(lej>o^g>x_$TjpzM<R}{dUJD)g8LWy~Uw$IHRjw(h2+ETqdU0NLMzK*uD0~GV zyH=Rm1p1AQ`F-f6sqn~2Y(}}1zv4E#R5B$ULXP3tC7)*sBh_0X5{cws6ZKQP9ImaP zICR?;gPTwn@nnC=!9V9TOrX(t{phC}Rd&7T^d8Iw9NWG^FrV>x>1cy}s+oy7i-tLz z!t=mtM+`Y>!1(F&#k3R6aoS%s6+gYXgpokVKU$>+eo@cP*gx}Jg_tis?s3?eZvG}% z5&3pY_^ptG9DkkPQt}JBn_Dw2!`qH?J8Xkh=M4DP{EHtmt<6j$rbmiLg@W(wV0skz zkBrqm=uXxfUGcv0KTWG5nj%m06tF#LLj0a@Jhf*W-SzsUL1<$urtPuWk|@IyQ;57% z?%EL#1lw{B=W0L1hzz>DnUcdSdW$++_I-iAp2uV6n6P|9zb>mxGb+Zj4Aaw}#H!xa zL`Z#zTnI#XNNwmL#TaSE|1qr@?r<2M*>;^8tD&UL$|lPl&4e&9pWCvnYw6b+kG)t= z-S_j+76g05?!$z{m<;$dsh2ja+z(@6i}g~5I3t6Y9Ww=GnL<6Mn(94anx$Wf!ONcv z;@~1L<C zS4V2-9v2puOq|BMJj77G5Mj@~cJ%7N(=SS*>Nev?#wsf8K3|;@-rzo=(*&*waxo#G z+_xdV@}2Bg@mXHWMLg!q$`xpQ=#Xb=MnQ8O%7=1IBN+otaM8PX#rl?&`xj3}D?;c* z-mYam%1$HOGl?4+0BaK?kiYvvy5yH?ok}klDpE8rH&N79$r}28Qre@nHIfiT0Qn<_l}zog^0-ojl648z2N)gSXiv%MHe?R% zzeV`3f5KNrGzY1G`d=)?#mJg-(E0}xg_O&3#@4`l(ib4BFn&N17?6&*rsAAK^m7}T z?2Y+Kj#ow0uSxSc+mm$3`eYgb2c!tGh&V8Fh5MqZFDd>A5@+@-dwc|PI&kyG? z((;lZ$)fLeXL-J~LmE2zgDyzRrq@V57Z6b0hL^VkA-T8X;>b3LUd4|rgIbP$!v=EE ze?5?Rf4Y1z<}Ohu&XUY3FowmrL;KUPb-DNqq!z!Me@1z=iS+pmVac~S)BT0ApqyW3 z&5By3Q>{X<$q3@;h+u!{d=5ugD^96y0SBjy?^jFU$qN(l2~|A}ApX(-mz!wctkDp% zsn>z*Lp++QJM)ENu%<$|BBJK#5u0{I_lp94HxFu$3^I8N3Tt$X5KK>wZP=ty@@UzQ9Pka8IX7$4(vkZj0PwLU}9@mH4zCcnfeqCO~ zCw#T0XBa?hxhYn{5>_}wq`de-Na(IEqUmngmCm@<|hV;A{%elHP3$H8#81*7bq z4t~~`f>x><>q6D-`%*A^rJ1!AocdNN^o?9Dxu3{t4-)XR(u8fklRH4cOCIm`5(s#n zrLJ^C2WpUMkWt~e(5KpHh5QDb%RVev1CK4YYE@A8$wo3LMJ z=&6W)Lj71d@~HIM#9)QPYZy@xgN^HPVUx2D9lnMx0v&4HET=m?=d??fqWA>VG3%0N zYundG%`23v{@&yA`X2ExNukf%PUROxWHgI_pQ6iY-o1#Jeo}Ge`gp`?WU4b7Ws`ro z%E9m_U-;pcWf$wVO5s7Ft%ad*J2yvp#{>Lk8NwIhM?;@>9!b!H`&3Wntr|U}Y0zjV zpPPItVhTe@9T-3M5jqldP0(&V&rX0G>|Sqonl6sq|;-1JL+qcWpMca%6Au zOHyXi$5x-zjLeMbY?KPVGMQJ=&sS@F++dd%t3aBIgjl-0V0f2!Q#WQ}we!J;W(SsY z#N{B<6}lwl-#r2fiL&hM+GkR!)q%IR!f367;8O~$=X?@uf)jLZjc74TqO*PS`xG~r zB(iUGU5-nsKBp-E{KZPJME7|MvfiEkjb{+SsjnMKTTi2LzaeQUF!H#pch%rBqiK#r!*tfqbf=wlU17nw<{>jcd zM>BZLZgl)a(Ny&UV{f17YY$StTMcd>@T{ZbJV#~zd0^4`nxPiyo19a1qs@>sFv&xI zRL8dfEPKpQg8O4^R# cc-~_lud98NEE;YCeiD$PoSJN@w4vYs0^;)McK`qY literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813220134010.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813220134010.png" new file mode 100644 index 0000000000000000000000000000000000000000..bcb5ff30f9e22d768487547b8adb8220ecfad93c GIT binary patch literal 13480 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813220144401.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813220144401.png" new file mode 100644 index 0000000000000000000000000000000000000000..bcb5ff30f9e22d768487547b8adb8220ecfad93c GIT binary patch literal 13480 zcmai*byOT*g0`{X?(XjH65QPb!7aGEySux)lLU8{KyasV_u%?9GryVH*`06qAFAr~ zIbBqB-@4Cz-nS!^6eJN~abZC~KoF#*#8f~)Kz)GwfzXh^zm;RyG$0_vAkt#OYVO%* zIbSWvzGed6Pq^X5*s#}DH*Yp!T0DD=F$a1q@Ub&fet;v2+p5LDP?%Es5;k(!|}0D?(FBianGwc;294KLZNO_ywb8vkU2WGf1x2;SY!uH@A( zc~X*2)z2a7xcsSJ$;(SL#WUrkAn*=&+_>+$f6t$`V9!i3IIDpB+umS7OqWE_bT#tI zp%9j(O-n7@{hIJ&#dzVgMJ~gM;#Yq=dJL#n37C*gBxCpqUQb1>VsrT#gl0>K_iWvq z&5^4Is{!6_ydLkmN(Vff#lQdx ztAKYG-wdC|RG+IQ;0ti`b}|84k|0A^l*j8h<3D!Zqw1y{tK#;316p|tyU^}i_Y6C~ z_RC?EDH|58Q*Q|#CJ#ty9U$5^xxUyE>{tF&1^zc}A=4GokY5LdyQjsvLw;Y*_F^sY zuq4_-tr3%h`$SLALkzt|?`=bJ`)oY^G+47nccaAqx?c2MKN!ItO^AgN+Ar%}hnJK8 zedDHi>lng}c{*h)yV(#)(}aZN?)?j%?YuaiHoQ>I=L<+?d6zSfNfa)H@fyL*7(sme ztFz?%DF!?%ojT`wVn5IFENkF#`B%xsAG0D0pX;0i*NU+)JSh*c}j5>gtqRI7m&neP+^L$SL%q3u8374@Xtw%)oFk-0r8l`*NknVq3$$8VXp36#*&k z@XAxL58a`el6h$NV{pUv`^59=`^g#?WTs`ePzMjM@lyKYEltOV-OY~q;X9O7_vb$N zubVB(BEr>lqw8iuNY79QfzP$|tllWXrg%E(oBQT#ZBf{=fN)oRV<&KIq!3P;#Ot$8 z8gNm?FP(dn51?q+x_GPN;4OIhVT7lAa2m?GC*bZ4F|5d{KN+kw<7+R(P=$P(Lb8ct zE-sr;Gi#$LU(;y$4_4t#4;ceT7gxm=KdB+sH?#DXXW6vDpP4oaHb+NTyY*XDb)I_^owWd zuuv4$1CsMnERE;-hZWHVz8X%VJQg z)6$p~CDW}>w_1Ki$U6D6z~lcM+xio^*xR(*cJtd)a?DC?^~I7urWXpt812*Aj+4Qu z)cY!aqTr9)N_;tZ!}Zjy>~`)K-kw7g>JIOmMpRZK>%yLtpqr>Gjw6iD6P9{aF>V!a zq=xPO;mWY{Hb_sD1L zXu<=jPtfY`Nk|uoIAH#(l8S1`(v8WF>h)mJ7wpa{u*Ga~ms%sWFTQc|^RI3z>=URKZ^?%Cnw7MKjHW zHB0%i8Z<@>j4-ZG!CF|sj4Lx;2e->rWTaML2u_=$Xo+bku zy!=`D-J!p_{}86iYWoz;65q!Pd(SO8@{RAC0FA=ukqxY`>a!8?Elt;zAwrMH;z+l% zHaB>fnS4q}GwG}z`sdP8`3s>spCI>9+~S^@2$=xdT~{L4YqS(i$H8NlGi&v+E`!~o!0sNi|Dtu* zsp)HXywyKXlKCv(V(Y|GrqS|C7x>H$(V4i`HKa$>Y5A_JHIWV({A(>T$hTko9RWcg zhA6jmYOkklzF~U2wPEBlM>yX~zF!9(GZj)Q%!2rz-=0|dLmLLc{h>k?%2;ot=N9>6 z@nJzeB)iUF;n?2uC|rYs6Ok4tDMp#GbhE&*o@}5l!Oen0rnNkT>F))C?K|XC6s+Q+ znvOnV>1-><;asdA-e3*V6Y3o~JnR&^Ilp3GMbS|MnpGnrp) zVR4vpV}PSkc1;XF%?MQ0dlB3Z3n{(ZSN<9x?741E(|Bn^5pH&yQ^R- zDfan{TCxb2M~3oKYEm&X4N;#Gl?lx=zeIbD7aV?V`YxT#nK%G~$9SIfnQK4IF5pd$q*BRafKG?`?=-a}OG|_zf z^1a9nSEpYy2%?tZDI^6Be#D_lKF+7s*NGRrrkws*vXF&>87YLB5a~O=DH&~C<0Vg$ z8M})i>Na_g$;2~rvdhz#mF>2ulh{DWm(f~$J* zgR`2zfIoY?U~a{P$dLLJhEX|BcI?7rypaZ1g9MSGGp4dlfnNhhIFU=IwdE3`XqGKs zBG#f&l5>!Y+T5#XsxAm(cwI}Stvf+dpDea^@*0xaV?p4N&<$O~ny%oLNRk`Jwov<% zkJ%hvo$4{YsQ~pV<9W^ch;KwP%h6#`yR_gz?0w}Jd5ZYFpSedrpV^DZ^u+)x%?WFp z+%}=o3R%`Q;Y{);_1{Q^wJ0a59gN~WR356{qazkKWhkZ-8O@uRZ$H1R5zhmOX`c8! z*vdJG;rL>_qpAkTPypv^#THKMtr3gO9Yr6EWh#C!y9nH3 zh~W9eNEB(4e4qZ`5B(S)S_f1kx`6M3p!mjQ{tcREw{M!6eAIz-p_O(|k`$+hd#*LR z@cJIY!?;i--XxJySB|xtzn+h=8jGz|S7Wy+^VM{!o}g?GEc2;@+{boQYn+s?JR%6X zY)xNm6vnJaQNKN2cTZNL=GXXrMRII9ghPPXLF{0a5^x6O!RY}VQW+XWw^s?c@le5A zr9PKqZbL0Wg=u6jfN6rmkJ`iBWtRT~Uv8>8<(Uf6SYQ@Ev|MhMB#%(unL=e7xo&8x zOO~5fJjFm_Whi4L?~ClwZm%9MpQ#M~aAe8z*kuT3u8D?z2e^J}cLOh-^eWen_7K=H zgp;JK3%uL1EMy-#DwslBZP5r0@bY%8Wl6n0RQ(0cf>B2-d1M83=~++sC|_G zF$eNYgq)i2#1arDmK0b4v%HA)$JrWL$NUvcr z@;=hRsujKG#jQ^+@82*7W0|+rxita6#5@xXgR;INb?@MM-@SHR)an(~TPC3O{0Y_U z5Nx<>jqG`q+%4;s|CA_O_O!k4n+UDUqo5_d57`QZrMR)M@EGIY$)^9CVo@P(Q>YC2 z<1ZzdroUlLDtSuy=PUzHpItQx5a}VipYdqLR|LL8bm1lPHTdES5V2x$2GIddQD;tD zq6+Vv!J3PiKc)l-tY*bf=8#b~QMFv2t zjJv$n*5|A0t5F#bhXImi=BN+O{UtsGTCN^=Q7~&OXddF*N#+7J$p)Pr=h6W2V= z+%z`s<*Q_>m6y9Qgu4HOO|oU9m5Hy5*uoGKWAp`godZ#1EF6ta)o^0r92#If239$I zgzqKqJX8m!&_u)n#V)8w)PkvM>f7%3a$6B_1Wcu!E zSavtC*-M^MTUH6nSRk+3#}-B_4%I?q=cGta@fFb_$a~A4SQlozG0>>&sFN!QxwjWi z8!rVr-8k7bsbv7HP_KG7wo1V?+%S=__JSU}9g4a?DC~ELCZ2O+g-#DPI1PPKqN^N{ zcP8wBxr2VG6d#yzIsXLNwbV+4p(w|IERa zQ*Cvb{75HO!wA>R>*>ITGg^fy5ZNxI+R3vZDM-@c=NHlIrR}$kKH!+Tr#x(GElR&> zsX*V>#)cWXxMVvYyrcm6SP5-;`GUQ5B^}?)tVy%@9@#;QnlS37x!;AnnnhFd!FYxA z9e#USb8OhRW2GqJ!Zsw$vH3ZTxgGCeZE{mPO1a1~i%iZrF_2TC3>}wSDMASg7L-hp zD{HhAvJTEIE{gI6^i&}!*$I^CH+f~*T0BD7Q?W*igV(xg-dNqwU>^q9vpSQyK?xmRsn424f00IFwxBei>uM+M zwEGIpc`0=k(Kr4TYZ)5gn?s%nKUU)#y=9ut=}U+BR13F=acr~Hmp~)ecjF)2Ev0@= z^*aa^(v6?(Tb_>Kf@=5lP)n+A$9VPZ`~B}@!hFEyPR^-IMEkd9M5ohyfI$h?px1+K zuHP>pb)fOjWiFvzV4(%c2Oa2c*H|U|8od{hEWiuCRMcfpp8^6%qVW2qA2?e9@Oobk zJBjiSzZfoUI|L_1$+N$@Q(-N@`c=IPjN5?IjP3JCey)n6R83P^bva?44%KnlnsJn? zRcMJP&432&@!xCP^fa$!Ir^rDxsJ9%(|dK`%76wR+eaY>32gz{n+A3C1*FH5Qho7wq0V3R+ z6g4K9YSrMveTumd4^}EY2=<;#(k}xN4(5T=^8zx@j)XoMUy^5i&X+DXC9t_#({01nVm;o9fCBO-P`LMs2-RB(Vc{WfBP8HSaI%s57`kNM3uGLEx zh_vST=socEwP)tnzo#w&_EZ3OO5NCWH__TsD`tAloOCxHMjz9LecaR}$B+u4PiBm& z+#ubE^3w`v2Vr&CLc2QagGaB$b1Cygqnzb};QdWCoj8gS%DRpRq{e|3R1+_06Dgyd zxBH+T-3HxIO^Vs-C7)rbqRK|6A{BT4RkAt7%X*}B&VYJ!yM91|nOykcf`seB^7{LS zFgr(p%)2uE6@$xo{^NrtLIR-aU!QVk4 zwm<1a!!C|uC|R~d+Y39wKFdF9S8z&HfV8kDJ>&LF2hxif1f~Eluuev7kT7{yTM>^! zi-{?sZ+3_<)+(!oJ)-BafXPWGw~^|s^olV9&Z(Y2nlf=TQ@i%f8VmdMIG%46Tx5ey*jx79Pe=RGxAR-7ioS!m1- zU$T2gF&z`u`3Gc+m3LT~#B;n)BGip(LGsYiGLU_tDf?sOB}CRmPY5#Tt7GLq$<0{J zB#tJkIQ(`)y0WJ=vDy=3d-*UYMPIsAg@FtDRpj+QIF}&{%bc|sh7gId(EOl`1G6*%@^@% zb}Su#Lj{i6Zc%WLiqKuRyVs_M);2z;T`AbCTP+F0UUhY=Tvz6MaCZW+bQRJcU{66m z4jY+MdcOfL0s+NjVxwkc5Uac*zl{nPE+di1SIe715-MGOJ$(*3cDYI7yfqJ*Gi{R6 z$4dKc_=cqHtoXK=7nH<9-&tLrN@RO-tO`?mRO(-rq~}58s@-U8*Qb?=BmgL8F#@4E z7yu6-Xx5;iLB7UFT!CXKfZ>NX*z(8kG2r=$r2@VSC7;aOi`C};-IQX||) zD-jIMtba3S?A!! zSn4a;>oXc+C$`?#z`wy`e6q7R{Pq%GIK_Z?|Kt|H~}Er+8IR9~bHcQKLT;x+3X z47ozBp>Rt-=MfAI_A3Sc8>W2b`b>5_iqu)I!1N1+CmKKQz6nq6B|@Z4GZ5i*GjsWQ zP4%C2(x@zw6jicp0oU+@pOe*d(In|4J>o~g5;K}xsRRkXXC-U~H8i}+&At^odFaQpaJjpm^Em-(os_$pf zGaDaf6OK%*r$S!#;Xrlvck`kbOIe$E3qJ}k2F{fkVX#IEFjdO-*)+;=$CG$DTAEcZ z-?L~4hn zP`X@a4K(XA>Q##w%&Hw)!5nV^RFGw|RRVJ4Q z;xi3L<5EvY9jbS&6h;DB?!kwo6jHyA(W+xds>A<_04Z7Kd{Ib0N=kOSn1z|N=ik$Y z@oOg4p-N-qx_r`aqp%^L*c40p@opnIfTZc}XW!bTT~$OC6``~*Tk_0l0o3zkAcZsq>2Jz( zJ)%cyG2qnm?-GRHuQZAVWy(HUSgF?8$2LPtmWfdKzr%#48f=iM+E-xubl9oD>`5-N z0#c3*#2`OS|pTKG30S=FaSqYehaoNJl?+sx)E0m1#r1rjtQ95e)H`<2Z zDi{U6ZzNpf&U1F-D$@eN)sR?0Jn`rwA5UF<p*w8uA$P1sQ~d-frtDnjEN3z3tQl0)z%`&qV!v=YY-C?*3_^oP50KIttSDOU-i{5wqK8=W%ha@Bz0kodkl z8NyR$Ln77GQvZ?CX!9tQxz8>-gdx#-32sbUvNOwuhzOv(l}etSER`4Ox}m62No|>8 zAUZip-u3aBJE;JWkoI@kb0gOVn`#R;%-(Ed35RcPhE&JMz)!Hqv`gz6fhsd;I1a0q zu?{dxBQ3gNMz4b>Z}o~E_EjOkEYC3jB^r9FvNT^Q5|0g44b?mh^oI|z{L6=+q{Pqt z%ZEfWZKs3{{3~?{Ar_Gz=lb`=r9LhMO;I7?l7JRc0YwpXS)9}h`{r^>a&1nATAC!6 z@R;)K78nIT{~tu*OxN=j1O(mqqYLmCUC0ot5i+n6A#`Wx*xpV%KXZqxELTzw-9L~h z1DA9QHL)>zlQH6umBMS&kgq%I{yZM_a`lXvElqW$T-aOnTZ)!*A>HYi=6MFrm8`p4 z2KvxEIUuBvd3o@!@wpI9q${2!>7_ek?7lq^6j~`L3UYT^1Sos0P~qp+|IA#HQ@<>Q zj|Zfa6$}!5jy44c;VeW*Il%9&`mv=U>#hUNuf7hi!;PERrQT?5(9$C~0L;}Ui~<$> zzxBJZu|4aB9b|89c2v}kujmwVtYf_8mQOKI(dbVmiZ_^!OmG`+k9$`$tvA88LnYeZ z^x6vR{V*4f#G(q0q`T;(L0eR$!In49brMqS^!G$Pm(_@Z5g`wFc!8OSY9RiZgG@`# z=*jvPfr-l7I@nLPi$Ra)T7_Zge|plwxU)hAUuCjP6*+(elbxxeB?5az9}ThN_JDJ5 z^neQTu{OCB5CRptDdg>Bm)vE(wjQZ+(l6G#jfMcKChb358HqD^(ag)#1*3yA*55;x zz7XQ!bXqlzx=dIvA!Fr4)F~Gs6AGw@$e}|((u|MA4b;Q6L)k}$l70tU%Auq=0MpBt zR#R*x!9%>2uCd>_o4E3~B?xKa0rA*`3IPw^Mqg<$$N8G`XT!ygf;_5RO7x0 z(4ebNk8ZgaRmu7`6)~Uw=|MK}GVMtW-JWJlq!p5i?Enuz2>^J2;k6$B1|>A|7WEIp zNY;5B_=_-@328eb|B#Kp;d@s)G&$yBj+@HtWcw2&1LfwplOXWzR)_? z3F7;c1*;3qkFU*$Xh1N)Vq_Q&_R9E{Aor*7F!#3t3g>aTTSUNipODB>`Tbk8HGktP zwbk=btbU`LJ>6V0`j|@Bk4na*1N<$Q;gG>Krn3gQZ}|MMTY{LjN$Q`~&)Y%eXeMYC zyHI844-(m+TE(uS`QP1kr1ex|1@%AlMU@y3OAaA*<^X9PnmRxr={f?E%ZD?XHtS;` zX$n^TkREJ&PS6*?z$L~^d;0O_!dPZ?wHpUu{VStkZJOwQ&5S1X3X z!pHqfzxOHCG~!Jpzk8y*HfYrM9lv+DYav-R#R~V@y~)1*gVyygb^m-T;E6S$ZT@li z-l}AkL~d9irVl)2sHENQBpl7~@QdS?MQXAiU@-3`3y}2wmen2V^-}hL@u%$K{mL)s zG02Wis6XzVZR35qd#Je>?-kSSeGjm`eJ~-Q_pb8x=9IrsYWcN^oH|ic`281xLH)`}BH8&- zR)JyjNxVMy;qAqVE#s%#y3jB=f!F*rd#-6vjDtox1|wlc6H`$pMqXX^x$P4C=dv$x ziu@^6B`Xa%Eyj7vTHb@#M=c5N&1;wMUT!(*jz=5OG1sH0>%9mt-0b^D*8AyEF@We* z^0ea(rYkN_&?7vw4qSbe;>c-sRkPZh5u=rsekU%h)$D|#qM^*n205g*>4$7t8@HcEdxuS-;fUlFPX9CwBI)*ezzj!0_hV0)$ce&Yhq__G@BI5sQ- z#6BC5H!8m`hAn&kBwoIc#>zBSLgCZAoY@vofj3|K_s&BsEvc0&PUZdh zo?_`nkBx2I!y$#_GL$~fY9`TcFWJvINVRoS+CjgO#mh3grj6 z@PO}9-`>}uwt?n`KazxRyG;G>8}BS=T?GX>-S2~nquqXQ&F%xUq3&Sw914req9;Dw z`$@O0CTCf&ekjGddr9?{EzI1#&=l>hXuFdKW8@iVy{m*%cI z^lH}~roBC2{(OZ~%rNj3$Vu#|i}U=eG7`&#j~Gm6sI8$iQ3vq4u**z#xD;8Cpr|?n zCOM(@!!dXMGc~S zeRs(d%%m;^%fs)r5yYBWtQT~1&*}>)Qq9(?ma>h0$%NxqEglO*$$K8ZK$_p?F#KkR zPAqt>fcNQ(9i0b#cWA+PxR-Un8{f+%j3~d!G-qa^K-Tvu3M;_lR@FmFIHki_`Ot$% z`c0_amPW-_JRyTXh93LhcBfnWbGuK)fMG(y0EQ04zS8WxpN_ zI7)ayK{qZf6&#iYcMprsC?;b&=03yzyt$EJ&MqLAU}?(t=5UMhxS8>SCX=wIn8ZJu z7J9LnBq~W6WePwfv7TxEiE3gxmLh;T1L+PUdMgPda?GPqxZ;;Y{c-U^LUp1~{W^s0a zotaSym|uu|o7Ug?UO>q4aGIupYX>|Ed^X9fK=&R0RGn}N$*z17pyjK>W#PL~jz?Jk zd(*?3zkRmYVcG-NTLdUKWQIIRy@|-Ci}WQ z1MIf!F5TYMUpDP7R{> zUvKp?39M(v@NS&FFNlC)uJ!j;ujx+4tINR4j(o<9>!;_!G)45sk@9Q`T#eqZsx*_b zi{dclaO56MDN*Xcd`x$-m9}oiqQr@$q^PnCC>E zL_MIoeZYML*T*JJvW*_$SOaW}XkGj9$cm0oV8v2m$Q(^r-y=5>h<9pX?|zDuVj|sB zQ2ClhelVeusK0{PklWZjg2S|zd5TLuQT69VD=Q9Stx_~t^_&TNK4)$w8m!CccM~%t zeOKo6OH<7L=tH11oG(kLvdeT@aJ9|fIzE(z_5t@CB0C+Svg zJy)IiOLhlZmGMdsaQ<81NKq4FI*9fP>-8WVSC!-~+!y z=u)g_qBAK9fQ2K41fi~f_Bb2|Bo8UwP9`i9_Vch*-+^Q8OG>aC22>ayT6EilQRqUm zvUIZ)X+@4lNZZCU=n%90Qe^5Cdfk;Oxnk{PpDWH^g5>N))pjc5Z%x*it8--&na!R~ z3T>{x_gGh2ZmN%y`#NNq%%13>98Jx+bFZs|yLGlEQMrW9eLo31GJ_VL5M`9Gm*%1x zxRn#TtEC&=Q^NCw8zR$?qa^wAUGus;Qt8`03J&rso?1!Fhv>w3+46=%P>(JW9S*2u zOb~k3U(jobYkPmcOnjAqU}_v;mLUEaRoHC;%M$?88a}m@?-;)AvV~UBsdOW)V8tn> z4shu3)ecAI0R6ltKOdfaZcaKwwh;4#jBLeSmSXDgfr(MmW@s*)b)Pj_Bj`_bq? zeaaP4{vD8qO#-Zl!|Gnb1pk&(c%~NPN}XpfVa-qr{#&cV^TD12)U}!>YpDxL$^^n3 z@yEi7JsyR>dQCf{<9&*#0(i6={hL1s2GQ0@0?Td}Y$|{%<8G%m3$)N66|!=5+~kU( z`N^IR30s#!6$~yudE0x-$!Iv&%h`nC?6^j}{^$dSun zd#(e&$Rw3l{PuJZiRi53$Ok5H?$@`{&{#HKwyq3*dbo3lOCaK zqNMN7sh)8(m`rN^02YM^I!u+kELAhG0}S}VedVBkb;7{cyRecig`}OY{Fhbf=D`VE zG!1jcHMx{!Oa^iI^{>{4@9TzF(nfo95EdEyM% zUM*cs21;(zqKErc2)sbg;UC8VnI~Nk^H*r1a$^)-alc3S%cqUhvnec4sC613E)u}W z$u%;jBbS3f{Pn?7YM=yxl3v9Z_;N8#oBOtinCmnMp=5zDj_-hcO>iRiHgKego%El# z)Zb;<^VNNdTg39c?=*ose{^j_nbYY=sFUg50?fJNGqT|QaPJ?} z_2Z?(y^e2Uw7;Nv5kQP|Q?Fal+6%A#tyRkPZuBJ^sO>8LUMzJ!VJ<`100t#XWQChd z0n>xfUMb+oR~b6updJMJMGbQVu04|T^F|rAhf-PKJsw_8C}o~8Iho|} zS#Bu@uSy)0LY)xh1gFblh?s?8G)#lhk}}+n1~NG>zgri3^F$$amtU>FqcKjVz2P%? zq&ge*0hCZa3Li#pFu z*?1ntRrj&hTXJvL-|YVeL%bzDom8Lp4N*Tuf z=R!}J0R}=sxTPurqmx-l_sh#GG^NT@(B56CdlA>_>`8h%lqpgq3;mJrfTTcRS>A9; z=IRBgDA2R0hUnK;8>UkcQRBtYlHnr0#mDUQ`6dC7Yk&0nApwiGD9n|8t+$mZO#rd} zwi&QMMlg&E>TrPDBwAOBJQ4-ATaZ-4bvf7Us4t!qGQ<|)u4!KgSP2Yt z&GWr7sGT3y7RDAMM^xsL#_drO_oC=GOb)WrJnNcd>^7tve*`K=a3z~7BM#(Cr7cAR zszb)Ub}&p>P9tSRz-sA^2b|v(dH3QV$D=Uhyw3n1p;mZW@pLurBb9DZ7J;%Kmg0$p z2G(s9>l=XW^v4Gn>=$KYplrDF-b>Zpq@lSiojsD{&syXXePLAo8*Bja!2bu1vHZIL literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813222209839.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813222209839.png" new file mode 100644 index 0000000000000000000000000000000000000000..7d4ae17a2873d2dc813f60ab6137e337a81ad6b0 GIT binary patch literal 7557 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 Y-;a_mn%6A?9_z^9>FVdQ&MBb@09k57AOHXW literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233107878.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233107878.png" new file mode 100644 index 0000000000000000000000000000000000000000..c401c3681139137dc4194440fd9b304e7c4a052d GIT binary patch literal 39657 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 m{C5KX1^@s6tUpk4000zzNkl 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%0DWK&B|q2)Bkf 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233232772.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240813233232772.png" new file mode 100644 index 0000000000000000000000000000000000000000..863eddafff78dff6c39b186bac00f9e6bbe5abd2 GIT binary patch literal 48284 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 To~v!ZK!0SV6eTOfjf4LOFZF`5 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102516235.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102516235.png" new file mode 100644 index 0000000000000000000000000000000000000000..3a4d53c5bc337150e27d400e83839d209ba5ef5f GIT binary patch literal 21153 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102549259.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102549259.png" new file mode 100644 index 0000000000000000000000000000000000000000..8236b450428faca7d4db4d39fbfeaa5c112403a2 GIT binary patch literal 2828 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102757182.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814102757182.png" new file mode 100644 index 0000000000000000000000000000000000000000..d8b952d4ffa583123f4938f948ecedc84df0a15c GIT binary patch literal 2135 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 Zs4e}RRVR-q;2#43iGGz5EaTVq`G3~aEc^ff literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814105728307.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814105728307.png" new file mode 100644 index 0000000000000000000000000000000000000000..9efd938ad553314eaddef56d6306a0fc11918f14 GIT binary patch literal 20401 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111432108.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111432108.png" new file mode 100644 index 0000000000000000000000000000000000000000..40e43c8c833500c2a1c58ebb249bb201a197e6e2 GIT binary patch literal 5953 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111452398.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111452398.png" new file mode 100644 index 0000000000000000000000000000000000000000..73c9a374602c6ec4c05e01feebaf862fc22df2b2 GIT binary patch literal 3010 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 Ef^Coc=l}o! literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111510069.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814111510069.png" new file mode 100644 index 0000000000000000000000000000000000000000..d10d3d9fe1dc7d0b5062c51ee9671e1aff199589 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121157863.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121157863.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3819d8638aad4b73b43dffd86f669b0cd7297c8 GIT binary patch literal 20715 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 KMwg;)hy5Ru;I6X( literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121333373.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121333373.png" new file mode 100644 index 0000000000000000000000000000000000000000..08c486a2a04f37d678e9b203a3bba29d0cfa44cf GIT binary patch literal 3462 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 G4gU{CAxy0R literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121500396.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814121500396.png" new file mode 100644 index 0000000000000000000000000000000000000000..599fe7afeaefab570b061a06bf2b41ef96bad434 GIT binary patch literal 5854 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 K9;*+jHtL=zG_Lk<`ZrIP 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132028781.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132028781.png" new file mode 100644 index 0000000000000000000000000000000000000000..2192eeca8e218120934de0ef3f7b78bf43a26bcb GIT binary patch literal 4262 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 IM;5{V0mhwDWdHyG literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132039205.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132039205.png" new file mode 100644 index 0000000000000000000000000000000000000000..32d010cdad4cc79aaefd69da2a76479bc7ce6ed1 GIT binary patch literal 2419 zcmV-(35@oMP) zF=*RN8^?d|$G3S1q`VLc=@4}YSv;9c1;Z=Y)&S7&tT$g2VES& zI|WZ!LWjsppae<-89cw=a3@Kx##)cnf~?R!-sz{7z_r( zFXcaP-2j8ZVEBK;IA4RoV0Z(J^EDU@hBv@CUxUG5cms^{H5d$rH^4YwgTY{U1B~-E zEJw405PkgGTQ|gD_&xdWTQ}hMriy>=QdxuW(x%mY>-HE{!)#m=j0f09y;SMOsleHq z|2fSLqHfKepGLI5cm&B>=m>{dsR^T#1H9o2y77x>oC=(GS$!&iZX;g0rWUWws@KQe zEzSOrH7+%u{&9tAsd;0(1SaxblB(B7h(q`mzI9U!uf=$PZQJVKfN;w}ocmN0g&LH% zCXB8_*ecV|s;GK>M16zNi9M^U3x}t%k~N>caM-wR$KH1a%}%PmKbCGQ)^{8GGQ_G2 zI?du$$sitRo#BgpS;T(>#!gK2wrzO^~y@R@flLiPJ+ zI<=6grK+#n!d|h&Fil;7lnt64L>&h94ds}vCe!|t(@q7*l?Fa=KTM8ax=cESpJ?r= zdVRTIzTES9UjJf!oX)yj={u`S6~jj+Sgc!s8k*AWPLV|$&b5S<)#!^o29=$5+9Y1f0y9t z5&6cCtgk^h)cinM_IT%06^2WTEI?-D+n^&{DvW4PL-HHSu~1tYkyt7$7wbz=S6rU>+jv@(nEkZ3{~Ie z&*{MbN=S*yu~Dj=lP~#Gl zk*Z!FXA8oi+JI`CY$V27uG9S=14d7g<9-<_=i4}Sum~9>cEKL4*aVh4#4T6D+2=Q7 zraOFs@c?^TSHS(xS-FN&q4YH3EN0-qKU*%{0B!eQRT8}SsqeOW**51J^1IA2_+dBDtbrSp;7mS5ZHLH&y)$H zlUV=4$5>re{F=q&`YcgbZ!lt#7+)E!6pohipf;q0gwQNw5pt7gvnD-sThrjgstbh3 za=KQO z+887KcRK&9^;w3cHnjDj&4IrTwL$tM&({AH*7fw;Y=TOJ2c7`JdK#n@ZlA=%?g#2^w6Vat6A^$ad#cW z`DQB3pRNsMGe`8lmicM*$t7gIX2VAV_;soU2yh@7jQsPc4!27bejlIE$ z{o`nJQK{wSG8167=w1zd!&yk4HqGqRI2AZ`fv9Kec+V0!-o(OHI&`5nOY*!w@DHRt znjJ)4InPWzGY8K)962v^trLJXDLrI;Gw=@xnjJ*F!sjLgS)1C><3MTY6{i8iSDr(2 zSg9=w)1!4+M%4H5YrPd;xogl-jyIZ5y(61DuaCQXh+hlvhW9)iSE$t28Q2H0v6O+p zD$rzyq%4q4lmfP2sH@3$mA3b^cc~NN!cHXvYn_rFQRQKH#qE=l9-3vWrx6#gbcgru zNBo4f2r|lfl@vQh?`Wp$rN?RkO1>BkUg|vVcr2>3MOT-yZYZn*B}FB!kl8l&iJrdy zN^-2<;XMz!tOiiqV`mK>zGtku*S6)eEU|tUQQKsLbYFw-53wgX=Tce33MI&t<|}oy z3T{G|YS7Vis#OTiy&HKLap=X4Od<_5TCl@=9*Ap%S!r_yN~2rukW3!DmA3cr%T|Uo zvO1*3tRDL>3fCTKh^geyv72qzTeQ! zJrrsjq!!XiUrC`blC z*#-zN+l*?(+eEj8O()hrMcm$*`f}0hhIx1{J5y%{TV)!wXmzEdNXQbJEqh02_~)^) zeM!3)uHRUSt;>e-@hxD>z(3&QslbWVS5%@(UbTei05;RfB@V+C#`gdK literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132044757.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132044757.png" new file mode 100644 index 0000000000000000000000000000000000000000..32d010cdad4cc79aaefd69da2a76479bc7ce6ed1 GIT binary patch literal 2419 zcmV-(35@oMP) zF=*RN8^?d|$G3S1q`VLc=@4}YSv;9c1;Z=Y)&S7&tT$g2VES& zI|WZ!LWjsppae<-89cw=a3@Kx##)cnf~?R!-sz{7z_r( zFXcaP-2j8ZVEBK;IA4RoV0Z(J^EDU@hBv@CUxUG5cms^{H5d$rH^4YwgTY{U1B~-E zEJw405PkgGTQ|gD_&xdWTQ}hMriy>=QdxuW(x%mY>-HE{!)#m=j0f09y;SMOsleHq z|2fSLqHfKepGLI5cm&B>=m>{dsR^T#1H9o2y77x>oC=(GS$!&iZX;g0rWUWws@KQe zEzSOrH7+%u{&9tAsd;0(1SaxblB(B7h(q`mzI9U!uf=$PZQJVKfN;w}ocmN0g&LH% zCXB8_*ecV|s;GK>M16zNi9M^U3x}t%k~N>caM-wR$KH1a%}%PmKbCGQ)^{8GGQ_G2 zI?du$$sitRo#BgpS;T(>#!gK2wrzO^~y@R@flLiPJ+ zI<=6grK+#n!d|h&Fil;7lnt64L>&h94ds}vCe!|t(@q7*l?Fa=KTM8ax=cESpJ?r= zdVRTIzTES9UjJf!oX)yj={u`S6~jj+Sgc!s8k*AWPLV|$&b5S<)#!^o29=$5+9Y1f0y9t z5&6cCtgk^h)cinM_IT%06^2WTEI?-D+n^&{DvW4PL-HHSu~1tYkyt7$7wbz=S6rU>+jv@(nEkZ3{~Ie z&*{MbN=S*yu~Dj=lP~#Gl zk*Z!FXA8oi+JI`CY$V27uG9S=14d7g<9-<_=i4}Sum~9>cEKL4*aVh4#4T6D+2=Q7 zraOFs@c?^TSHS(xS-FN&q4YH3EN0-qKU*%{0B!eQRT8}SsqeOW**51J^1IA2_+dBDtbrSp;7mS5ZHLH&y)$H zlUV=4$5>re{F=q&`YcgbZ!lt#7+)E!6pohipf;q0gwQNw5pt7gvnD-sThrjgstbh3 za=KQO z+887KcRK&9^;w3cHnjDj&4IrTwL$tM&({AH*7fw;Y=TOJ2c7`JdK#n@ZlA=%?g#2^w6Vat6A^$ad#cW z`DQB3pRNsMGe`8lmicM*$t7gIX2VAV_;soU2yh@7jQsPc4!27bejlIE$ z{o`nJQK{wSG8167=w1zd!&yk4HqGqRI2AZ`fv9Kec+V0!-o(OHI&`5nOY*!w@DHRt znjJ)4InPWzGY8K)962v^trLJXDLrI;Gw=@xnjJ*F!sjLgS)1C><3MTY6{i8iSDr(2 zSg9=w)1!4+M%4H5YrPd;xogl-jyIZ5y(61DuaCQXh+hlvhW9)iSE$t28Q2H0v6O+p zD$rzyq%4q4lmfP2sH@3$mA3b^cc~NN!cHXvYn_rFQRQKH#qE=l9-3vWrx6#gbcgru zNBo4f2r|lfl@vQh?`Wp$rN?RkO1>BkUg|vVcr2>3MOT-yZYZn*B}FB!kl8l&iJrdy zN^-2<;XMz!tOiiqV`mK>zGtku*S6)eEU|tUQQKsLbYFw-53wgX=Tce33MI&t<|}oy z3T{G|YS7Vis#OTiy&HKLap=X4Od<_5TCl@=9*Ap%S!r_yN~2rukW3!DmA3cr%T|Uo zvO1*3tRDL>3fCTKh^geyv72qzTeQ! zJrrsjq!!XiUrC`blC z*#-zN+l*?(+eEj8O()hrMcm$*`f}0hhIx1{J5y%{TV)!wXmzEdNXQbJEqh02_~)^) zeM!3)uHRUSt;>e-@hxD>z(3&QslbWVS5%@(UbTei05;RfB@V+C#`gdK literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132114591.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132114591.png" new file mode 100644 index 0000000000000000000000000000000000000000..5d2b753928a0da8aa6a683628568afd7f7a9c95f GIT binary patch literal 20618 zcmb@O1yCG&zov15yITUm-8Hyta0xQF2e;tv5G=R^x8Uv&+}&Lh++DWGIp^N*e!F+2 zYO5%qx@Lyzo}TXK|Ge*y(2w#GNbvaZU|?WKQj(%dU|V1VyL#_e`sU~j>s zM1@pb(~ep{m=Va`ygaoE^I*XQ`@nGp&IQ`#NH@UuTOcl(M}}W28JDoqkW~JVq->78 z$LzANUl-SHpvfsfdt{<+u|VuZHTYP0^~7kR#>>iE;yE$sY@dz-Wnj+E>%Mz5%x!x8 zcyV{J_u~8ZjUVuJ@mx!Lx;G^_Rtf6p+g^g>*_taG`;-g+;7*XRMwVpif3;R-V(6;d zIaM2~=3SeOkAqx_g5lWiyuM50EAS9>ekRKpZebd7Ed-a;x5E0%2E54&r?o)chfX)Z z1V!Gn#HTWMu;XXHm43o%eW~^9)6-9FUdqBTK3TVJ9*CkIY_3?UuPfx+ZFJZTy0%^D zHPdu|GUf0yPkCH>vl<1x*Bn{wsE8HpPVVZ0aZB*PRZ49ThVsJi~m0v#*utmJAm^5`?K+7F98%mgG9vQ8FOE`m;f-yC_T0mdzJZ4IVfj0iRY z@Hu{8YAy78^`v3&972YNgF+0U(m2<82+k1(N8?C574|%6I$4Vm;xry6mhuYvlqphU z@+4`eeDN7a?P_MewZ5l%nXJY`UAXR)TsI;&w=&PzsbRuC`#8g`F8#s&8pHx(Nt)oa znj5VVM4B7O@A4KTixul!vzsn%vMUHvpEWLeo~BPCnji~^)m>`GLa!9tOR|o*%wS!n z2WiMwSv_#)*}zWgioF&j%)O$QDiJ)m#f(o-RU4!Qmb#qjA0snjRgR0h>ug-b7}SH! zGSv5C2OA;x_`a<8nM6lIj@+(3X+W4LH)e7Sm3nCMU_8FKDy`Rs7zIb8G)CsRt$P>3LilNYbSAQ4KD-E4w6XwalvTI?aBA^ zHd4G}M<`#}_1g-+@ryS%y3orOZb|Tg&);|FCkCksne%t%*)q zDEg_nKQLGm?vp$)aCC9ft6MtVhl;!wAx;DO5|#v+d;A%DJEPoJfY03l3{x{29p7-C z?MpeAyviJevX(e2lh}max~Ru21CL&El|PcnnQfZK8I1WN=gRHQMUO!xosU;IHF6Ad z7tU^$7Y_0wi4Dl>XdRr}jF=VAXdbholI%Huod>NO0o93ix~>wsBb9*wk%8E|UU7js z2fQLQ$2sH)se_=T9m7QeEOp(_vO#>rMaJN+UO--P0b#`6-0hxP@9A_1);Y;!v@J9x zj*MdO8B=!!gmEzsJuaA>ip8q%+4oLalqJvt^9R@N*trplSND`#AmcusMSjWy_jgWq zopfh`s{SKk%zRPq%Jhp$!%llbjgk!Hi4~jlLpqnD3ReilGdvJaHONeM)SopjntL|t z8*6tRY54e2&%OK3vd~z+$q%W|Yc*SQVx}I51*68O?&vvhh)?-o>nac)cx6fADch#d#N2E>K}nUujHMkk^#32&)P9ThWozlO~&shIqDH(Vh2E;AO{A zPOG4eEa_`yq-eOIt^1zlmKoEzoqcIxViQ7# zjIHS+J@px&cl{9hF#I(uv{yFSj@ONbalA{wMKK+G1`d4(N=$MV_2#nE1jpO7N9lqL zi6riBdv`jzc56d1zUv)&O=oh1@86doSu};Iua)jynUlPC~8gc32jIgVtKB0SvI9i z9;ID(NN-SfPl!%L?FPd^p-}OqToUA@+#6>ewJxTOz$jt=u#4L+L^xRQ!B9DU6%<^A z{!x2%LX&&*D;7uaizP|CuuCNF)Wjh@CS*FghHUzq&7JXXLPT4qJqgI^lvYWfb$e)1 zBL5;-D-~NBC?p1t^iGJ~4@1xExYZ5ttYg+3%x<+-UbM{yXlZ(23Faanp{2|ghX_0k>O^CU`s1Oo-K=b;*f5seT7zFt6Zrw zZ{;5H@!KoMN)@f#USw55Qa;pyEPMO2SG!z<5am?fS!MO%cxit2g`jykSiRHtu~^5~ z?Ec#QDY$AT^sR2Dw}D<}>AlfR6vEkYnlpBCTF$QcT~bPL47b=qCD?DO9G=c{ zvpQ{iZHpqm*sI(3KEFtRa1Ry|63h@4$;2yf<99S4Z#MRNe7AQSI_Q>BjwHm@vv(-!gd~L zN2&DbM)EC1@uLr0n}h*P1;3+bMp2Ji-M^P6af0l(S(Il(->!n44R*3@u0o^UT8DGN z>Z+taqpNvGG76zW3FVTl5uiuPJw+vZXHW}9y|PINr&!w*{1bLlW{{bTO%|kIV&bE^ z?vym}XjE^qyJdLbCzQ}*?Z-{>SCD!8UXuF{(g^#-L;l}xurIKpc(a*D%`yiqgeuCH zOIRw)q(AkZP{IEE9VrrI%`nr0!GoYnByih*zPHb~rDJRoRUd$hP?KrNqktYt>^{Vz zVyc&6qn;1D7$l8RO$pE#uc=&grlqJMdwwIytpUyv@Tvs3?uEJ#3)S>=-QJV*8y}CgRXvB!6 z+&RcB6Gh)Jur!5T?poV-XMqa3C!=0xtIK!i5=;s8*@9~KEhTW&vBjB2us`cHvp}7Z zHvGDzJk`%y#uO;uv@M5vnWO*geM@yjluhHcLdQC^D5)zAW4h@#C+G$Xd|tPq3)b$( zs9?;lK}WYqmp^ryE%gjo7{42^+hb`SrDa!b=sO<$xOVUS@-L_pDv<6vx-1o1@gL|n=G}tWbu-}1!~`LZ|Alqj+@}^W1?EZs6LDbLHAW+w|{CgRGet0s3|JN zF`54Qt2LWqhHXwXL(!$ZCI3{ibuH`8`7xy60=|x4)mLz{R^-s;w&7(iFkB>!_;9NN zreRXPK0ppqu@Q|jQ2^|ytjd0tU0hPrG14CC3`9!jE+C)T4S7KuLOJg4Wc%~JSW-rRI-7)?n zcl4@dlGsn8wM{Q%Tz1}>;{sg#U)g1-b)0)MYtS@f5sg@`m*mbOf zxpw-UNeZ^fAUEcHWWwN=xW$67BNU&PgLjX)tO3gIy}w3bIRI+B<9AkJ-;rOxTI zAgR0kKySX+_yk@hK7gZ|e>dbhXQDBCi>3g!<_3mT;ukyVn@o+wG`JvV9&68XylxUy znCw8!z+;Fq4{FZz5nl+gxPqQ&Sm%YKeq-jNW^_Y+!U02;9?FTgkcN;Y5Ext`H#r-c zOy~*hLR?n(Xfg%pD36Il(Jy*0PfZ0Uz5KlU=-C}bV15N6Tx>iQd9!?jm-R%;?YR>6 zFut1FdJ9=T_uAR+Ve5xn2h!!}f@>@KuHVmA^hc8VmJuDkXSKdG;NnuIZLKoyO!xx= z_%wLL(0{id#V(Nz^AsHE{VfFdtfQ_3uhUFU>GodP)k)+{sloHd6P~{80%p4*6Vu3StiDH0;&>hm8+;W9fj+%Q##gHP z=5v>e8%V7vPyJg@U&*q%XU8M-K-fh9jp0*%);R`*-nF7%u=z(~5?bsz{nF2L=)gxHBbpp1(HhISA6OVA`gaCp1Hdi*)k!dI-G zd}u@Bytn!SX0_W2-MRDtI*%ek__o!dbrAZVzd+dbofnp6qL@%o*JrhlDUmE%d)kio z!MGXf^FcW;K6~61fjaYRjbdt6?oRxq&ouU#YM}74PFN(7ndvn|B}(jsI4Ba~F*h(#ZuSnP6-!Xx9zObcay!*(_2zSE7YC=}9Et+KF?c5TFpZ#rG5hDT^S zoZK)t0%90cA-j7FSmz9-m`U$Xap(d+8@r7mWNapC)#CJbOOZQpq}otw3sfhC zkaZd`IdG4W@QX^QpCDWFgshieXc?%?w=t8suF&qx_qP{0PqSb~RQ2@=g-o><`uBt9 z65dhK{T@E`*ucUR<$yx~*R6b_rhY?bQffqTZ#D7euKvx1)PeR_Sv#Xar&`vC!2-94 z!Ju`F@&#P+d)}o0BefLQ(ilPzyb5n?&l;Uqw-5Ph^@4xGuL9FCI+)*;?kr-=n&xI% zIQ4=z<@1$2`Sh2N#tfJ;P3s8lr1gT--=1~cLB~_%zOj5s>hU)Q5ePSLHeXu0 zcVIoV^ygRu>}M10QGj(%?1K+kM>G=2C=@a=;m>Y^kQ+jwCa-$J|8n=b_(CmhrO>-TBB=HN)KuI zYF`0CXP6p1kdCsoUTZ0W>J2_A+=0!w_fVG&refEi?&reUISVd>a1@4+`xR_dn~n#t z8}4Qi{-RnQ`e~6MFC?6d-X2uvqxS4=lyR0GvBaSVh-92CG2tp+6t3}IC}Wp(huwa* zttoLCxXbgoPz@w|+W+dl-abpinCZB8z$k-ZPa{{hZ*1MIeOexqnSW7A@KSxMibm&K zmQ2>yacqOf<483&IU*Q97+pVX&&K_QyS_gP>pW;?bf;O}H<_PG`Rg&Fy>t=JzDF?8 z42Z9-ZpA`SDjf~czgl~Vmf(T1*saa zjcw5nHi?1`3$5rOa!+)JY@;x?M{$12l#F9rs|~hEEG+a06pe)TldH505}r-V=k@}q z`?=TOkr1LV@|g!sx@P`hB35Ug+?7 zXW7?*xb?HpIA`_cz#S{`q|U&vdJsh&YxVW5i#l@{IM|_q1LSG%Adj*M`qGOMbZ`9G zP2Tt)Q1sOt{X>bZCa$4o#4K_cyY+A$zp(Kjzx|{r>2cy!(@-1f9j~k)UoLU)<7svM z2NLItC|=k=9^nt%plK_~_OJzWOcBTr1(EO+zhKVU3aIp`?jHalM(;dgrY5}8k|;L> zJKn$reQz>fH%BZDYb~~FzONGar1KkgmmFlb5XsBMESF@06URLdWgK*)6K+#)VyMBn zu9GTrtop}>oqFDk1}l=lH)9ClVU{UUURsz^)rJBp?GDtbxWs@IdNj0XG|>+1z!e6~ z-p~HBV#o2QZ!?$=mqXW$%ebjjoqg3f9vwKzB=xr74KJ%d)#(t*JRwoY>uh^#MPA_J zfE^*?T1%+RNDi0xUvljL4GJRmk#%6CqLo?q+61l2>n;a z;wG5OvXP3?GqMaYD^CNRY<<;_DGIjK%R{w{3mx>PnSSqgjFvk`5P`*!3GO2U&sHII zwIYYl-G|R}AbTso=C13%M>+=ALX*>5T|g4YxMlh{S|} zu_kKi7e2bcLy;ISij6@O7K-N)1LqtImRSg9!xPdDgG5LYzpg_&CU9MqY6AYg)~410 zN(7JADkeN-R@35lMd>SMRfd8b+Z;28pw%w{+g6JHmu<@|91{>6Vq;G6rRI!+>{Gn!k91MrH}c6U4^WKw-GF8xDrb zI5H-bp|YgSX#CtrWhe%39Fad&NZ}_TR%&s(v)krK_)IWZFp?U@I8;)MT3o1~Fd`KQ zs6*{fc43379L0k9zUP<9ZTB0AD2EkNF`hZBShTz6ueJ?!SOY2E1?(Rlq~Hg5FxcXl zKw$HCOBc=+BD?a)6QTE6yQ9TQ=7-7}jsC@b8-bt?gn~xCF)N_*@x95a>gB8M#dWx7 zghphhbWJ9;6KGAqDTNJ`iC_(fHVqmq^ep}4TW#Vr9<*_sM6bKp4xEw1MN((b- zDirYG2g^4GE}~UBz4Fd*rEe|w+A{{4ELql*0YL^!cvlHjHfX!5ZzfL<6~W7echR$E z0TzRV*s&W3yL(c;PTo)I#@{u)|1FHg5mSmPHTux3Po61nDmQF?NXyR0MFoY$Y8=J}65IPZ?+= zI`9n(o^FStO*}>U`}N}MnMBlOdBCdUE&52=IG?z&$mP3KCb=G>IE&I!pUJkKfrr2c zZAGYADdSb<5ww;N%Z(k$&xwQ=+Nk9hN6;%=5P`Jb%SVKGw6O$VskhO>v7>La8e&6m zgfJXBqN+t9{#ZK@THGdRADjRy4PM9}fkd~$$89W3K*I)GU0=e~9tJJS-%yETkoVvy z2@u%N;?UOAuEoBqlUa2zU-q!#MZK-?xr^qyMYjuzFc2PDKvLj3s`EG&J~(<2_IDcz zECJB;$2AeM)6oad9$lmiNs0hTr05edQ}b>+INcdirs>X^OxhqIa;*a@IB;}e>% z<%P~sxjvf~rnuJCyUgys3cWrpz{hNc59eVR-#B9EgW@}jYYjf3Vz338!xQX?J1F(y z2uqG2+HPYeoUrK0&LYA~+Mal*GaliNFWdN=dAEBPdt)zCUU80mw4I6Ote*3nO`=E5 z_UI(`5i-v8wI6Jv7aT^gpE&GSgG<^W&Hd4>FT%t5xSr@`NO=3(-*4_?Lh-bUbzrV)J$<01hH*W8_ z_6&Cd_{+E-fVtoOQkNIC(6oT-uY6Fn!8OecpE!RNdL(!9w3nZLdEsXhad-9T4hprs z+f*>Mo$a~4ab~0O;uo5eZH$xO@isMC?8DjzB%mVO{~rbT57%vGzC5(QJghZcOkn6M zVaGc0T{3uYDu||L$s|I-p{}MhYWY=3R+VcHtm^vK4BVnC?!+?==(3q>37`KEQz~SW z`lTlOcr)0-TK)mo$rOp&6wb$qzmFT*tB_kAU|Gu~g>iPdqU9|AT^1|N6k6K+}9XJ-{+k zvg&vhJmI3DW?FTg-THVy_~25_HTW5m*yo4BOG4C@ADcT}dWD85<0?>X}Nn$7_4q}PE!+-$=l z5C#7HDOnMZI4XV$S~nAe9;mfh7b<9gyJ?O3d^xLGFt_=^VrgD@RW@wE1k<|AU69GY zQhU9D!|qCI1fiX7uF>FmBHzlSeL*YttI5^M%R~>keBv_gj)SHB7%K)DWBHn&W(9%} zhdvF9*&lDnEvET3As*#JLfWlzu{Dk%jgD4<&phFgMY9?pNNSv%6nsb7zbmwt4hWGj zkBG~)G~Jtx4DQzsUhJ_z7MQOk0hg=a7N-4}bLG)oqbjps9<;x3_wzQK-nlkgY!e(2 zOk77g!5SI=QH5)c(Dq!fQSXDdP6Jo>?@oSXOCQ?E1auB0FgS{v$-b3}Wz|rkRB$*4 zMxXbZ#ZQ&?#~s|!x;RB~`9v;&*jP}>C{Hz3Yi|`%*(jq+{`F-Z2%AG`jr;6b>Trsu zWG>2FbYDX{)m^cO)Q-0)Q~6YS0pge()R1vDoi}8zK6RauO+Q^0mgzV-LD0rCR$e|< z9{+R!5bs1uQ@zg{MWkVmezmqONtUlQ0`D6nuSD1#wRj0*0C2(a-9+mLtl#t(f{KPJ z;}nYFS0m``%+2o3)sqLZC+Gy|!1Epcz~oF3kaQOT5>Vt~g*>Y95XOvt*!JUa^=^u@ z2(XyAgCI>YAqyX%9>-~$>t|7cxnl>^^~ZJ(b24mRsa4c zWM=j`qd!)i6MhB2RD|^TJ1SRxfZa`><;Tt|L#G{VV(DN__1E51-R#D>VJ(q>z0CPP zBG#Hl9D9HaF`8-na{yO3UK-rFm$-Om*6Q?ye${%#$pIMfh%nDj zjxd1NsM#757yh8l_l#U_sUho&M$ij@pCHX%5{O)GM$GgOoIo~QA$<0+d&KYN1-m_q zxjG?wfYa{gAlm`kn%6uLSC&h22a{P@e2GCd-GW0NMH)!yCP!y#Kb0pfy5po0oP%cH zr8@W)B1Fl-Pe$njknUDd4e3V|?DC`E?9d#$!jaB;ZP%{5CDaaXl`mpZiEq~2Z^O9j7rFhwQKrO5wykd-?2veyV6sygj+JihXh-a-EIY;a zNB1Rk?PVkKuY|OE)L5DE^Y5mS82vNcj4DD;2 zJ!J2tU&!=6=(k62n?^joO)1e=$;;K79>QMW-|?s@o#pXr>p!no=+}hy6rB zg;DhhUm__eJgn@YQ7%y7t-L`b2?C8yCH0f$*MR4#=pJ5WAZ;0PzL^}9 z7%j5XrsFG94hEOnPY!@}@IBfT^PCNMD1~&z(-k-Zft^dhwGctnR21hKBk7RwW6w*2 z)g7q-Si^7J)7}=oHh;PqA}*&Z82&m-Nw#+-?V7V~w>8jNP(ya4`3l1`{HFmDXRCk( z3~1MD8_Ub`4wU-Q$|Pf{@Djn>P)Vo}UO9kcGLXHO&B`C7To2SD_KyQ13wehz6D(I5 zMP<4``<=xSI>4Hw>!9k+%^xgI0j)ltbb}MefdSdt@dinFH{QjJK&a$v#3HJ^olz)Zic|Mb|DGE*$GsgBnY&fOg6u> ziaxBrakf6?!EPiqZp18eCH_k#Mii|?r_9%t0tfVw1$YcDQUfkqbn;bc`yutLc7gh) zPS%x?2*<;LejmR_r+OYIMqab}`>Mnf82DtL2)X!a9Tj}hcKzzoD^;wXpXDuWC4~ZX zc%PjWLeeEwDSK3&cHayq&V^Z0&#Oj$lX`25*Z*uYK*Z|RjWO$nFZo&TW)H)M-XumN zCh^E&0q$`=C)vd7mmYl-f?E3_7xbt zfxMsQvUS&#>B=V(UY?wU^d=Z4&cz6QHaUy^6s*8QDByTgGFFFUb`ee^!XKYYGtje= z?`xG^CmmS0jxr55bD*LXua2l!F%R_fanm9159cpvdNiLRs(QQ%3lX#q&G7;OjFvRH z?(fE1%lyXpNatgv1O6rEdMDgq$K&c^hH+`{9DVO(*YF}M@)~@y2Rtvtv>#Tv&dH&4 zey=25za|>$;zFasObkLZIW}xTj-x~jRrXNqr$9}CuLjANpBvkPh7X-2b%@3RtgrhU6J2Vdo1^h)+XoO_L)^ZTVJ z9o~|<{D_Uc;xb&kmYW#6>f?240cFYvad7vNSWZWe1k`W!e7!XpGq!==_C#yRlt{3Z zOJ`#lMHA5WPFpGE~mUwgD`fV3&!q4ZLe-=rZ>O$^JDuJ zCQqmZ43@`nbKZL4<+9ndHt0|AV;M!gn>lW|4ymxRd zf!@8y%)zc!dFsG87v2+MfVyfd6b3G2Wa2s43Dk;mU<*d0!{I)jzuPR&S`)sRLOqg% z;&JyDY)W_Jd1-dB&Q55~wn@{t$&r+fYuA{~jEx9+yZYABk@i(YLY+~bAJ@|UB_)^s zA7bl&nDsxNq9)rSnoA~oDpVCk$?S_H^jKtu;n>r9#q42evh0B-C79<=cWQ~7LT-kL&l?wGEXgXhrL78(cT<81%2~L7-pOXC}DLRimw8v7uQ|+cFNyz zwTKK{oC_QlZKj{f-&u9KNe(AKBaHQH`1>{TtFW5rnfAtCl`r%q9P}+O$|3y*$Yo2u zTuHTX3|QqP8P?=ev0Jm1oB(c+!LDgrmpb!P+VjAdZ|T}2gW=esVWY56*3!7eGOQXR*rR@@-{XxG^A3DFOpxLitq1#L0^Y;5#i5)E zN?B}21j>{%d^$&n$(#3AXno0pS~i(7+4I-*YVr$z)XU&&U+$UD>g=WrR8NkX41+n&bK^jjtnuszMx)HUh#@Zo8_nG_;bvb@@Ce(+NvJ6zk_S5 z&QXqgd@g<}ySzhOwZ+VlOtfthhBoFRX5s#5 zLoKdohYgc>J0{bibYR`FIrz;yh3QY#a$#rsa04^3D%mQ>ug-`-xCZM zgl|U=#jErRm{HCXc_=iL!=6Ik*b>N*j4I+Jrjd^mjz<{gh@m&E ztk$bOE79a)Wk9Z<+R%6nW~I+-xWvvthkF6XFf}T{PEY_#?z;6cl)g#+V0UF!2gfAp zZ9*^f+PLW^M{|9j}WYw43msifIDkJHBFoGlX$<51vfy0h_9zg^giRwvDWFRgok2`SNrq z`VwP~e*?h`F2MmdDu=EMY}|&P!%#e3Cr$=Wj@hduovaQ!r0TGqDFr;Q^{4GCn*k~= zF!BLp_#KF)wPC!Sf^03uewnB+VNY8T9tmpwx?&r5Xeb3LRwLqm!|-KO2>%5@J9s!g zIj%6H9+%pX39G@LuMckz zfW34dn7WIE8A;6s*O4oR0B3NCJhS(i0K*bd=llMVfYqeLz7=Qk0a5&KH9C+d4(6Jx z|L|va{#fH8Y<%dK<<8L4o1vS=Y{}1S7QXh^;zwNhCiT$DeM93t$rp zErkk2fVPg)c#uP73Ev(VecV{~Yrcz}cCxe}PnV0^-b^C1SPNph0?lxuaS3Wa!1P7+ z7`Kg5d9J>682h6Qmm3^aQBkSR%Q=0ICX461Z6zug-YXzIxMXP&V3zpBja?cJ0|O0P z(jbsI9`p_+WZ})OmTXT6sk|-F%#1tW!j-diB&HJZD`#T0FVI3L7Osi^3ph{y22SmV zfPtI^|5sA}W~B&^32Cms;bs4wFdvLyk~HVI$_Iz5Yj7#?X!4v&*7B`#ChfQGYv|K+ zdua{SRO9?x80ko`YLj1>DmaR32BjVq zS?beOg&|2BDrMHiL4IqZSqA)|z%nfsD>z;%)y~9nZ+%0i!yJTwSNsQOG9r|A50Jn4 z#sWw!<2^>ts+5^;FVz!(3!pAzIAEe;%4a2%u-p3M!mg2DZ&TBIeUI z?5gnexzjuxkj7PvLjCyun!^CTv#O(ea`oL|)pt8jOxSR{kC2ol6^!3tl~~&IgHu7B z(&Uu+Okvgq;r$A#1s&0!68#H`({^;Ra_wgH6kR%$L+cOOAMM8)$@ZKpp6ELPg)OFJj^0FPhB^jra8B@LN)%@e zIiOT*Q-?LP_g#qpIe#q5qg zm8PMaUEj)t8Z5)htikv1#bmXc84=@A^5AWA^AAZ8x5G({d|v}~N1d=;JWV#@NIFdO z+w0)t(MO%Y8|RtF$vS=Ue7<|UyLg#Zc3jRbcf7?G~4eMLo@T!pSg|@0dytg zKij^(-SPQTi-h|>ZV1J4phf-tX01T3Dk?ZHU^LEQQ^1cST4Z_1w=0ph=c-Y%4R(cg zWX64W5bhiw^S0Pg3})fNv+#X=B$uh#iMnh08{yqQ7|ClnfGbe}H~&hJtCs44x3nM| zJ;bRyhy;g`+a2m|N>)$j=H9@c81QflyZOe5dBX)F8Jt25`6y}PRS?fTboLUbdoLW| z$cwRQRZ2&MFSU@4x8 z^&I?Sl)v+KljARKjQg7Alr$K$>Mv}0Yf>~qe!K7p!_0PCm6 z)&uZyn~suCRGi>co|Tt&E@$Byx%TR!aWL8mLJaD#P!}yWn{adNdH z{$(i?a7FwT4p7Y$L!!-OwErhlX>2CXA#ut9RIn*_9Gwhy%^_Ev%re@#nG;vQ=${wN zVDf$5vJYTP9c-IgfAtjTxJEzz{t5n918{J0@N=ID3bKMBeG{{a=3rSAS_=_E6c-1O z;7IGS$mw^IxY$HSAV(!%<{M3KdPIB`I8 z@OH+>@tEU9w<0wbDW3YtC}7VBKwg;aAIRGh^_+d075>h-f0*I{kHi{i$PxRX(vEc< zni82qL}ibk<@6&$&JctA)|G)Spbs#Sa8nUl&Bd7kxfj5hu=i$c?HmSEU4Jg3FjZWr zhR#fex<(!fZOokzK&-yxk^LAcMab0n`3~nk!3MxG(wXgxe&AwtTTmtR0(&Icx6xjH z<`Oez3|>%PHU{?rG$RaP;|-k^X3_}R6H#6x-fLvVKm?r5T)x4|U%w}>2meJjPA8{N zWyOJmb;70qhlV8+Gn7<1xzJRjq~t`CPAWJy=7S z<|sMkGDfHx*lj&Sb^X8q49jX}64@mo!mJpizaM0zh6Km^jv&f;n#_W~hr0mu!@r1c$!8t(O z$Pi<77UbYz+TEK`4E8C;`Fzk}(O}iYzjrwQH_X;N^N(QE8dBsx!Q-c?un2>|?l#Y3 z2+@rG)=U67B;2)|T>Tyh!tozBSP-JR8;J%L$>DCh@0UPZ;TrKr z57KGg_C>q$l-sIz-zRK}FO0)PRq3>YHe979`+XR{pdG-t%*e5Q4(Mo_Z?FZ4?FK^} z{Lr8Wsy$a~QC#1stkwr3Z(bBCYJDZa$OG0Y8*8$7&_p3l{4Q!_o715&!iVo&gCKZ>W`$vMJm}papmzuySZUcJ@QP9adK3u5PVYuPVO9((zX`8j zf8y%azo;xs{uhQ#77pCxPV>?*_%JgNoOQLkl?ExEz*V9Nm3FZRv{Jl{`@kIjNjl;H zBvgCfF`Ttpu;CJpoAS$}bJcvaA3Po`dW9*$o9-Lgn^LPMZy`VjMnkLK^M%A&SG~@c zoL9Y)8l3XkOYg1K&cS8hFH+IL$=j4XGWmZ;H4jL+Dar@syn}_yaxR&o z+(Pb$r4I)o>E~YuWeSyT6RITpG~-ps-#70_6^&UzIcV)ZYyO)He3%s$-7ZsAsv}u;HLj>V==Hc4V?yOMfZ9Sa_6$vQ z^^slPlj`e#vpHgDWl?Idv4_bmkJ_C%_)wd`cf8*HtFuVL-?kr0{1NM)d^*4XoaF0O z(AyA!g#SY%r5{nVKhBEfyVAd90H80yxmzJvD#Lz_ZhB*PUK=BnfU&pE!ISu?d<@I2S zcOQfvu`1@oV2gs9T?BWuSqs>PfH75B6CcGW3Z>85TxKME`tS4UGrlp$E7hX7*)wmX z@Y~``2|eLdOIGw|zAQm;naRAand#XhFQcF(VvSQQp?Y-pA)DCdyED6Zfh*qE__&OI zvFbi0!q+08$I&2a_t5%cV$yI9ykL$MFy%Or{G~%4Z?K-~1Q>oxNV|Tevu;(w;{>0D z$QCjp7u$1A6U~`P!Sc_5^FuUdI$l2?mH54mTT&zmT*mKG>ZBU-7yN6t3@1^3aF(LP zf2@2KkzUg4eRwNl(1vJl(dLLkR!xrd+4|W@kV!7kZKRw(bgtOAXqUdnDo-x6BtH`Q zB1do2aiCR+zrL5RU)Hjv#S6itlOZ54zZn==Cc;ftj)&HiqUckx-&827(}}p_NZ@9k zMJ%qf1g7kSczFgdsF3R)ZiT0T& z=7Rw3vsCCYFOIc-1qyF>`2cp0go zi=ANpLRhmj!lUv39y%9Xid(T4{5FSyf+RbCVdmf{oAuf!(vxs@dyVKgVcTorklGL! z-o@S_D>Hb21ZGAyAXe#q`UIPkfWah*Ya?_q~Z<<0?vGVs(F$GN;tzyT?^YS&<-26Oi1%+PoIE%eCG z2vRJ8p@sOm<4*3i?vYwp5W>>7)-9P^z0+J^GFegqkUjeZ$6PLfYjr^ZrLf3U7e7Qniw)Q^cK* z1|HLix;SUjzYJgFUxrVC0vP#7fm(I{$pHq2%KiF(0dxS{*D3v%?Hjt0006HtqGA1( zlq)r8OrWjjiEkbpQV_BaFp_g&5xqQ9U%;=96*h#J_c)>z7rs6iUrk}ZrDy2@23?w0 zV?YJe1hHwvUScD204pSvpwsLj6ZVDPPdxnSq4-%?ZCORDDG18wvwDAX;YE8`z)m2+ z`*HEJ&ulG=-k+S>L0?}CFiKa0_?Gn*UVoTR4bJ{^)}AeQhB`1>!DdX~92D)lUj91l zjJG2DO=FY({9j|{4hk@ikmbKDA3_Sx2GXdkt}|9J5cCJ%6X5(A>mAZJz^v5bxpA z=pj4Mk3;$O@H_4o2cU?AnJ^1l4mMo=TkGL@EO)|{OZ=PJL;e>iJasI!rvy?Q!4-uUkUL(K3vl z5ngcu6xHWW$x_bgzvB%^VNMK@Gq3xqMkSG^*mEoO=d1v&Nr(Wyk zwTkTM^1Y#)%El4tj!ujPDkOW$wH?vs#?dR1eZb4i&v$=5&x0Qxj588W+}J$`m=9HP zI?ve1>2}t%iSe>TQ^;b)3eP{I@*NVqW|u+e0;a??ewt@Be1Ys}@K5b1Sfl&-G3S9C z0>hcJJ(a;1m<{WWt!Vh3+keX*o3GO#R$0m$i?=0?n-+M+I>B86=Gv+%V{tXqwmKLS z$A%rUjt@lDs5tMFK{^zx3@1qfES)X+`b;Su(ZKY|xbma-_Y-yje`*9_o`g}}%t5b_ ze$d=&rVPpkGG#iZN}!L`Y-OfR($i@`INdQoa~Qtk8$bMVutA|wp)?Rm9bvHaoAg|H zhFYU=-~Ov+?Nm5aItxb$9^P7Qr`3YZ+Ctx{L&Ax0Wj|mq zt8*$v9XZj-{pOc!2VD2DFf!PW46Wq}6$2C6Q|$(Q z*r^*INH18=`YQh$gxnJS-yo#Ze?`ddl7Bn$A1e#6gzof{t7+v8?>jyGxq*55{faOCVc_BPFi2e)^gm1fLW97I z0$b4k?>AH$Y?6}_=_{cFWyjYwE$o--H9ZMgh`MegA-g;EX(PeKdZA*Qj0gpT%ULQb zLbKR{AK#QI;)~jjl!hIomv*GD#aiC{#hIEiJes7E$zR|f$KQKXhPu)wVI`*PM>1Dl z>@-QO!%G!jiOTXjdG;}S^q*%uo~dB4)^a3oS0PS-Yp95l{1;N35n>rTtBkCRi&|O{ zRGSblgdDt&i@g7%k#qlNdVk>fgocTxEILSdnCo&WV!0JEXNhn|$emCaO@xXpa#^_) z%Vj%ksYvFMOLCWzkQ7G3n3mLWs}q^;dq?&C_IP}MIRC@v{dvFMuh;YSO4z#ybS)r* zqD91c&?B7(J!(Bn*M#suAzA$LGh^$&LKWw%K%0e&J0^tl)aRv9tsi5-6$kww(^59A zQsKv1q6&OEm+)kP5?Bxf%BBE}ynI^!yBhtwsi#mW~%&P9(y$JKLLv<_E1aqc3-nUGB~L3%wuM^e?a~w zujg03Gmnac^h5p`zP0WF4MA%4-m9Ov?`EvB;MT@UOe&lmZ_M)pC7weXCYx|lLC zb9RdcOJ0id;!^~pjxW;NH(0H*|4WlY9R9)A#*M1PD=2BUD?5N)$JBc;&f>byH@XhP zvP{Ej8db-Zd)h2}EdjzxC(fa;XMudKl$>qYioNJMJAg%5zL{Va^RQP?Cl>S#=uUWp zriK;t${zd0E^M@fg-{##L3bu-=uaRQ#kY&MI0SA;PIaxfH^i9Vv*dW^2!Rk@ntTHb z(qs`mrOJg3pmDy}QnwuQO7yt$8iIIgn>s^xafIIiMVoJtc;&ljo`Mv zAL4SZmM1P9^kP6^8I1s2E+N( z_2f8S((TwJfp2kStnoFU+G)HFYTo?9;;R;VvH3x8aCK8?aEH&oFXig5jz6D zB_T_V$vE^OC-g;q#ESJldApg(e8EIX8S#7&`3D&;||Nub{49(X~MUFc^Q zwviY!G>_HoxBP^5JC3|%xNw#f7wRAT8@YDCO!xm-h-p{s%<}htRjLZOn7ezQ-*D0| zIq{LgVQBi}(c3vFa^XHWn1yMVVP(jz=w!_^U)fnBVtzCu{| z9|m#M**Q@wC+bt)1+Y*RlX)1|j_I?Q2?~>i773Gj_@@(d%>jg{wVsfBla9t*2azx` zl-=vT!60r#!Y}vGfK)s(`9msdbjEd<*xyrXhVAm)64U%mI_HyNy;Rc@gE{@hn{{}( znjfMkF#UT=_0e&jeJ3fS&xgZt0jj4R^f37q6LGeJY#e{74IQmbqP1Ff-bs@a83t z8`zW+qVNk&)*Jcn!Aem@+y_fTx$|F}H^audHjk|N==z6kJK0LRcGrf7JmfgCHTy#} zCxw*;k9o{XX=Z}Qjy~NOMUH~$w9R;dN1}q*K`nffU;gAc%7BwpSoU#`b#hcN_~2hX z64KDHV#?xODe9ue#U+TVrNO-*WN=DFgg@UOT04yj<?@!y67Q z<~*wMy7@v2{a-CezT|%9%gqXTn*GFq53O%yv194NM}f6y%bRL2sP;zWIDw1IO>b}6 z)kzO+vA}U3$`C_ zolaLcNZuHFsUy;jR8vWU)0G=dG~IomV5nhHka+htAsHWSKAvoIQd+&-M$m4pir$XI zM_%yN*4?tC5Z5+}M5(aTQaouP4BZt>*NLpDC{o8{mY5AOdZ8#mIG1QeVbNrvAKq-L zKWiZ{ujnu!O9uac?JBe+%_FS1ZaK_fN?)vMYef0x4tN~>y5ZckcoIi8; zA{Nu`Zq`KnSiGB=t{A6Lj>=zFb~`1SCJl1pjDKZ1URj5B%Ht5-@e8(KV-SL|urV(? H=n?-P3NM>^ literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132156950.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132156950.png" new file mode 100644 index 0000000000000000000000000000000000000000..0c3d8d16ad12342381105e0426ce88640b37ce95 GIT binary patch literal 23938 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

2~R0Bq~dSt)q|1ezqx)( zvlUEB_4sBU8ulhey->U70Qy2+;dr1lHU$ZD>nk}qUkTVH@`@G>0@7+vs>(^#8v{%5*1;Y% zI1Q867H_1+m*({s{yYC$UpBaT+PJ}h9*>2WOCHlqBdu_?0njR4x+sa5Tb`T|_f1Sh zjCm=&t@Ntw^v*s@pgfpKCZmWyR?>Kr(dq|gCRbfPHZJUFk3F_tIKDUaodHo5<$@cx zD*-Nfaa2XXxLpwFGg59$>V2ITsW%GfTgQ8vL3-w(f0JEOc!8@~_J$xaRJud^I^vmk z62nHo*!X0%$gz!1-xKIJ`j;oD>o^Z{g0}=-+dykK#TbYc{T~Y0y~01A_qjhRt8x7$ O1JHeFsEyTvzWP77Xu3cE literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132330534.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132330534.png" new file mode 100644 index 0000000000000000000000000000000000000000..e670397f8292531b501bad0d182b9530d2d95198 GIT binary patch literal 24259 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 W0xMkfWpHwOJkVn`dAJ-T_}>5kk%XuK literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132333013.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814132333013.png" new file mode 100644 index 0000000000000000000000000000000000000000..e670397f8292531b501bad0d182b9530d2d95198 GIT binary patch literal 24259 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 W0xMkfWpHwOJkVn`dAJ-T_}>5kk%XuK literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133111776.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133111776.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c08fb6dbcc21028b832c970f089b17b1c01bb58 GIT binary patch literal 23410 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133152422.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133152422.png" new file mode 100644 index 0000000000000000000000000000000000000000..beeb85e0b8a9f0299306589f9ee2a5c3750bc731 GIT binary patch literal 4482 zcmbW5Ra6vEw}6L6I))Y$5J?FohK8X-7(!B{q;+V9k{Ia*DQS=f5lM#_U<8Jc5TtXY zySpy`z3V>QKVI(3IcM*))_yr>o$uQx5~8I-O2kM6002nUR26jr0IaC{wICt>{YY*k z-3S0ss;Mc;>w9PIWXsww^);f~&d^)>xHY&aFq9Gxs=CxyXyS4m6(r&0nmAvTSss1v^~)kFJZ^M)T7g zts_3<7Md-_dJ*D~lQnHtjjuq5a$d+$h^8mo$jFjt+#P06Vwg7bIL&n_6S2HD@wB_e zbrhU=#igK;o+q8PfN0+p`qczWagEvxBi7ho_p_sYT?!I)ye8L3$(|@7g_2-zs(>cb zt*(z)w5jn3%pEb!S8f12{($rX?d^6DC2fWm9#1j75vHgFc525E843||ZISF+G!R^E zT&oTXG7;0!xSZdCkvt7Dali}gD{{ZXrt$(#nR5Hg&{B9C&ElZ4!}fB!oK_b4Cf!t| zdZ%CwkNAHJXXmvM45j_(a8NfjCY%oj%GjH|SZ|)+>&@wYSXag1VKmIbixL&no|JD< zX8Fk@5tF}U&Jd#)iQMU~Hw;Oqc!_~@u!xEQCQ{$(VqpIJMfj6srwu@hbNW`$di{R!41#j0;DHq@$WjfQ}EFiFs*{nBCu1&@{NKJlwyL}*-Nw?Y# zyMkTYS_)z%f0YJ^Z2J>w|IPSKP!Vq_tr<*;1n@C?Qb+xn`0@d7bj=S0$ja4DSC=G1 zUt`e`nJb3+(4x+4nMf)Vw9ttPNbxn>RDVA^B(iBS%$7`gAHqZu<8wD4P5UCt{L7!A zo4KFltWxK!9=psD^ikvWWHkJh2^4-HI+FJJRBX*07v~|Fz=zo9b<{M|!&E?2$JXAI z=d)HKo9FGZ)d}LOFW>s5WhR9GZLhXQ0T|9di2_;n8*a2^)0UZ3Z;*jxyv75dFrHXy zb5Mb0j8Z#iC-5V$tJrEgh*#qKg(7Ni;-aNIfuJXLwfJkk1Co&Lz)ZzuOhmzMi=d7g z=kF_xB51(^Bp5?(sq*WmR`BlRH~QYo6$W1?!d+oO{O%^gApk*lWLSSVcXbCWCgy}A z{OKc~meXtI`5$hKfp27KG(^mvjB_`_3%G`sQGr&4)ZL zd!0g80Esg#)qGCv{X+wFxbyE$1@VO?WIR`l{d=rkOK-$;&}B&bXa;8S_5wKe0jf#F zomW|%C@A;3II1Ok7voy0K+_QWm1u#8j=Z_k#sN4KF*&0P@5*Nn{E({#Mdp-biHjZe!HhwI z(D>oD(t;8E1V0jA&_p{mIrbEydiQlH>Bb18v?i3_+JZ*b?XZS1+Z3y)CMV0B-6Jn- zDOQ13O7#)G5XoXYsCU%EKi@_k@K*m8_k4`Po_@>soI}ZR3^>Gkj#ZJ6ixwTO zlUB%U1W5Ka2Vml~=M;Cml$sJXko|U7?mCUn%iTr3kZb1X(w?yl?(tZ}TBo0|koYM{ zG-4MH>w$!U+N8E-UHTDbPn~H-7vFPVspy){FPn6F8O$ZOAhIUGUh2)*p3mFQXjaSH zT3Vf3+_`tA@G~;-cN~Mb^>?vW_b9umpFCt7L`euZ>jClxB=nko0rnM)sG+WoZH zg$;#y8Rz{~YF13Gpo1I>;`@UktK`Iu`zMfKr!}D;wIVA&H)fL}vUH9sv5J{qc~ljh zXM6PApXS<^vvq8yS6M_3Z{@H5XyeqG3&HnV-Co6#~_!UZhn6=4ly23wI?mMQcEW!htxISCwjRnA1DU!+RiZg zg59Dz#z==(h2({#4Fc4?kOc16LJ>2{CG-_=)`B0LWj+Q|TgWw@misX4T3BF`=JCCRXum0@=9p3mA?0tjOS`C~H3Itm*ZkUE+ah$MM>`FTG~{cZ_p74Qv8B3W>npqj%Ew;Jc4Z!pmE3aq zrl~a(k5A?t_1=ZhNemuPA?5hh_DVmQzooC>759J+A_5CrRqc_1wP&fN(GTXgDcYL5%+_WJ$dpcG! zUdNR8>?AXE@8zhlltEvLf|(uLiF6-*WK*P!HK>c4%Fe}Nwhs8A?~D5uIYZR*y5{w5 zS&Xg|>b!n)@cO|Yi-rma_ypS*)aD*Mw`7sOd_wiw2yQniS-S}Ca)lTMPnhN0Xd$LI z54=Al1@>2DO5bt=JE`_|`>~Q$Z?Ny*-^CPPrHo}0iq;ptVur3J>%JVGnX68RuTt#4 zM$dmCwqTMB^?=@}5lY)Q7r~!pYF39X%_z<~oZlL^h;C({9(a-~=Ra$>Er>cAPzd|7(%V3H}E~gp0DHsJY{XoX%IW4Uq=!0tA0hnv)#O_2lo)<;nQI z?QeVy(oFvLdX!aP24OE96{?e`c)-~v11dT7VX_KszVLv4h?vsxHhoRv!tid7MTfHC zytaVX%0Z=*$nd@3&=qaN#jSJKJA}ZaAJ1(JilXGjw-sl2fVzt*JBk8hk3RMBs~hz9 zcT|xXJR-g^fV_{sS$!_+5z>NZCY=Cf7e ztaw7_BIt?QVsdGytjO2kSoa_c>ZRV@nOcii=$x2lF@b|aoZK3Zd6IhpVkq!xx|ly$ zUtRGW%%YA+fXg~4V6e(Wk5Gx1AMPF+)MU7lykg`;y6~0kxR$7>I#*kk>ZOP%Yb3p>X&Ur?(F;$HAc}p4SETws$`HuB(cZMt^9GubqiS zY`jbt&10C$oqyD3fOmfyv9Tq)WzY{z8Xw8IpG%N%o_9<>l_Nag6aESI_2KX@$=_Og z(4?wzO&F5)3rOxJUc1zuW?6Y3Jp%UJjOZlm*0s0Y~|9)5g}hoN_8^=kDy@_S~( zdTFR8NKQ0)p(F?s;ypxmS|I6mm@_p zg&TM$$dFjkw+Fi>&7pHd+7CjV2@#YYdwqOQ@T~HUE1j6%+)1G`J^qFBFEM@vDr<`; zFoH1!=1dr42CCqDBaLBIub5Vioms*kBMEXztXcLkh1|%v)R6ai4t`;B&RAYaup1O} zZd2s+PLv0Gnt$5R=^6@ZgI|kFWR8rR3K_j`&OAJ3?zw@E0Xwj?)*)X*tN#C}PZt<_f&4e9cO*93kb1n{m{)Q8IWygN zx@p&2=#rx(wLBBT7EQRwBooLAHB%X4bnJHJVs5ZK{_=oj=i9ZVcJm~ZE#BXKV4%}4 zF7caWw{X1cJJg;ET9I@G6d$XohOyF+$!EsnkpAmz+gzY4~vX421QXI1V58t7x zmyX5CVKuMUDqM3|%^#y@`MAt|wxf&D%9o!;QeEE9N>DKOpD)C`NwbzVnhaF literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133153525.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133153525.png" new file mode 100644 index 0000000000000000000000000000000000000000..beeb85e0b8a9f0299306589f9ee2a5c3750bc731 GIT binary patch literal 4482 zcmbW5Ra6vEw}6L6I))Y$5J?FohK8X-7(!B{q;+V9k{Ia*DQS=f5lM#_U<8Jc5TtXY zySpy`z3V>QKVI(3IcM*))_yr>o$uQx5~8I-O2kM6002nUR26jr0IaC{wICt>{YY*k z-3S0ss;Mc;>w9PIWXsww^);f~&d^)>xHY&aFq9Gxs=CxyXyS4m6(r&0nmAvTSss1v^~)kFJZ^M)T7g zts_3<7Md-_dJ*D~lQnHtjjuq5a$d+$h^8mo$jFjt+#P06Vwg7bIL&n_6S2HD@wB_e zbrhU=#igK;o+q8PfN0+p`qczWagEvxBi7ho_p_sYT?!I)ye8L3$(|@7g_2-zs(>cb zt*(z)w5jn3%pEb!S8f12{($rX?d^6DC2fWm9#1j75vHgFc525E843||ZISF+G!R^E zT&oTXG7;0!xSZdCkvt7Dali}gD{{ZXrt$(#nR5Hg&{B9C&ElZ4!}fB!oK_b4Cf!t| zdZ%CwkNAHJXXmvM45j_(a8NfjCY%oj%GjH|SZ|)+>&@wYSXag1VKmIbixL&no|JD< zX8Fk@5tF}U&Jd#)iQMU~Hw;Oqc!_~@u!xEQCQ{$(VqpIJMfj6srwu@hbNW`$di{R!41#j0;DHq@$WjfQ}EFiFs*{nBCu1&@{NKJlwyL}*-Nw?Y# zyMkTYS_)z%f0YJ^Z2J>w|IPSKP!Vq_tr<*;1n@C?Qb+xn`0@d7bj=S0$ja4DSC=G1 zUt`e`nJb3+(4x+4nMf)Vw9ttPNbxn>RDVA^B(iBS%$7`gAHqZu<8wD4P5UCt{L7!A zo4KFltWxK!9=psD^ikvWWHkJh2^4-HI+FJJRBX*07v~|Fz=zo9b<{M|!&E?2$JXAI z=d)HKo9FGZ)d}LOFW>s5WhR9GZLhXQ0T|9di2_;n8*a2^)0UZ3Z;*jxyv75dFrHXy zb5Mb0j8Z#iC-5V$tJrEgh*#qKg(7Ni;-aNIfuJXLwfJkk1Co&Lz)ZzuOhmzMi=d7g z=kF_xB51(^Bp5?(sq*WmR`BlRH~QYo6$W1?!d+oO{O%^gApk*lWLSSVcXbCWCgy}A z{OKc~meXtI`5$hKfp27KG(^mvjB_`_3%G`sQGr&4)ZL zd!0g80Esg#)qGCv{X+wFxbyE$1@VO?WIR`l{d=rkOK-$;&}B&bXa;8S_5wKe0jf#F zomW|%C@A;3II1Ok7voy0K+_QWm1u#8j=Z_k#sN4KF*&0P@5*Nn{E({#Mdp-biHjZe!HhwI z(D>oD(t;8E1V0jA&_p{mIrbEydiQlH>Bb18v?i3_+JZ*b?XZS1+Z3y)CMV0B-6Jn- zDOQ13O7#)G5XoXYsCU%EKi@_k@K*m8_k4`Po_@>soI}ZR3^>Gkj#ZJ6ixwTO zlUB%U1W5Ka2Vml~=M;Cml$sJXko|U7?mCUn%iTr3kZb1X(w?yl?(tZ}TBo0|koYM{ zG-4MH>w$!U+N8E-UHTDbPn~H-7vFPVspy){FPn6F8O$ZOAhIUGUh2)*p3mFQXjaSH zT3Vf3+_`tA@G~;-cN~Mb^>?vW_b9umpFCt7L`euZ>jClxB=nko0rnM)sG+WoZH zg$;#y8Rz{~YF13Gpo1I>;`@UktK`Iu`zMfKr!}D;wIVA&H)fL}vUH9sv5J{qc~ljh zXM6PApXS<^vvq8yS6M_3Z{@H5XyeqG3&HnV-Co6#~_!UZhn6=4ly23wI?mMQcEW!htxISCwjRnA1DU!+RiZg zg59Dz#z==(h2({#4Fc4?kOc16LJ>2{CG-_=)`B0LWj+Q|TgWw@misX4T3BF`=JCCRXum0@=9p3mA?0tjOS`C~H3Itm*ZkUE+ah$MM>`FTG~{cZ_p74Qv8B3W>npqj%Ew;Jc4Z!pmE3aq zrl~a(k5A?t_1=ZhNemuPA?5hh_DVmQzooC>759J+A_5CrRqc_1wP&fN(GTXgDcYL5%+_WJ$dpcG! zUdNR8>?AXE@8zhlltEvLf|(uLiF6-*WK*P!HK>c4%Fe}Nwhs8A?~D5uIYZR*y5{w5 zS&Xg|>b!n)@cO|Yi-rma_ypS*)aD*Mw`7sOd_wiw2yQniS-S}Ca)lTMPnhN0Xd$LI z54=Al1@>2DO5bt=JE`_|`>~Q$Z?Ny*-^CPPrHo}0iq;ptVur3J>%JVGnX68RuTt#4 zM$dmCwqTMB^?=@}5lY)Q7r~!pYF39X%_z<~oZlL^h;C({9(a-~=Ra$>Er>cAPzd|7(%V3H}E~gp0DHsJY{XoX%IW4Uq=!0tA0hnv)#O_2lo)<;nQI z?QeVy(oFvLdX!aP24OE96{?e`c)-~v11dT7VX_KszVLv4h?vsxHhoRv!tid7MTfHC zytaVX%0Z=*$nd@3&=qaN#jSJKJA}ZaAJ1(JilXGjw-sl2fVzt*JBk8hk3RMBs~hz9 zcT|xXJR-g^fV_{sS$!_+5z>NZCY=Cf7e ztaw7_BIt?QVsdGytjO2kSoa_c>ZRV@nOcii=$x2lF@b|aoZK3Zd6IhpVkq!xx|ly$ zUtRGW%%YA+fXg~4V6e(Wk5Gx1AMPF+)MU7lykg`;y6~0kxR$7>I#*kk>ZOP%Yb3p>X&Ur?(F;$HAc}p4SETws$`HuB(cZMt^9GubqiS zY`jbt&10C$oqyD3fOmfyv9Tq)WzY{z8Xw8IpG%N%o_9<>l_Nag6aESI_2KX@$=_Og z(4?wzO&F5)3rOxJUc1zuW?6Y3Jp%UJjOZlm*0s0Y~|9)5g}hoN_8^=kDy@_S~( zdTFR8NKQ0)p(F?s;ypxmS|I6mm@_p zg&TM$$dFjkw+Fi>&7pHd+7CjV2@#YYdwqOQ@T~HUE1j6%+)1G`J^qFBFEM@vDr<`; zFoH1!=1dr42CCqDBaLBIub5Vioms*kBMEXztXcLkh1|%v)R6ai4t`;B&RAYaup1O} zZd2s+PLv0Gnt$5R=^6@ZgI|kFWR8rR3K_j`&OAJ3?zw@E0Xwj?)*)X*tN#C}PZt<_f&4e9cO*93kb1n{m{)Q8IWygN zx@p&2=#rx(wLBBT7EQRwBooLAHB%X4bnJHJVs5ZK{_=oj=i9ZVcJm~ZE#BXKV4%}4 zF7caWw{X1cJJg;ET9I@G6d$XohOyF+$!EsnkpAmz+gzY4~vX421QXI1V58t7x zmyX5CVKuMUDqM3|%^#y@`MAt|wxf&D%9o!;QeEE9N>DKOpD)C`NwbzVnhaF literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133210805.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814133210805.png" new file mode 100644 index 0000000000000000000000000000000000000000..72ff0a204e22ebe1d5ba2e936df5d4901910c18b GIT binary patch literal 2280 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134339407.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134339407.png" new file mode 100644 index 0000000000000000000000000000000000000000..ddf2bc5b4df5401000548e165c3d03635e2cb37e GIT binary patch literal 4222 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 Zi^+I2j|RsWNdFZ8U|kcP8m)&>{|D_I7q$QZ literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134349799.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814134349799.png" new file mode 100644 index 0000000000000000000000000000000000000000..31035e3f923153d774935647a341bc365ff5b0bb GIT binary patch literal 4023 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814141530725.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814141530725.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff239f43b9546c39e21526d913500ecb2a6a37ad GIT binary patch literal 6149 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�&EZ@>h*%$1ecRr3O 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 z zhvdEO0VOve^4XrTzyymW6Ro~gKhNrvH5XqRs0OR;N ze{dPMPt2xTA7o{XcDG8O;~vK%M6ovFT@|g~4Av;!Hm1&;v)L-ri6lxbEEo$VVihN; z>!%2-m{*;paNBEteEGai!mw74RH`dEp!k~U?thSFf^h=u428kzPLIvoqdzZ{ctra= zm%>V+1Zu=%+fuv?!&01Z3x!u2Jkqk@8`-2QD+g%pQ7r?DH%8m z(oS-Im55P_0VLRhb&TV++wZ|g1*#mMMC7rm_qa=3MSefZd~5aLNGy+rUgtFYd?0hJ zJBAjOJA8GxH|EIKFgbo8l70dGsoB1_Ao6@aK5*Jl<)n4m8sc+&qkUz1yD)aeOJYh( zWHuh@S(1$nM0>Y{*r@HCI?Cv8A9=n_FQSXa53q!R}@1$o&0bKx8#oQaGY9=PQe7$U$r@uq-Pr zMVRr8tTR+}+onY5^|-^7lijJ5x-lI7!X$r9Q|ggt{^_j?opBHmh-CFc!r z=6MrSPewd-4Z|m&H;4Bdby<%sv6ZY`DoRp zfgtWZ0&>`U4l8Do%g%*>72^aei4`kI2k4|t<_DK1zi%%?| zV{G?^$r=}^EJ+}{!|3Zy{UIg3wytA9zuH~>1y8ClnR-;koHBfPo-}4Lv^buB{aqKS zb_mx*DQn`CMRcrRDKSUq!i;u7c$+mb{NkL^%hHQO-;2OGJc{A8jZ&l1hCN@hk@Y!3 zKoKOUZH3&87KAz)>O4{f5Kv-!syc z8?&-~U1t*L011X>wPZs$M~;tvra9HaQ<@U4&3i;urP+CRpcx*28|(tWub?RZMUc;j zEbNFi7bJ{Fnr3PYf)* zgWYOV_(Nh|GU5uBqWMq)Gn883>zseJ4ED_N9|HJC&(%ir-w48d<3}Do2ltmHRU)VAmN?P&)n9Rlxea*F!AMu7}o1L zQD6v?1G`d}Ye2lFsHlJ5<-MtDNzYIBxp`rmxa{sX_mPATDn)F~`h&!1#D`8r>Xz!w7*;1_7VQ)cElPhZXv)#$4!}bcBNeBx-Cs-uo0Uqqz2q+j5u+dODUSjjIU>s6B zpcxIL1)n00C87jgaF{cB@LZn4hjARmD-)_0q)IREbLehNpAeF%^R zt&_1VNx^X9U(ew*W|C~@vV^RIQBiMh9Lx(bM0yj;sXK#{%O5LJ7I(ePv39+zx{bV| zT^4klQ_5v4J0_?0m3fv*2Y%Mv8u4M1qpq4vP4Iau%TCoJH?jHLb+s_~ z=8nE|2{&MQ#o_0d&4hcu$&!_JN2m02hXlu2j5f}EwB#$Io?OW3`rlSlcex8o+UG!ex+Gm*^O{B37eFkKXsf00BWss)-C|O;?xV-u`QSa*+D2{z!J9n z(eSsQT*;1s2HhWem7e2=t%gV>5%e|55VvRShUa-p)g?npG4;y{t6P+V{5Ky#vgTp7 zrI>v(sfwL&l|-Se|KK+d!%*#*!^FTcwqTjKQkytzj`s!NY1PIaC=06qNI;3Gr)lQ( zNU3h!?3szGyj`Em1uH#kCIiX+LrjF!oE`IC~C+D zrcrM>$#QXDyveTlP~CXn{@j6$>Qs`GnJe6+2F)l^*3Q8xK0HU7R*!3U*S9i9NW4}pdbxaf11||<78HM8kJeZ^?P^Z}s@9q|W z8kIHt?81gn^(_IIDelx_LMB`C>ihYSuEtGuc38Y@j(7kWmn!wt2 zP1JS`PDD|8wb(+f@P{nDvwm=P^<+nMvN8JN+#JSUz-(?P(LPNfw*bl1m>V3INhM2p z6RUl^sT1|+Al`0Kt#}#jJeq3p&9%Qrvumw$UA$PJw7PKb7BM)+@O%_lvcCl31S~!k z0&!F{{9X|W6qnMKo|o1N#CGfS0*kSY7)69=-iehf2_Yq}HU)*0@0r{$mTixm_l3<~ zr>!45k4|Yd&gHUP%&RE}%Q$;=)|JeUTWa5#Zif<-en{xo$Th%|t>|L%&B;a0l0g!c z1wdI_f4q#aesZ#ek?;G8!jRw^ma(%=uv|Gtg{D-BSp3lj`e{ljxks}!l(}t7!6rqK zOf4G3PHk>ZHLThwRjmI{uR1{sSO54by@z?CQM7KJsmqdhqpbJ@ZbMmq`Wi6;0m`PX zRDe*AKtVF&L5`j|8QaKtfu4&hR%Rw>v@99|hl|8JEQa!f41Lu@fO8sDN<$b(5WV4z zRk7&x04Hm7t;a)aEg}R0fq;X!F4QmldQo3=X1q-qI1S&P;)My#n7BvK`t1-E;|1M6 zzOhn4Vg#q2SvN?(o9UUghf)o;e`m%mq(eGc(c23M{dVELoR-)I$ zXtGRu6;+Dl4eVI)3kig<2Ygp6KY&SK#-voDs;27sFnR)_AS(9>1W6b`^9vOn6DT;D;(QX zB-%^sCL>9o!TUq)XmdgU1Zk$HXG|-8sU?O&gS z^?i7uclI<)$%ujJzcK>YV|Zet-lj*nBLVr{Fb40VRNl=0>H^HXeWW5FXkE;~xX$In*D*L{E!fK^-ZDQw>^Ru%xo#&MMGlqv z@1FNDvWzbH&4*5;l6BYhhv3s8@Xq-^WMD;KLAhY>{pE*CzWF}Y*O+p@9b^{9`E+7# zmL1UfyuvJ{a$mOxPE(6&9S$eMH)75EV^AtUq)m{XK`4gB^=*%&Z3FIM8UDB7A}Z7$jUQRxkyutF944D4B&1RWoSRB zI5hyL{g)N2ORjpfG^*n`<$g1FVdYpe30=eR+!2-2&sZPb_vSEGj*A4#T}_bVGj(HS zGnZo55U6n8U42p4*au8C(?8Dhtrr;V4Hl{_c`lAlg=rT-s8|J{B4?FD)qhtCZnj3} z`0CvV_?D*Hutz6)qkLjq=uf#Pv zSO?Y4C7j4@mH5q7_(5tJPn?hHTE+TZ6RPt7x8p+7lNYNrpC8Jl^Et82 zJqsn?nY#`BoRUxE{RSJ71$6&p3x8cb;x8+tw~0BiMEZdz5MW|TCdNa1It>v~^6@DX zWRKOSPbMjITb`dDB#b0$Smw7krg9OE&QCcWqXTE@lseT5Fk+G=$ZoyyU=rlOI5gte zGjd>0>_y!xlV!mJGMB5YHen_A59pqcr~D*EqCk7zzkTKaDdGLv79^@DvI&v(4u&ksOm5M3f2!g>~9)*)iS=aj zX{siCPK+xQ@)hFQY;}A&j2l7Kg@rARzv*1=EgKr^H361K(UVM~s93<*ts9dzdma(d zr|FR*DeIS9=L?nc6N`!qp(P^ViUYAxpeE;0ke$;w8u7Hwf4|FBic=O#4mDKSu9^qS zQ1!1iyAr}AGuh^qeys{VlhM`HW$%wa(w)$1ilvg=zX82@=X$e^=~!gfOaFQIotBK3XcJHzlWi zzF(Z<%fuwd4W#b*t(L`yG+U-F8$iO&3W!vS{80Y%i)n2Wn%ip zM@aGl_uZT*TP(wdY%*^jWyNI4Ko&iw@|Csb%5$3FC`Kc&=G%dcAF>*+_*56Q%D04- zm5D#BVNFtT7QOzQGGqF?ab?jiTBww-!_6f*$1j3oX6S8+n$^JO6of4262@LW&6dD3 zxg8^++fOp9ak|=_k8oSqxU!_f8{;|c;hq+r#V}7EMuI4dMi%1P9-%?&2WMnzad@Ny zlL5Mt37W_fy@?-&04c=2ng>wyzSk#iy2svcs$-qvDKRGnU~_ATfX-u<7CJTz5d~^Y z@3+^+DHEiRF(FGQ(Q;Yxcp<&aO5y>I(jjMdOn=zNFts;5kXFc?nVUAl#cT(v7myGs zY!_4Q&RgDPTFp`rjjC+kvW0M72lHLKKG<*J8GdDY#|CB-QJ_W)ghstSdUABfWG24x zpr;DCENY!PJ{_no9WbprSOiY$jU#8&ergurFnNR)jeNYl`(t^2vdZapOx3pBL(crh zapxF(pDK`+L~?uZ(WB_>!+Xrs+V5yT4$?-Xo;Yb=gv^)AI$uFRFKD_Lyjp+(CKQBO ziWCo7vTQC^C#~(%8C=BMB>cP~^s}P&zF)6os>LZcnLWioX>>MP4u9M8*~rE!(Z@OKY>h{zeXTWGI^bVPR@GBnBB&CXvCI^RK;Y)}aJ@g`E8L`*kWPE* z{2lV)MTudoY)7zbt(8gKL_XWb&XFo~0{@SwcZ?3DX&QE8+qP}nwryj_ww>(Qwr$(C zZ6`ZUPVVPj-#WjhXL_cpSIzXA?&_+mNm5G27|`kTPt8k9q==wgC{XoiJYkJ~D_8^_ zT=+vqSRzD%hvEH(mm@&wfS7;+6=McUM3uu6XHFpi+%h#HP#{vnOStaExg9Py=PdXI zvxwV8{v5;bf8Te$@J}tA3oWn9Rci)~x}um4BJ7B-^wRJroitRDcDt*phuck6W~O)d zh_EqD<=hOm!Ad#1BD8L~XMmPqq+1d>Wo_DMw*Vv>GJT^sG@-B$tY}Yz zceW0$TbHJHx7bkzxo6=2{tvu@0}eeiU?smVCy9@3xZ4kQv*Yi9!D|$t+EXH>upa|q z3>5ke+275m>AF$nymL#C?{v-w9(d8+pXe=jxTS8#G<{#;k8M_9F$HKQ729KqgaAPD zQ8Om54ln4uyhL4kzfC4&t)N6x*keG(U#Y=EIYtr}Xe8d00v*)HOCM4Us2y7(K&W8Zw! z$qk{WaW@J)V zS{UszvQncPnspo%*wneq9nQpOcqL-~KqOjN0x4Y1VN|(`f?8^gW5fS>h_HimwNfA_ zg1?(-GMdLdI_fd|m!1+aE60#9dqWqUHa56UibThnFla_I>dY}!8Sa#*GgZ8fGUfDa zbjdaGNdB^5f8Xf(NY?B7LB&48FYQ;BYr{7Z%pcoW9CzY_DVOCNCY`%rSp97fExL?# zF9v@@NBt#k_|8R=Sbeq>cJ>RYqtr3;_$7pz8-oCx#`+Qp(0FCClfgaMSmVbzvl=cH zr?t0_R5!-U@wA0jUre2lr`?U-yKl3wyf~@w#{4B&1jBuLF}`fro1kU>`e*A+Z1{kM zFP-1bk=?!I!Xv#JR!WILYPGQ7ZUbM9YX#HqL6p+^=+%6~@WtR*?t*@o%A6 z-@jfnJ%X*xK2YYB=~gGKt`qRNA1?!ka_A8<U(&|@1O8!*8ttMjTDlEQi4jEz-^Y(s(9Ft3Y{S5vSgk&xS!@B z4@Xn|mT}_+|F91HVez+5ID{@bnZoN40h#L`2RR@&vL^FubkxG~ZOrufqNYdHI`}xJ zL?!0O1ktV9o@@9)k8;P9HSmqdsoN2^E6;w5$K9Qc!*vaSsPlIXb^5irm*#*U449mq zyw1bD>v%lmlg^+&PJw(`jF#N-F8H_B=f)N~bd<^yle3zz>f+p%6-uKM^gKb{{E{ap zM)Cb{V9d^J3l#B5xY#DD$5E)QxvMA}gd82yq)(?|T0AT`?9*F&!%YSZ%Xh^A6?hL^YH* zjpo&^hto2SJYTkA>cSvQb<9Q2BG$1lTv?j#-7(r2LSs6CdsS=UR8$B3wNi$jX&L4G z8!FKN+Sr^;C>?zD0AgM%+mJMq!Y*(d?+unB4*5PsBmKMt?{8}R_w|Y*s(l)hi_Hz$ z>mA;)tr5+QQJA7e{PrwQcv}RVi68-P22n5F+&A@h$CH7w;hdDLHhZ}IM(h^PXg7i9 z{ZCU9N65l7JEEC`O-^=(>O^m!(kqqucGwwP%bd%BL##HT)`~~!jJ&gJH1=w#rc^z2 zcIj9Nkc_@QnZagM!FCX@Zz6U-LE+?;BmSyccG6|XZ+HoH_}KTNkS3w9w1x!oUI zn}`sD;Aqm(v*N`xu#NkU*hW8z2x25+vj!!eHQBHk!-+Do4lY9~LsBOB?b5#K5A_a7=-p^PCmcbjR2=hv{^MW;`pe ztXghIHOq!gxFx?uXojLM7ddG+)kimW#)zrM9>r+O#LzGx?ws@G^3+XDY{7=st~0#2 z?yr+SSj^WG_9n^yg^Z~?lSkS}z=g7Sj$v_OHDI-xs67JwW7NRm07d8>H7OGvMkVA? zY$Ng$7#FdRQO)~dalZJ_rjmiU3cuOKi@%NXy|{TQ$Es3=B6_&%u?A8daJ&n4^>-Ukvvp$$L`5>xOG}Q8c16N+^$H=@RSIDkh!&T@Fw( zj98Q7REYIwZp$GHcr=+~5R2)A3r@2DMU8LY=g~>zjot5&y(-tO-uoYEO|ECiE?lDr z{#Z*IDN^*^C4Q7iuTRox?=x%9roI%PE`QS1zghjmt1IlTNtnU_O{K{%9L^`*92^A) z$H7_(0tw9EDHd}*-|SZOFPKTv)j|@9NgiB@-SfmVk( zP2Y2v#nqidcKi_y7yyzqK9>x}MdhYvoWrq~cXyqs#MsgFo;DFBgoG!i;ZB|0&<^9J zW|;YViScc!Vqp_<{lnroy2lA{CvH_e&|;c_VFl#F%2D?n=ymt#h;z#aw`rPb7c{u% zCBqeerDZu=KknU2{hyWw`BM)M_s%E^OwE*dQb^0~W9=PzLdnZ?ip&q9-|3vsMK0xu z9?92L?&D|c_g_HWVHQm|;O>9FUXt|Zj-r?jw(pb)LeBOBuOEnf0e`=lODRm=IG%oe zKBbIcc4uG9Xnp;%_}&KJ7Q`>9ll=jvh*&hCFqbr7Wsrk!`6J2BUOB4w<1hV3#jdPt zr2h@B$a25fB2RmV_x*N9k*V64UFn?uncF)-GfXnYpuYPV_}S`PxrZA&jdDf!1dNz8c`DKU#;kA2Jq{=2uIeyLp8@23A3feT zuaDgbYS@|KD$!rxnyo*tmbx2Uvx<9uOg_WL?gAQVyqHFR}%FyI|{vb);E2VjyCN_QB2vM?Mga&yZ`g!2hx?))V6W(c8 z+~}f3ZBvI%+^mYz*DdN(i+7D?lPkP#KWnd7*2Db;Ttj^|98n)Lx9{ zBl`7S48XX;e!BxteMg$}F=LqXflNI7@{Pa4!91Qhn5)LGc5!t0alFGX{6U?xaf2yb{AXt;jEAkYHj#d9O~tZ*T_k8*WKm3lRGbf$n1@gPPh!q( zG;!m8EcoHh+o`Y9Nhve=FKaMsI(w~2G$|e7&f2BKmc=3@P13-6;*A z=^RINaQ=`bQ1c(-@9Z!7al0kY{$|OG+HSJDKa7)saTDwKzTvksbPf2l3V&7>bFo#b zlq($zs?ZgC1}Ohpwc?fhaeu?%%k`SYQpr@@`%W4n$xM`Lr!|T^g+=Al!NTfJuHGq{$@Cx%G|FS<4K>GE5gsIZAnz?SvxoNNt8?zr5#gQnL-U+QMJMwu`Kkl z;#c1P^tcNC-|fE|RmvNnE27H&SNg9~S3&pxZ_ZWV1yRNSYl$g3g(}tZ2!4Z(ND2u_ z`4itImA*3wNd8kSvmnCS*lL2QiDm(XDNy+zIAJV?Aj-vC$*RLkD~$~ z!1-VMNAM$tU($QO_-?n#dXO*UfXT@^QxEkyWim&DZGCvNH2Qk~WU9+=lPFw|QK`0w z7`raGA7m~qFB`FLefYQ@;|eL?GBH8@`V%R+Uijn&`%=qT18~|pqtPr%eD45g!#wND z1RPp>`O%B__$Obd9mq!10L#uf1Z`gkH=2~EV0VxHO^=5yUCd$@g1*Z+7Hs$ViuyzM z@=lvDME)q3ccDfZ)06k^2qsF$)qh$NvP9ayW7TG-lVeQZbZJ#XX2deH%#B3wvMu=o zpeXqgA=f(IsQFVXC!=Eo_+0VNPbZ9G)hTdEOU#UnRqN~(QYU8hsLmg_WM5ex)Q7^B zj}LoS>3GLXCJNeB-{@RX<-$%lbHP&4x_7lrEAqS}NGB>slP*;G>@29hX}~ncusGuz z)GbD6jUnq#0^(h4nejZEdG|x8i=U)xf3>~~ZBwb<#3>byF0e`H7UE$`)6k2J9YbO7 zo;rCzfl_s~TjjwumS%>2^T~kDVW=}OO&={Wjhn>&h3^el8B-cN8bhUB!@8_*o3>bZ zta=LqNnJ#70xdegeF@yqiW~OwM=O-DaoJ~H8ZeKRf_BMfan{CAnXY%gK+63@jh5<@ zu~la01qSC_sur9nh6sT&uq@drDV#4iF{K@Pj-Z+3?x@F{yTG!z!7nP+m2KpkQ37#1 z;aY0Od$;9_Tu}Wx&v`-=Pl+*ifo-|t6x4dl-1+Jye+x;xnpp;`VHJb## zaG~`i%j=BKH}tKQE=D+{1CsR5GwV5KsZx#Nq!w9QcLZETAN*}t_|47l#m(TkFSTdZ zE!N}Bsy3jo!;fIn4qZ{Zoe|LF$Y@-(d;bj$L`1P(bp2WSrp-{A&KVF8QWGscP(zdA^BNIdeOo4{t51Q>(`3?vG zq-Ek{E0IkYjA=GUht?TKJ-GaZ?atR8Rjn@qXwF`{J^pE>AKO^3mn&p**3LfB#f*J& zvp)gEF?U3?NO|`F8kau2)7E(^tus-|hiSI}XA;q*{Tyc_WTmJk=o7<#Tvn&3h9~BS0Vk5)e`5@fwa%8}$@nfWrC?t#DJW z(Ab{wMC!<}?%`>UZ*85n2elW)#CsV?jr=Pd5US9;>7S>$2f+x3k za0q|a>A#QEc0dwOhLH<3|cFXoJ5lF)CpWRSm038XpvtU zS!pYqWlH%oCk|dT77u(%5eSFQM(h_3Q7;!;>&(F~eZ<&b4W_-nYn1cdx#-!LC}Pl% z*{H2#@M2-P1B zPdBH-B{2P@5u&{rUt!xCvRFyU$D=EGw~}&K^^O|IW}nH*TTsF4cN70Dhu#9vy9)dp zIL>}4pI55rRWzt08+>!7enunajeUr(th+W~@hbK13=kBKePr+3HYjxJ?si+Zr8Jov z{YLiUcyK3169AQ1$9PMA^mg~CjPFm(T3Z}DjA6yb->v-|X|r&$AA{LqUAbAa{mBEq z{-oBy?U}^;_0fp14<=U*cJbp>VJHJJ*S^mGTRPB4kgZKp|c!99dA5k5UQ&$W_v~FjRnY;e9hAkD=qmM*9;t)7nB^L}TI;?d_ay zZEnW|Z(``>%9`HI?E7({z?oseQdx$G%X81)v7S4g&|{ygHs&-COUg8JK5-9cuq3FD z-$F+{vxUTLAGePUCr|>BXy0(L%&_boueOR9jfS{};^hSZXq5lh^(N0;)(GfmjW7wY zhzON|8u($e1`GA%ije%9rf?z5%d(+-L_hoIV_K4Fo`ytxEE;NyPhpZzm^!wDFsTB& zX=RgR>2N3`WB;Kkj-6cknLJD#6S+j=p~=XCRf!#>Vs>h-@(RQ>dwMM6s%YJEq&i`& z*k}qps`E|=bN+%?=%R)D|HT5Z++rT=3DSRTRDq!Tn4-G@N+gb>k16jo*;R_~E|2c* z`!q>ms`&ErO|4~Ilvy_^C_^y$80V~SijqK1HN!T+w01S3SdaA0Fw zGRq=qclKYYq*2&eWqz!4FOBw;5WJcEU1nw7E7`FfP&PLrML4+_;}MknO@K&XSuA_O8p2(Hi;-(5-K zn?Y$Kyq}hE6t+M=e=X#5+g!qV7-khVuWW9_zm7_W zGTO1FD-ib8YuC=QCWTeOK|N}5Ud<&#;B<{F6E^S^Gc2y9rAw+ zcL~pJGu&LKpa0-C7SuXPzRRsMpDa}(DgC$v#$xQtC_lwPG(FzShO0jTqaPkK#R+P3Ru0?Ra09M zLQjOfOF;S`N|tjrt+Hmzd5Y&Hj;giID~i#A__drRRX*;dAU$^VPhK9Mwq(4h+@~d^ z)ZdUJH?738p`*3g#a-V>zDKI|@|V|BKkqn?-Id13wT-y_*VOe*1%mI)R*&1#+ebX! zC%-StoR395E~G)7F7NEzUgj8(CV;?=@Qr5*-Fn0(;?lQ$`5oai&q!c--q~EXoT7Er zylm@eidcrZ_FQv#%Y>OP=G!j*S!{LMK4hN9Yh&+c>tcmev6;Kh{cNmafU^3g&AJXG zna_W>9=8ibtBtZe_h0ybwl*jAjH7qI&v1jC?K0VSXc%JnTLx4V%<;!U&K>%E-%xC8&tMTQ{>xYMp!PkuzG#zg}mH&!@#GSK76N( z6}VSbczNvk!~3&<2B8iT(9gDR58_=To%p{X@uxm8oY>|b&3__Fyk)A~tKYfbPpnfXpdgo#@^^c)dwR3BEU%3(bRq379u1`pEhkJ#e$ z{hk5;yc!fedjs2b??^rEjJ;QR;VcqKTYfeyXfkldaDN(NBIfr?UF_|d^5WgyD=+o( z=&4Lh)YXD=ARY|q=6SCEa;~&b?D=%1G(k8U+J3^={n#vYhJ9yD6$U%kfkxX#n0;9> z()A6xwC|mgW+(l8(RSf@G1z(}jrA0DwC^1S=l|lpl|b03hP&zapSdYHrJth7^@ymf z?HQ~jmj81Xa>(=IP3#rQGGzi%Bd^_JuMUlA=9=D50zniGg(8Itb)0Quy3&|DX(%0| zB&=NxoXH{1#W7$7c;t(Rag;_d?pmw`^(QWpugvfM=f!GD{hA{YbQWgHv3=zMd!5-n7nt^4UCqj zFyk-?zjvxwl)v#MS-+&IJ70iMpCFfh2Xz8CrYvt-C8#lt5c9=BF-1eAf?-3)neQ3* z{ax$41r?DQ4F`+&x{qN~SHw1k0xBE|P>>=_coOp(t~!*h8%=g-)`n|_Gz2MxVs3$Z zsK>mgU!V{yjA&A8OtfoNww3^pkzY;Mq(qNk*t+76)UV6 z?Ls}B7WeX55VQ_QqOm0w0c6(Ug%WJYCRmTDeZMkuT&igkw>@n{abxhP->kiTFvg>> zlKS43BSM_$Bw;sbZ5hGv%+^Q1zUoMt*?Fg(^D|kOURqk1NjK(k9;~=)#ywQ(EpL+U zFJ1p%y?C$K-2vx7ROhZ=!d+Z^4)3JK2?%T2_|U>s7i;LOBJdZlo3C1NQSD3sHD~|U zQD&B0SUOn4JWQhfPKofcsBmv)iX7@A)!jJf*i<76+R2IO97p~ycw*y0cIKF+39!a- zdj^l)eWOer93nQP-2rX^(jRlclC-z&cwc_Q<;un5TtQYrDGKHYB2M4vbL!F?1D-h> zHV-@3h;_kVyHLPho``C;zUjoow&N} ztdx*=@Q9>d4?e&Z+bYw41Hy*K8fAR=vr6X^G5P8& zh*zSdQMwX_C#z#PS`d0QT{Cm%#K06CbDD@WyIN-Us4nAgR1xXNcw*WoaKQcxrhcGv z3v7rZM5Ss7hCUIOU!oD*0VI8YSt{J7A`2PdtC8ul<&;*&#ACjzOQ6#)6N3|Jt>f-X zND(BQRLtX12R>5R4D8wkN38-OU@7+6sx;~JI&S1%)_UHAnC2t!h2E~NZ!Xtiz~;!L zG9Ak+VQ+%wHaY?ZPoY4$+@UY~8n?5^#g7*pe^a=TE&TQ&+e5Om9U-$KP&`r)Yd)Wy3jyW-x_~Jcnc~<5 zLbO$r7%{6DGM#7|!5eP-Xbc>6jT*d~OJrX~-1>cT+%`z5Dg{I3GR1F5cA!5LARuS~ zL4knK1S!Q)BMNm*LX>7?0;ZXHX&YCM5Y!mhiDs8WXrmPE8z;WC73qi?wpn5@!ZUM^ ziUBE9u@4IM>meYSFy{jvGgvd+BwZ3%ygUu^JuEY>zX8f=5?8R;o24%)@BSv;V@ju2b_#ub*N5^8A^);vZ2wAqlRv0$cEk!2a8GEyJF+8^yF3RWVu z%5XWV*6w(Mo)oe=pc@{EbB=Tk|KkE|ZP7+&SKgKqtmt9N5g9Px z7A=KKS`ATBPk|I@g>ZzdbkolZkVeXIv#+tJ)pkd z4A6`vMeiFr88zI{C7@LCQ`h{#$hp5sgsCu${5@kER!v2Tf6{Dtgt1uJqJU%goJ;X2 zMcL2{P9`XnAAQv#u^{A`_^Xbi2Vz|rBjh!M&MJnBR^wYe|1`lmHdP%5nR^W&OQ7Ks-&+3wanb)tb40W~BM z=1TsZ-q92}c6?J>Qv#!Lp}62?JZC~V4GJ~`MrlBZ0)qr$a@Xc!#5}EIZVytJ9~7@v zRoXosumt677^pr6h{|7D37Hl{abdGkp&aN(fNn&504N$e5uTz6yDyaqS0lz#3`l1U z3t5PE_7|ctW-&xo(vOCMeO-v zxM50-CMZhRF!8xWkuC$`_kmX>hMD~-xkz5YL-QMQeJC9*9e02Gvr7ELzb>2m^2<=* z|KX>jGf7()>|Jlh(u($Ed1Dy&jzz%dPatUk1+t6~DhyNmMfEo)@XtkTUgb|~iDcv& zk)D(;fD@cH9tkbJ9t3dbf{STFM?Wk=7xTl;hG;e(YzK(ReCsp0-k)~)LVG7e*PL{(;eS!>a%xB` z%ZjcMbqZNraP@xK*E*7dp5wBv1qeACu2}zJ!R+jnH}_T@H{A5pay5tb7bx2NF>Y%K7}*3FOrO`vDUg0n=f{pv9)Cbg`?1 z&8LgC^GtXdW1djsZ?zT=Uehw56o47aLSxy6$8=?SXW2L>pGN=%091u}iqp$6chJ4( zMV{a>Qw2q}9MU?&@HR6N+9Nxjati8#loOr0JX5{zI$%*{%I!>6@H>V3(-y_b3rj zjSekBO(fZ@HrMdqd-{VuZ5!4GUX5-trPwH5S~mGreI8EPa9K10T#1IZ8Zq#>d*q%~ zu#7z|TTn6^qF53A43QLNHQ(U<(?&(^)paxR#C)0FDmqO6neK6yl%EL#7e>-)<3i%(yT& zwne9D8OhKLjX@+}eq4hpG;%B5-TO*Zxn$Z+3wL8q-sR5-K1&9U;TDC7I^Nd7JatioA zWAl|ym)I_@)ZI9LgR(4mHJ;c8Nu*WmK{hLgW&*M-SDeJ^0xXKx<# zEuB|_6i|P@#Ic+uC+j7_w5y=#Q;4Aeb5EaYlh;2HwwmvpF7bvnOQASX{;ebgx;C)b zFdQxbf=Q9x-=@h^3};EV`g76L*=zj2OGsFcEspx*zxz#F}Pk|_NBw+$=zTYTN=NmA~n(HQdAnY-NjN`PlpQXq5QgGQ!}qS^H)2fNoVH8URrkm`h5ktkEk zR0?Y_!#a;HqaY3AbReX%>-z>J-vaGV0YbON6Bfw0JPn&@{i|iDWTm$jMNm0KS!#MX z>DhEd*|H~%8Dh4bIco72q!6;9(Y2V>g>IAUdU{sW->EGhH)>P-G#9h14j#@QSTtkI z6eIw}fqe$ZA0BnF6iuDYH=$Am8YHOUh+}I-O{?|A3Zi&0KThshW5-2P^!S3qDpIvy zXLV7jN}16&mlNftw2d^_ctV2^{D4Ij)zBGE9 zyH8F;GA&iyyQKKnmbX6)x3&l=g#>3{1PxwDa7jFor_*1^AD^vPyB7BJR7tW%kU`7_ zSUIb0GS3XcI-vC|*zAhr94%dIcn@js&3RcT$nc5D^s|GY95c0tiugX^zh|MYa9O%T$wnYlj2~jeRPIOYQ zIrVCSjL-?1YD6|BPFzVYL)hT!yO+hjS8R9&&fTAAu9*z2ijAin*}Aq%yLf{GPa}d6 zfn_3v&4o%K0=gh^=<3GAdX+%e+vZ-jQ6Qj{Z9biz78HQgte(_x#1iv{fA>MKH+d5s zBF6y~UHGjU!IizBBhQoNJ@n^p#!(|_-id;<$gryM{618lh&A0%#cgMaxi#i zvAC_bbD)Prqg8K+Iu+u!vWe3*40sc&Uxa0EB$Eg;#i=L|rCHT+i$){znT0gx=$;kS zi^kF6nz;6l%7_9-t^+096C|KfTSoZ{Q6`|05^b@bj*>-?eX7*7E^`6f-RkL}5wi*f zI^Ur|_Z*RZQ8a^1O>aNp@k|7C)3zZGPQ~aP4J<>JC?Qmq)jH$DAYHoVAqy%IP7lARae3v%y!a&{@$U9oQu8xd#uR4;EEyg(y|4 z1&P87KQFOdGMEZifsrtA``DzxD#w3T@$E>N%aaQ)0HyjeN;w)Q#zd>o5TP%lSmrP8 zj1k+Ve_s3TcP~PBc{DdPECl@hD6C@;d0~NSht$D4Zo>C?Z}<3-Fx5XSdVotd@Nrp($9hNsM?AH?Cq*Y~>R5Yr zF~az2+ViM_4V!LFqvscwDj(B;A(O9GNr@XxK`1#K_R2RzklvL$p3G34W2fcSgj4(G zM=9p5qfJjVIVOPu&F$x=N`PUg1ch{S-FM#HXfH9n{6c_wZ?phkUt1rVG4w$boomDc zE$G@7P9#CYJyU*fssrxDvBK!Dn{#^gfW=OC!_w4_dMpg8N~L1ODwdf%QyTjEv+mWn z*H*(U_&C|sZZAQQ5aF{6XhaBcQ$#XBWGmf3Gf6tG%DT*Y6JaH;>g>$_G}$%1D5Cl# zBmQeo5gC!>N-5Q4)fUy3NxJa{66FFBC7n715D25)0Fd~P9Cqg0Zccbe1WBYKhzu>8 z)0fap@Y9@+-CwZh?qlu`e|0un)&UH(Fj7Bi-m5b8#x!YwOBFI+*YDH z83!^4 zP+AWux#Gl}_$*mrCg%aOKm=xF;X#zKYO!e1u3xz>Omu$6S8Tm`1fs?K%UL2>*Fl>2 zdLMom9UO$!?Q$Q8)PmdJ#da7I&GZ8Mw_!wEJZa2Dj*R07BoZC7OQ9W&b@H z(ivTr&B(l#aJPnOVHZYXUl4VQ8(<-|I%?Z~U0SYL%GFbb{u4wm}Vp>mKQ?j{Yk-e&kI{s79}2 zdQqr2l4d^8DB;>2d)wrlTDxj;_M@ezDutzlEu;4fn{BB)NLbg@TNw=>`S8epj^orO zUHoCCRgj7>MD}=q;{TwSxCWIVHJ<8qOSfDmoQT6eILcL-%UvKa5^Fps%^w%l*|Hu> zuar|(-0I794N9XFB0npW&@pv435HH}OEJL@3ls1aW0ZJi@?al?gO zAz7A=p*m1vNrqaWp5CkOSrQu zzlrY`C&f9v>IP*3B*KQ)_FbErwrzi$1NkY9xign_D6U{*; zAYS)YdRN!e@+D!7u95v7{$ejwSCzYPQ`og(HEKB(bw^1hI5$pG`xTv^zNtf8>N8Vw z*z}ZpB2kQ%Y3Jt3!dZ2uVSFCeyEjsec_Nu$loJtR*+6{kU3yAVs(({@jfq%=g`yf* zZwg#JaCn`yk*ddA|G0W1SQ}QM7JY0s)sWg(CUTGiNSU0Fw)h>K?x9EE?w|BsJsw$CEVX3o;Ky`5#$6b*lRhG5zAljSVb@OW1ie zb;*XIKxs|EzjVJ*_K&|=TW@9_{xCu2mz+yKG`nAmcuWP5uuv=0eg-B_Xt^+Uaq7_Q zcN0W@l)ZgUuwOV_i)oq4GGq!uHlKqZ(K{Jt;q)JUhJ*~5+AQT6R00Tcp% z=N2#$iJ`P)!iciY#XGoC~=AL!c4ft*l>*>S0I9n zqhx5lxUg9q=P5F!k+-@`#3+KM9%!f^36Wm9kU6^qEpE70yA4oos>#hohKFG&-*#Zz z;fX`jG|W6-nfN>sjzT4fc%~a>M#-%?IbT~-6t_QvCqq%uR)NRPN%D&!OJL0wFj3E$ zXj8hzQ)RM5m_)V43qZDp$iUmtP$8>q_T@&x7dWQgD|tvL_IVT`y=c?DP}URcK_$P7Du5FpQ}KxNk5>6Unlp6T&SOPrFAoY@&*Grw7JBl)vv2TdK(=h+a!H@iv!>!`e^&6|2WR(cOq48NZg&6|%h| z2JT#sb$N}M3G9$G5!K_!?deA%MsDefpcx07)ih+)2eC==V2US8{*?ofG!14dSxoZp$}2oF;XuS}hhGs4d|AOTys z^Kg^z`L}ymw}!Qs%*VGs$~~Tjf2uyR)CGDejxIw#t_?uD)e0Ts0j>2l^2td}DI8f9 zEf{X;CBQW_J0QPYaTq@$^o$}&k{ee=>kFUe8jIc`r^jtOwdBZX{p>tcT@!ZX8*b}?sO&{@8UDxR`KPlMHkR=izH#*?8b}{b zrMbB|*U6QGd2Tp;mwQybM=j)dMgQ(*bh3-NVX**Ahc(ROn%_G}?u+E$+U>3OhiAOv zg?R&_hyKDr75?tR&pV=Hsxw&Z8{E$ck1a?`vA=P zu@y5N)<+Xa7wQu&0Y6!JziH8BEta*ZZ(xst`BD-uDXvZ+0O(iR+CDTx!9gDZ`>HgA z%<8%6ubh}hRD&ntv7UXmi~nJc-V@Kyb#hI?inR4N5tr{I3Pos+K2llxi)0(Nnr z#8iHb<9m8n#4=Pw@5?%xH=|@eVW7aD!D*yG-ITUCwobnjxgiBt#i+$d6?Y&*rl^vjXo}77MHJOj3B=?n z5<^(2P*D7hrlF2=;rR34qn~673F(mnHkDo^|1f=|Ciq$=&Yv?@&ToM<=xI z^>Swr=E?ES8GJOyQ88=7;N$>-oi45s21U;9*Jge8#2KeKUN<5C=BO@^ z)zzFK-X;OgnF+WK@C!=mslq9`27w#t>qo`{7XR#r4yg)k9gUD{Zz(A-5qxOsOq!~< z$B9dSs0wV|B^ES86EDA@ETP}oecO$>C9~_UF3s^XM+H_{Gh~^OyxCNf3X8JJdh{~D z0BzxZ7be~a8EfSQ<4%2Fj0B}*l)yB_=K zZImiuDp+fA{CU!x@wud6<-+Wiijj&egp9pA*~G7J!6YH3Hfgj{p~4RQhXF2+cM`Ii zL7C8Cp<*Qw5}&%WPkyUwzKt!cv_@AeHV38Rj9d6~)#{Ny9PW9Z+vZ~$(98LAiK!U- zPubb~InL5~>}-iiN-sCrcv56U9kV;do}hewbHbA2qjzpeB}`g_jO)9X+0it>;E&tU zN}4nU?>iSRt}KiCnIhyyRzk{jyLMwaYXLQTTl=vwCnXWq_1p(-2He{DJRRf1m!HXf z>vFhbi!#$4PVWyabh+EEsfA$-ygQIsk`$;FY{mp|5SHNV+a z5b0;cD1(F*7p2FAXpd7_G*)HGwR1H@y~kGL>KnbESI+Qr7o$FHp3>$#)F_Ah1Hx?Y zMzk=PEE?0iYD?&<`-f3hvpFIqn{O?(RX*WTFnv?t4L|)?RB4$Dd?u^iqde?DWsI9@d_MaP-n$-0P(@^($<3 z65I2`LO>!8PIz7sn!6tg5F@#0ESg-mbJD*^rHVD7qKgPQvUO(=%P(X!veNXNjkRt% z(gY&Bf&9+}S%{256!fT~g3PK95vi!yyw-C6b?#y&MS5*~pWLDF2u^d%*Z}qN+6Bcd zO{4E_Xqz`S2omDpp!|XMSa~QX#;5FKXFvAY6)1{9ze)NOpskGwASk0hLE*QIx@S@B zccI&#$HUpo=FbAO+u~a17g&2Qy*q?jZq6Lhh5%B0I(^WuYB%_xm&>sHmA{A z^xA*|`XDZ)9KLr5vrDBCIv>`)Eqmr-G{ygxq@7dniViVD7NKvMQK;9z-Ymet!Sl;- zV7ggSf7zPzA|WTnk$AOSeR85csH)F&HW}H6kSGL_7QUdj16X#BD?Kw7B@NB!soOFM zH{TmcuW0lBnGwYZp$l9S6%`bcwFnbh5tdTr&5&oHs&<+SUWv({rjpj6X5y&2%`IKU zDg>xRc>f%oMr3)?#f%w@Yi|oCh>T}mZ*|0t{SUyfsHRoYnL+Gk>QK?cGjUj)RShLd z6oy5bn&qB6Y2U$l4tjx$}=x37+`VFXx^DEIh5rp85O^8Z^L_V3LKkOa6 zJk$HjNf3sW++yE_vzuC%7WK0;iZ7r55ndSkgk)vLbey0bw z1;L)FkO9}mOiBMAP45_3N!NAl#7ZlVHaoUD+OgHKZTsZ@p7YNC zRrRA*)fzSHnqwePbWa?0+7K+Jk5?WuPNBeC!Hz&w+B)DofStbI=0d2q%cpMex-J*os6v~)@V!NF6!NS+*Q{9O{NYJv58Ab#LO$@UX_J?_6} zNx8Cohz}ANx*4ZcjArGP^aRpM*R>fq)SI7XR2U0jUvzYo)HKvW{l5zRSY+`iTSSe2 zL=R=bBQxvi2P)4;PNtJ}H^>+(79W3Sl-=Q#OrU{L2#AvuMuGY{+%Wm2$HHA9h4) zry*s|y zzhByVc#@~&__;5q&V*;hNlLZzwvQHSPj#$EU3@o;vV5%Vx(9Xf4xi?^0>)=yY&jwk zM7bq66Q~T5DU~g|)h|Gx&3AjD$$3Sa)%O6P?=_<&Hk^_PtCvn{W z^kt$nL?nOf7Kxy!m#auu>svbR`z`swj`_siENJygI^8>z9_V5{gmG(C^_wh_QLaCS zeIb87{3UY?z=Gru)xow1o4$E7swyazj?-01xH`SH@9el=Lc`1bKsq{ARhJ6Y{yKB6 zRXcW=d1e5&I`i(K8=Uk&CLVdHPWeXf?Tkt$utghp``v4?J2ym8(SoRe=UGlJ4j#cz zl)vxE!}w2r@#-Sy>{T&)DtEqMeZ5|i&}Y?OJZ%qZ0{XNJ-=GLzWdo(+%ltW$+2QTWf@jmSn6acNeh=+N1%nKZCxv0uHGa5 zoc?CdD3`!=lY0CX zFzNaWS(tzC48hJ+=zPxVasG;@jd;KHe#G}Lvb%`EW-c`n2+WVR#Di=|p92j;GXbB1*r|!n zt(Zm|Gh(Z3(|1l#7==OsVdH#0Z{?<4MM4i<%0-s%U;6#-O_5_;cKr#MEYf-*sUzNJ zyoMP(Z`Vxmh|O$4Dmu*O+56r!)Bc5s4?_3t zl^KR>iWeuq=TBVnO6I!FZQvcE06z$tQ9tf1J6I;6*s1SuGXXkrx8P_ zpahBK0rQoZcP*ZI%{Hmc=!pl>R`ct=$=80Wq4}{<316IEtyy_9YA=X1eSmOlrQ;x(eX*;Ta$a z=2$YRtzr&tvkea^l=ob?DyiRLNd+4I9^)Xt`r|39XlQU@d8+=}v$M=-C?qk;y81;T zTZ(ITeT%?|#qp@>s{a0DfYtc0jF#S@3Vt1nIGukl@1LJ39gMYl8ZWCC-HN|#-+@QIi z|G2Ph~CvBaDqJ-u&)HMc1PslYp8=V75a{#X|hY46d0C>_&hoWdjfJ zR;YJCi1}&Gr#Nu)Qnw@aY-OhJujNhA_zX6gJ^i;%8qelm7gaKR$+38px6jc=35uJy zw!$twB=SMnV=#FAb=TOgWUciilZkXc<9BV>^upB0D>MwZozpg^F%5{amcHg27G=4o8$};qKJJ$>8!}?#dY1J0q|i?~D8&Ue)b_FMZLsBGf%dgA zvJ>$T#(;DdS`4T3yw3wlh6m^h>x;bua>?QyR7++A7xeG~k}`CPmUnORx1Zu==ni_| z7LV*$lOhdL_%BIEO+0DxoQM^Ojsg6GG2>=yW^Z+JOms_*wL=yWXgFEqyLamz-Rl-q z=zbYRRvHNWPOG22IIz=jY)(DX=~8mq8zCFTQZk!^S3Qx*5lLC|ZcJB2;2O!WE^`tJ zIMJ|=M;p%$TH@0>Ppurq7n4` zU74Y91p#efUMa5FS6;Bo>Np5``nMLIc#$42&|t)D(<$eBC^lTx!nPv?AsHmHRq6GCjY;qiv6 zh9BM!>sZYmPg_|U%W$Gs^n8!jQwcy?9h*Ikn!y#PTk|QekHYD~emOqmaI_CuZAxuq zdNScN=r8zm)RhXm)*-C~V@I2P&{%J!md5D`EKw)T@^rh?47ybXcj%_F_vEM@#uK+g z{&>(;cdJ_OVFzAQJns=j(uuo=^^Un%E!Jj1370_ihX^)Cek0f`Dpb|2olh=YJ534Vt2cS&vDXVjzluO6LK)>8Xuo$tt{S^xt^CBNQ1I3@+>n*h0~eXXN5po z%Z%RXmC?Eq+0lWJH5;y=63?K^e}jWN6y9%LR!~CVrz(mbwVmZcE*M((;i%P#X@N+ic`EE6KLfNy$2eoM zHR1wjL{5O}T)ei4I7dZ%-Yj2^ zrM#Mb9NR7KVMVB*i_F$qx2LDq+ZmlNLVZr9Kal__Au=Yt4}Cl2rxt=GXw39LcQA-b zPI@SqJ)mY3+wqN6!!>G-2>%98^M-snufu_CL4f*BdB)dDT`6aznmsRWkr|H$Q=vpO z1$oksk07PF0+n$_*Ud7fF_;21wt{nM;+bt-QYkR7aAg8MqpaZ@r@=OH$N8cTmDFn4+Cb@-MnBtxk`2Lw$RTe0 zPa`8}>`W6CR1GVtypvU-JGm%K;Ib=0Y$2e25nL(SDp&Oz1KUAN>oLyoL3jPA5Of(S z`3(!(rRJ*$7hv!ZgCzaFZs2raB~pRF7t~+2A-9V9BX8VyDR{C`NrTHRIIs9zJM)Xl zIUHt{*etp&Z>74z^DA-|I+Ou3YN9E_QPYisYiZ5wUN|R}08_0BR)Jx+OYD@Tplxm$ zwF4Kt*eh%0Om}P0t1!EDyf}2lbP+#bTc~(tD_|{weiM5r-j)& zL}(35{4n4}w;Bbm3@VCjRymDf{v^u?2Fmnul93$A+V?B)DV~gq@zfMvw*VrGKg{aR z@AIZCsrp6MMU!|}@9Q(`p7{8niL#%1OGt?(W3yFH$*Nw>>lHKiqT)!q1PjE&J@=tq zqLzuC0UC0_2ehOfrh8tro-RtWb86^}_)h6625jc3S!lZgyLafuDUX~1Ez+iP^(q&yyRdyXCVS=u!BC%qt;;_;Yr4@w zxQRy88QX1`*duEhnM!GzJO?hV&3x+o%cI|=4|one;bJ`939tcg46zd z(OrEGfI$s~VT`tSEcC!M(t{RqFxgIe#%4CJpH~g;qRrOUx%sP_yKVs{uJ~Bz>Txcs z&~}D4cHz00&~$V5%|?T#orGC9g*p(%qhXfF?0s+_QpNwKq0c6fV@G(tW{p@^H|@+g z8gZr?)6f-;VOgBWY+eT9{Q6e14{p!y)R;aq2Rf>=i^w_|?=08?(4CI!wG>0C9_vES zg2bUeC(IE;&cU-?Dy>n9s;9>&Dt~#BbNg^Rz^gU3OgwLOkMe;cSLw3lo;GsdOD>p# z1!(#YVjdX9>AP=Q96Bknu{Ae7R^*$b6@M5Os`M2HPubpM(%mO0Xkr1x-{VmM-kO}S z?b&USRW=LzWFGv;U28{i63oiBXfxqEQfK2C?1|}pPvN&lZLEkDax1+X!DsheKWgqU zSV@xWsPm?yLiXw0istqGy<)W~AiZIu=DYZghVvI)XUxlV7_Yfw>(vLR*E^k1I!yP) z#A?NoJ?_;ud_tDL^26KX>HvU_Q8*CRL=oa7q4vSo=gal_KSaX5b~%qpcnG?LCHsQm z3>sy$Ocnij1XkBtSJwj(8p$EhR=vT)Vz$Y}#Iz4TU~ageC$}Hy?P*-@EvR{1|D-;O z;SFYxnzoABUkspA(CYviatR3hBOv$*e6c2hL2n&;TO% zDg$7R{)Z0kAor+sxG~FgwfbCqESgfu=pXVbn8N+TN6qBOQ`6H*UfOwF=YNqlO%WlX zoZADEdd>7`2q|bCSQgM2)iw&XE12g zW9~zIHJEFVIfDdEvRkTXVpF>Lk5i(NY-(ZS{+KUqc+RqvOHW4A)+p1Wuwvh2N+Yx{ zGa$132S~DG4CZ&Pg-1$B?2-X>NEnl1I zoYU)XNF`hUGU$zOU&AJHV*XRlHkLLSCo7OGNpSa(CqfRbKZ}k-U_}o{aaA{Unk|?$ zPe4aq!Z;vh%B2oZl#HlB)5o=PvA>F=REU7`RpXIhf`$@HEle#d_mHHSUCUn&+%OE9 zqEIoc>d%9iKAO9h5*rO-p#KKglS`DIK+8c=;6N8Q%n}X3u?X=*JkqL|b`2~{-r>^5 z#cd6+B4gU?XBWL;v{WLcU#a%)-lAXEnQb!c`G03?NJA8fYyR!riz6`S!5GMEAh&+N zs93-eD(UEspC{W%8SUKHl7(c|5&{=sv_8aM!EMR?3&Nun4hE9nT;PsFC(f)pH_x7Rl4KN%B5Ws#Y?CX3|~(%E`JO z;-HexU2+2oB3nQi?_6*;!Wv%CWUzu%#Cf80$@iyD5|g2|Rc(V#5UOq{Dx!17KG9dc z?+^}2vxu=tH1d=ZTW`GIZ%@Q!4iS$!Y1R^6zo`k%AjQfEZa@Vt^iK%4%Tk1;a=z@wVOu*vZLVG=kFI z(hN}wbKIU0(UD2jta8v9>c94=#H98_$`&5r@Gt0rxMDm>hICqo{wJlOU zYj@AyM(~~WT-2C4cdg2Y_`|GPb|ya@Zm1hd9+m?_h%4$zEg}-PYZfD8cl{-j7tyzK zr9meiqrsLis6Se*te>u2L=%J~Xy{k%LWm+Gsb!<|xjdU787MLFyS48%8(+bmhM|C0 zyb~h(jjAVMF+aI1XflJ2dies~0-mdpKJxpkR*@>KwFj83Mrt)#(iCuQ4ce0k@OxJ& z5iODh2Z6iUmOT+nhl6gx8iFH;4jY$xYu;!vi0Y_A)1|fQ6;&TR&^SBg0i@oLTsHI_X}T!d=sz(Px5`W3YuBcd@;t99U@H9exXDDqqZxA-aOMH$tq~&_)E2f*WEf z4@J${Elt)X4EQ`aMl`~5&6~4iyw@#hpi)6fC11q|@135K>56)KC*MbHohJlA{Dm#Ct-!DqQ^wayr*$vu6W z%Of&O9286kiDmS1A6Mi%Jk0a@z5vYAaOe3MyDzNj>^%obt2(~G{Tr?rBza!Q+N-gi;MXHhJjXr#LHB1%sL727kLOf5OA ze;T5nPv|mx|4r>nz_t|Kb?75zS8|xFcZ~fBh_T}*K~YIIVG3DEBZ<89AJ|F~&W%CE zw5#XRE$4^&r{ewR>Q92H6_=HfUD4D&b-imAakm$`(kHk#zx2GEeW;S^{G9MwyCsvM zZlE)&gzt%o|HVhyiJ*TdCm#_1%}s<;6Vt7&F*|XPK<$QQIUM~6Z^s*QbI>J|FHYrL zbKw0w_h8zJ!ugFgMdL=^0J$!^V*)x@B$QKOW?9T7E5~(pdi|lZl@bGFvfb^d&pbF* z*A`I^g36JV7vD<%#esHZ1 z`6G~moXav@`(Y0o@;(XPJMyfe#`bV~w2T%JGogWF)?`t&I`Qe9Wfq%5Wyv*G4J`z{ zc_k8$+w>txJIm7A9LbC9!Q1y2fXrTTdyURip|Z3C+x}CBEK1G3_$oHjU43C@b9uVJ zlG>s{nnWe2=n!P%QM02pZb#alao3Bv;W;DcM>0iAY@pBzbse^8MG8p%4*>H3T`epWmeiL1J+i|7F~{kxJO;LV<6dcNE~ zQ;_O&Gb&<@5~2YktqoZeEgc02RZwI9^sH$(Oj$H%7iOp1)ltKV4$~0ZQ&y+tLk!U_ zVMCdDXYbQgw%ii~%RG{QyB9lP5;VP_E|=o2on)zSb+ohA`kNmdgF@HtDY?jcq9LT2 zHZLmY5e{^EC+VSQ4NACo^@l$8%I!FR=Vs=Qt+5@L{m!MeQ`P zZS4~^JU5P7hOSXutwtTqF%BQ?wGlI8owZ_3KJ`2ac;0d!Ox?fG_GUv|^$7K( z!oCf3eLUID)e#;HE%%Pm*R-=IwucxKl?L2%E+1}@55hHmaunADXCM3io+rdpT-RAv zFBmJGm99egyidzEdSam(1*(R+%Zkg(Nso!8maCy^KmQWp3D)Bu>HT_@Be3CewS7B^ zexr-xV!neSUf-04SY)Eo3iEk;)^ZPrC8HHbImJ>1G)EW31w6){-``k5x(^VVuRmE39)t#4k zZeW4Ju0sq21Ucsw|7LiY(N!=#{OyLTZ@QU<5kNk?I^-Rp_u)zUWLdfQnHRjS$(f(| zEWr6yO5PxEnsTlBB!B-ts>>575yMdze}Y1(0d3PRrIfntCykCzP~nh&Ce8+}WWRi} zNz&0GtnNfg`fXhfRF!kPYRvXM;6{{W*uK3O}H!NRCC=w_<3&|@Ei_- z_Vd~@Q~p&)zV7_~psVMHK(Es#pCRJ)trye`=*cl%?oRLS-vf=7;EenO5y1Hn@65Ot z)MdhpU`%;+wumg{XfYcQ8E-2xN<}NhY~dAH{TnuV1HT9P(>eS+HHFbKy<9Zsm4qvDQ zV&88_|GP5g=cy61yh2Y z=4G@!hP<^$c5bJ#=LNb*U)Pm5slWzjYMoT>6dXfSOl&tlph%IB(;y4a>&Zz=FPxd~ z8x_wNnWxK}`$ac0?J`_jOz_xXKjy?>NoqIICj%F5Nt68-#S z!4Fi@abx*zr?}2-156e!h~5grMG{eoqq0~Bo8&LEhD2p_Xs04g<-uU+AaxRDLL}II zl;P24UpT-_Awy3=4L{~QKQw5E99$?nH1egujXdEq`hz?dC_kaVux~kuOk0E=ToheOw(A56~M+wH*X;pScn8Kq3v z(JEZHw^vVx19H+15g={9Q{eUC;?^AN;MdNr8ue4o7*(Z10@k%;Ulfk^C!d zKlR9eqorf!pFx{_{xg4gAWUKvY|&7NPOnraCMqp1Rl^}whHTQ(aX}lFZ^CcWc|$9g zi_|@-9Z$bpeVtlvJXuH+XvNvBg;$Pu$yx6Q zTyq_@-ic#A$4FSYtE|5A8vSSq?U58(-ufBbzm_GB`KW~T9KFg~IN@vQ{pH%2KGX2W z=sz}k3+y(gd}K7`$&L(!Q#}Y&1l~4=C}%U=g?g#65>3vRoC&_Xh4Tg)JI@&@8w^so zM3vO~0mc@S^1w5;dqF0QT-4JdGVU9KfP?xE@&4wdF?vAA>5%j-+&5%>F4^n20@CU< z8K;sGR#8-<()p?3f{2f+>niyMcB7fD~zw zo&QI4_mN*i;;7&n!(ZJh3^P|$IQ-dRIpi9MOTK4o=LW`{fWXHESg%?MC!7CF7(M$E z^1XT?TuveM`8?g!;irZNKug*agzR&r;S^+l_Zcso(jG0cuV`$;+fa>OU@QF?a{cZ1@dhGg3 zn85YPuQ?I5yr{lA_0W^gl1GO7575;(g*$&^y||#@Mnk+ow}$JBhF$`rL|g_+L$3dY z@7FJqaA_!56%-Us<_9Kvnn=-liXvOW3K4M6BQyTHZn1lIbrnXK;}}5yywKjRFDRK7 zaR{0PDAHWOy-LrAE`0MUu4KR`)fJTH=AWJsbNDC{s5giDYAPC#?KDN@biN81w9-%zGI9B9 z)&rbl<@p%#7MLDu;O@MjB2MBcknUcz!HUB1bPiaKbvPg?4VC%H=IR%g6l( z!#?kI4?;fjTFwnFZa{g)92f*mt|tc?9KcBgi2ps{_emuaqgB@5HDwc z@L*fhrYvg*+sMo)DUE7vIIM(bGzC}j;}#+*0Yc<4wCqa;4_Q#k029aQ42Ke%g6$5x z)CnR3(cX8B4p~9zoz_2qQPJfH;M0l!v?EkpQbH8)fFxiT84s_>`tb-|J%m=Rr$6)L z(V^?m6ltfIcXiX3;6ad14n&(h zBW7ju3_^E{2VONywUDmA5g#-=VjGUPe7;X`1RS|AS&0o&`;V2SiA5`J)Oij(YRT-A6g*3|pC2*%j75fdtohic?B)>w}$ISD#rL)x?+; z;2hOWqH8Z=RBSmVV%*Arae+{fO+FAzaqRxgpQZtEV^E07{^^A$#X7ORPG>^bYT-|W z!>D=MfyBzapkNf7ve>S%bjQhX$lLL_%A+1XTD;Vb7oIel#iEyGbAi9pm!HMdIwne@ zXn58C9Tqa3AM0Kr4Zt*ag=~0~WH9(Zcv>)FOoItq2F3P3RA@rhDAJ2j?qU~lc5$jI z9o0}$SOf8&C#aAPcc$^U3$PWGWnxrgaQq6z@3tZC$#q=kXx4U9v<>kSAAo}(=;P%feYD6VLbtlBnJ}+)SPcX?h z6S_aG(J)NcBk{+}*>gV5KW?HT-Mi0fV3OtOQ72c@P(+xgx}zp{Yr9AO*jJC%R+mgm zC@&XdI_>&)h*|Y!z}frz;9%F&ja1c{^;tSVfQMq!@LNYO(Dd6eFWOv|$_RpjtxebF zLZI(DkcoE?vf+e(ClON14q4%CUOh^NY)6LbHq-GB;mOtKq#zK(^jJYSdlo?wNC}GP)9oAxFn66GssV11z@y)u1MW<%QTVm`LQy zRBazP*I|vokB68^Y0VJx0E0pEkrAFtQHjD-v-~mON0mH|*;z{AxX^pYcd6@`_^XzI zd}~*B<*;SGBALrvb>p(kqBtdU|BXQCM}$$XJebn;Zom^q&rOa=&)Yg#Q1(U%TJr;g zh}MsYvA2rkaSIG_cV0p;uQC1j`|!k1%ii;qt3o0X3|5%@`4gHm2#B%dMZke8ZVpX; zk^GO&sC`SL@MB67J)_I*Qq%_+)soK!xJp@x(jcUb$6Hxk3IQk;VNnU%)cD1in0-qD zG$>S>ivlGlT%mj{jd+L<1-Dm&b>Sz9fs1YrsTaiA^)kE9!!8uaVn!iW3k`{ssAPr(Icd9jUumZIxUZ~`6! z_(h+bQ+-&0Umth$`?Ad|-5>mKVZrY3T) zi|piY4C>>3+sS4j$R|PQ=WLwAg_iu!XE%Ruf}jY!s>RiF zX@hCk@1YCkw?>H11F0@A|A@N`D4(8>wC^O|y#5ge{?`*BWoh$>OG`)pp^6o73(Rke zRriF#-vVzBSGI~$P`eC2uW7kjGUUD357u7^2REce9QJNbrxHU3-oPp2yPUm&degH%Yo{?-- zNfRifcybQF7xoBwfvN~7TX`b!J*1!yd46urtyvNi;P}Fu0Zt^n`Me6%ap|ySfnl54 zVeY2XG2V~c|F`xX#M*q3Z*(1yW)I0MYD+h@$(jkMaYuJ9Ye%Y;5;iW$+E=kJ_*eCU zb7OvcQFAG*p?wTd@#pJ%zL)@AZrv-(<0bOgB2eun*}&!Nk*_w)1a^ zX}EC+I#K7$VYG7!y$<-XFPYQkBC>o=vA>vu0+vU&e%*+9ApFyPF>7;hEYA1j@B#KiCq(C+kVx)Rm)51ADr`SQP|y@f{FTJ$y%Jg_oUuZa9`6QwWkA?Oq*kpU~f@I!Ohq{aJ} zw%bCpXMV^`~5{mpdqd!4XUE2^8mAM3kr&n2@CMthK)t*a7QbmX4 zMabwEhO=;TgDnn*OaJ1H(_IFtRTU?BMo|x>JS;UGtSGCs2>+0JThZzj70fWEG=(^| zsorw-_-&Tm%c~^Kxnq4^TGK8p=1SP;GLTP?mtUFiuf_899oD=t;YT!uf*@Y!<9sE( ziLPGh_k%zE-4&Qv@VYAUr3t1bGBGv%?cU-X*Ps>%rmBHB)dKp8pD3<{w%$gt9&Yby z%HBG=xhy63ZBeB!%v`>|E8==X(mFLwGNhVlF9I?fLUOqz>@fW2C03Dec!9TF6_cZx zV`V~y;0%ni2)psPMCISePh}H#Qs@VRCWLPX!D*$9Q-%uh*pStbs^+NFey|q#(3M4y zJ5R2|RKv#ynDlToCJR=rr=7cf+A!1PrOB0b!!aWCGczk0jP+s!1NWF{mKB|0Cq&jx zu=XI|aRs&H(bDC106ul2&R4v!lp5-nK9rN7qOKF^nQc+;tRw@L1!FRWa&>7(X;f`2 z!s|G-wwj5L*>au^2}NG#(jYX0;71as)*1*nc^J;7roY>!j2H5#C)Sh2{kfgxLcEn&ywvlTjX4E0f?GaF0>S+S+ zvja|GjZSko2chNmE9!L^5&Kj(WOs-WyRx%B;_?F;#}+gG&L*e|pGk#Bgg2M0iUx?G zvQKeV4};nXuF|ApWFR?OEFC5){tFDQ#68AQ39*o$CXX}3f1(}!lS<+s?1w<}q989G z0}zzWQVV%wAlMyTIX^uXy@z{LRu`f>4l55n%rW#K1%5)RanRLsVo4Y8w5r@imlbbp zfqmIDCw3s&Q`{W=MA!=)Tdezgze-?w!y7%3m`aIcxM-o8joRQFY}^Wn1YN^>sX%^N zMOOUd+_~Z0=soUF5Z5Jb~YagZY2#eY=lnwnF zsa8icm&JJ}5Z~fWb?BljRknQ0@VplP%6ilo8201KJm}F-NDAtMow>WeU79Z~`r~J# z4^9>N@2QSR_FFiEH#?j;CD&6cq5ZwzBx;x6JO4u(|CUf+zR|Snwbj13vbaDSe>gm~ zilvZ6*GHZ8olb=srsBr{_tFUdb@z5by+R!Is&IDQO-x<$p5kX_Mx6iO00AVs2oc*X zq9dixC#hrH31#LG?I?XJXcC-0Z8<&PAX}4&`LCC-pA7Ek0?%My;`NQP7=gGv?g$vuq`bpz3)ph}H72IaN@uraQrKh?bMr@7uqe5;wF>%ia z4`u|fk7ix>h(a6WmX-jpG%$@PrUCtg_@dOO*W<(c~8U@VK%-H{Pi}Q=3P80W2O-+KP4Mun7?W&ZpCS;johdVbeXm8 zr#ZF8;U4Q_+bZ3%8e}|>)~>R~6fa!2{Jj86qOM=zQ-ENLDv_en7I(~)^GlJ11eXzq zag70J0ja^1PeWI!>k_uOLfE9KH%n=$qZ9_4BEWt?==~EZJJ@Hi7-5K63nzu7S=qoV z+Ub3ih4GY(e4klFqV3KYpJ*yngZ2?>SSW1+2%e>@|CNIh2Mzi&Oa(yLI3 z#n%I~bt1OCGI;Dg=9t3GjkRWZckD!{#@HCX_=K=}gJTubvxDV}&`*pJIbL+Az(h84 zgZ33=lNVtJn74^>@<-69T~9G?4*HNFuWks%mSLdsw+aW;n<0sfYF1d4tiSUr0txx9InEP$pVcI29sdn{wkS&RU^_08g zTHG4!^GMH}r;m@XDDO23_h|AC+ZcP}H*dWjqo)O4WGZBK^Lrb(7m$l+TjUF_bd)QIwvHhSI^uQSQgm3Qh$y}1i$?9CwY7LY#} zIb>f3S13QSb&2z~ZsO&E(_eY6R0Nn_d)ilDG$OAwcc31;e)&f$(2-c7d0nP(g7db5 z2k#FLF=PNKKW}m*Olhe#I4<~aCP}*npnvEB+1?%@=X|f5w@z)jz!%#tU>8zc{N2c> zyaxD1R0-=*a;7bfnG9U4%dn}2W z{6dwv2jA_l*|5=zNKC&yl6?fAL{ttg)m!JVPcxlC+^#%&MFf4zw#6to1i#MKPn~^iIe&L{NPv zzIh_QE^=S$@-fzM7C*3w2f;I3VmR5?jr?05>Dxi&t!f00Tj6$p$GhC#Vy?%moMz(Q zrq|=P@DL^=yqG7yRDu3oTMAKSlC<Sv5sPbP_p!%8;Hj*Hkf%#Q-;&LgCsSgF=|L-hLHO;SoWDEJc+o7+#5U!F zulXYse->k}e{zypM#PXDMGlpbcQ%Vq9hS^8Uq7`VnFP?)|qZq1L{eHwA1`FEy#$Bt= zj>5(N6I6Vx-qFnM#ys%BrU1=R5sts3NCTUQ%{jPTfh$NR>|}-%GvHr5FKzFH{F3_r z0Pa8$zt>5T-gO_Ts!SmjXFVzrQbk~yT)~1MIPrD%lg&>ch7{se21K)pkc*MLdWG5Z z7Z|%zu_{MQO%%QR`DRxub=M0d0txhh(b<8kCC8Ayiexgz($Xq(!Am540#Z{QvZz$n zZ;hKsAO7$cOev4^C;!_K`j2(d-`2=mp`S9kkR!bdPms%Kq|stVUy6|_6^Q|#_4QOi zCY)C(HTr0EdN^uzae^NF)pfL1$;fjvtRzCrZTn7HE>MgG2&N)ipGPK$M<)3Bxyqkb zPb0kmr98!4ibYkq#XKwMDoMn4=fc|sl7wh9;neA{0GREt{~3l4ck}%&*H$?t2e|;J zfB7CC23E-cG7A)CSd2bTz0*f+YbU1B8+fYh47&|vr!J9>E!_IN4Yz{6zMuNR=Xh;@ zJ(jg!GBNsd-o1WX6o$VC=VLGP>On7!cEi@^g;k=nS9o(V#Kp{Rf4S8l3LYF51Jw<~ z_*(j@AKnPIxk-^+G)}3cBJV};Wd(9c;-x%`Y$??`K+p*Yy4xyMWhf+wtfmMAD!*SL zN-7@Z!+$=1YuU&;v-44sLvH+bCx@MSK0H!~-JL^RxxtCaJPX?o2;P$nw<}RuN|^*} zV+zS_(K!oO&#-Xy%*J0WcpF;oU4~8*g4>4GprFgjNN3eq{QAHAlChNti>^9^XFKRMfG(dU zqN*D|5vNH&ETo7QbGNMRJ0i;{#XJeMe5&U*QKI6j+X^lpdx`%21YzP)IO; zeTH)%%~APX8YNYj;lsch^)4qZ76&bYNQB)x#)_#pb07Wu7Wv(DwZH0N%An)DH?MM4 zDTA6NmrOGL&RN#xR&SPHSWQqKU*%Y*4WnMfg@RZvW2rqvt-A^HjbHQ6ACB?H$wffm z;MaRO)~!QHM34(#E(_-ujdVRUOQtOI`roU>U+!jPe-pir8d#BFW)~;$L%BTD$s~n) zJcAR;<(Xd3QBYm@AAgCbJB~7p6`QM!J~_qNcdj!t5#Hl#0R{_3tCNn~+-e@PiH<4< zMsdgAK=)6nh@8t3DXW#qkx9U**ZKH{m1*m?Lx^P+)GUc$lqg#+fJ{l|^m2qchlRu5 zK{_Qb9;*kBDMENuCULvZ#^`{SCwTO+Lp(q1q9%5dPe&(s`_v9m7_(zU5=;F32?J(n z+i!lgKq;Fd97~eKwiVT~OESwJGco%CZ;#y`5mrVmWyyx4L_5LWyvvFO39PPL+`D%6KrQ3vfPcqy)_awuTACo^$ zDqnXWPr5s8!`&Qu@-g-~qs~8-Dx4HooT|lQ2q%Yo!@2D=WfXqDaZ2^ z^``rBdGD4`ILTCCo2$K`AWbF652<83?KnC`ELke2749I6qD~Xf6!6BDiN-GS<2SEx zc{0pq9u0L<|NIyG_8f%Y#DswG{EmILQtN zjz%9Hy&h&}<7D!;FSivFeYM3&y|qMf?L2dd91ENMvb0V*w7{i_RhDj=aPOUxtPl<- zS#R;7cly}Zp(k8`;6`*_y`!FPHz@HNL{gPxfGz;ZfZkxiqZ5eXMlp5J-Bm|RtrdyH zZ?RmtvFO|B_SfJy!c|y@F`34WQ^$vR5Ah-6qNIfGU52dTwM-CB zc44(Q;BD>0H#JKxlY1biVC-%ubuC_;T;uxE6sIp-VFefNk#1`D8_?;LhiA#Xg^j4* zP?Gp>3lWbcP!?8*XS^5%1A3zcbOL4Um<>MKn%wwIMGA>k7UdEvYbneV5t6+gEJi&B zn?y>`k;9F1b6kltB%|ZR@tG8fG&9ji%I6DYHo?<@F;?%}ZW}_R{T50hf;!t-F zEq*iZ$!*U`l~BV4^0F6$+laFb#AQC?P@5Zzt&Z*?FD^rdVm!#j+oP~!36zBp@q8C{ zpO=?)T-dGL^gYoDMkZr>fC_EgNAaq>$b1YP=Aqq^_}g zteNhv4i1->Ise8ug`1HVWzshdI_;4?<%ys zSST_VSZ1l!OR27&?!yk|ulEj%0nGG%yDEl!MO2~p0y{(2$tDTIs zo`U;peEnz}JxvPI(()afhE6ab8LXHsU@dl0>w1K5^mu7dFB4gwW~NlwTUOU>5ylot zbvuY3@Kb%H3b%3<7Orryn7buvQmpNvcK9X!@TpcB3YS>E@+trN$t=r}JezkSmX#t( zsYL0a-FXzHPzo}=9HF_kgXSI+kGR%RGr_HcyOb#_3Z-J{GhMtp5sAc^Q9?v|yKuL< z88~X?(s3vyx~O&>X25U3lAK_E@*}45m3Xe*9ea$D%1`sr@BM$6uDSQwkhZlBt1q^ zhoCcIHcLpNfG8Q!o2*!@VA(cK6h);}ETNV&Bz0xNRu_7D7-;Y0nW0*0Ea7eLEdfcd zM{f`j0JF(hNpLGl7>p*YRtuCBN~MP!_#X*VoSJ4i*n_vFhnA5|nV88sdw8zZO^bMA zYi_Q_sa024eY}zWo_+KhGq`?mf=sZPYR3qDbw#6J5f z>4_`+%Wp2S7))%1dEAek%}EEWu^f>JEqdPkmadl}od;G2!R_KLfWYKCYe z&dgkdNM9En-Hn(sR@QGx{8&kPTgnzu#}-*{Zy?s^qw&do)T;%o$x3wI{<>zKtdn5= zIuns)#%{V=78c8G1#))QnXlQccKWfEs9C8UN2|7y! zN{Whna|3Fks^&>v`s2fu6bIKoWpOQWs}dCnQ=AI09PFpRshN)FdT_llPB!Akz0)|{ z)|{q+BRu)-KjyF(t)Fvcedtj8H63ycw8 z?_@18KuhOg+zTbFlerzspDdPOah1A;e)c!^^3o$NbZUm!Ts0i+qo&!6E4|F*xf1bR zhwgv1k^bgy{s#1wkaPX=+51QiHcKK>aSJ~ATr(qwzR!Q(kU=gg+)Nnw{wG}jV2le) zb1l?~y41p-bp1ImwaARTysfIu#B0aTa(*N6+C5W9!qnTG(x*vg4)LwNf6sGGDkCrJ z0T)%$67r2pym36m_#71S8K&PkNt1Axy2lRi*#GEfq$rXrn_)FfR;m~@Z&&1O4Uglm z>EJJhpir`-7eqXnQ=C0_f%i||k9j`>oMtIj&19&L1Kl7@rwGhUBNuM1v&~=4;eke6 zW<5q*H}wbH{7(%T^2NmreBA2B<2g5wYI&Z9yy%Je(`h#~VVnL{J={rmq!lUm~I zn+1vylB=_P`ucGuKdYjh2wfu@DDaQsi#$8f&&X3<{HGx(ZIk(_(Fxw$$$fdRWJ+*q zg|x4pXpala@(kfr`2HfTcFC?}7)cOIL^%D6zejoUISw8g;gSF7XGAXERJu|N@3U}Y z!!1}hjC=4={;1o9*W$uxa#3GnN3uVO$K8WJU1a6*);O76jw4-<(DO(SkG|MM=b;Q> zMH0%GLW{_zO*hJBlGuYBexj0G*HKeTRdp3MX^_WXY^G!ADTt5r{-^6)U3r)i43Ugo zom9f@LFAT+udZ3yoRr(p2k``#u`61tB66dR$PIZW!8gJOuzO1t#{-} zHJIvrTkgWm&*hD~_TGA*Pzbg5&Di5 z0V^&`26c6mAHQ{lYg1vi+^oH~Ch%nEHGhlQn-RV*^$hdaQ=J>@`9`wMQ@`NsEy*_T z=_N_VuJHB`d=#E<<>=wfeNc~n$8oqjJbjPSb?6Bm^&4;)x6~-Rv51^F#Sh*-&h^Q~ ztv9?dK{;20^VL53pKYRR;_N^Q8I}fYd5XVcFdM4+PVhmUr$kvt`MG$6Iqz%$|(bh{4BGppJ66bim<*& zaB7TVu}DqMgU71hXvZSUi5bER*SQwR5>EkSNiJRC#(4!%7s6uzy-uN&FA$!KW1P@o zFl1RwWr=M2J*E`Xim70_e(&CwZIiF9ye0NMH49NFYGX2ms*2P$%i ztP>OkyOOs5E*(nxPa$X6We%tRPd7X50os6O&M;1w4ImO9Xo_JuD zrEH4ig_ESsam2_H>3ovK=`^Q|BKg@gtD!jg)Hsvpt=Mx-sBKk9fQ~JhpTD}zeR*5` z_jGq#Nrg~`Qo2A!%~4#MCLRmjU!;|sgU~f*FKo%}v(6pwN`^qGkS7!v=Zdw8LJ3+O zw~m2qEJHlKk!-V&MP82(2^CRIl~&B(+)VBqC#kgnv*(ZVk-UBGKsK>XKC_P5Ya%wi z$Q&vK3gj~hVxcue1H?kN?KnyvlIvu$QF58suEy2w$WzR(vN$!ym_1KX4sOh4wvChR zbMw~qs;F+QS4uuca_#~bCt^3pm7H58wld1u(|W1$*=7+m)S_R86%O&Q=o)Oi0IlCt`-Y8YFnwVHdO+3 zfVJ!zvDFzaPOK7J&rykB&5%vUh^!eXvOVGHPHX-qDGHfc0_RR}K3wevXKR{O#2uD=W(E3r>U+=e>`Q*ESN>1lIWf;$o7oJ7 zHoQ$Ey!Jo8LXZABx$E!nfBj;drSO-b>ss(O9O4iD@|!f5-XSseBmTelVfFI~RnmA! z=!9w{!}GlK{UM%yS|IwX|A!C9mN@w!?z+;@_zbL~%7CMYRs7ux8xLgl%w`|RmAx7o zzf;W5Z*2~HN%L}_NPruI-iE~l!tE{adeL`vP+MihsDwx*r%{#9%c-LA`-s(P=IE;f z40KEAS0;FWJkPav^dqAF1XSC^_uj5o6Hz}FdRGcdBPL@~8Uc`^24+<4kEmFv3$d!uZ zOAjmJP2*u>wmTVk`a6ttH`49MLpH#fkIr-A&9N`pWf>Y88X6j3R=$8UQ5)E6FuA<6 zR2eXdw;t3iD|w3RbA;k~qF<^V&4k|Qz}Mu#RE{Di*I150@$<<%sPO=i3?{1mEmT=e zSS1ydEbGB2(NLTWpPg-AL*qfAor%)W_}ydsnW!(o61BlYNm}@@$x|xiS)9@i%>1q+ z7c0?iT2E?dXlQ8cl`l?-($LV*_>!XoL|yrzWoVZkV(NFb3=cE6{Jp15(a`wnqA5`t z8X6jR!6=kzwUjW44@YAVb!AM#!*S&WixO-3hnFcnr+xv!-5MHSGBhPhLqkL3E{M7^ zReJSz^2}0R(Gh#t*X?L%{GOxzl+e)7(9qD((AWc-5~ZP`p`oFnp|J-vB}zj>LqkJD zLt_tUXQDJTH1>!N5YZd-=nVooIY+UiQo4sETRNS9Xf&gj1SFk`TDte|?u>vSNEl28 z1d5d9A_XlOu7-xjLq=1gG&D5!h!JR}@8}_hM?9G4e!{uSLC#Ly!#AsHXg>Bm4t3Pg zZHW<|_z9m}ytnV}j2A~u7f*cWQEHV@(o^sA_63N2sgm_-XlQ)ZkY0ZI<(rHok3|3g zAOJ~3K~#Sf;#0(fQ;aV|R=e}}cK|zPtB3aeEz~$nST_T43USi$AY5=NvwnMf&N7F zV6ghB@AqM`8n`u2w+dv)1ZG(e%o7J>0Lcu_PP}yN{mLB8vk2cyM?zvloRLmDx) z#HE=SnfwE~BEsE-t-gf=wH9o80Vo3snY9_BOEb*GAh(xC87<)Np|jRSr^~qUp^BVO zlAOE5LO8?94$8f~z8z0vJ1tcry43Vt_hQLprMi8P2DbyBb#t^7D5m3t#>QDmXNl~g z*&2I8`m;a#GY|yOo5%%TCosB1^qm4r1y#HH;!BR8uf^pX;hFC|Lw7?J)j}E2W5~}E z44fkzf1jDf2u1mKFFaf0t4+DABImQ@GAU9*hD=Vm4_DsjK{FQTGYowDQR-`rnB*d| z0_8G55eTyOZ@*?XFi(aJCCcbPY-)qiV%r^(XIMzlz{^2*^dccexLEh%?+*$ z6e)y5Dj1FjhlB2^1c)F!P_RN3dU#26B=RGtZdzAt2F#Dc_ z$EV+7G`-t>uob6yn3o1@cmpT-;KyT(0k*+obPOM2_|flhF!2%jsWXfL=?ypZldnEX zkJm*VK?*e7U2$t2#(wy5p6ZpbTzQWVPL47L)E#+({^0|3y!Hyo_dh0a;v(}v{=NjI zaW6=hE?ojgE!YmyTj$5*YQ`%WvG1)qpc;RBBTel-9Ma~s1`3cPJ{e$bYJp`c3yslY z$KNxIuiDN{tLHY9^eV~75|?LVn7wV(H8fCDnj@|{NJ_P|REd}+9ZE4pE_8vwa*Bmb zJEp^r&C|sGW(N+l#Lbj*g*d6$8W+ZwNo5O2W*gOQ`)RZ*Sc~DCpQAT}tDW{nJ5AOC z(F^0Oq(m|{5A6eum~(k_sXY2-FDA1A(_P+iw{mN2uELs`V{S3b%uSoG9kb0t`#=lT zVgfl{kx3~VBDQjc^DEbxm|Eo0WDdyU>a@{5(ocI^6IUmef!!!ko6l;*EDA`nilfSm zq$DX8GKBDAH5zc}?v%N`z8z0f$IX7(vEMyS*nN!*+e!!~3kAIehon$QWXWe_tX>Ct zu|RP>!rYY^!s#5Tn|4`#vNLzmA&vy>%tVVvdEHZ!=V3447L!(Nc*7WUAm+v{m%*lWga*h+l3eQc*~ z^;>OTSYl~*g%}&wjLlxDZ^zTnM2kMk;^GQZ3n{=)Q&b7PB#OG(&mLgrY zk)Y~kAC=`C%K9AB3){!rUZ_||n!EfwQMcKiJjGOen{16cv{^yUB}wL&x!cn{&0W;D zbmBFG;kMk7TkW@Q`@RROeUJmkyyWHkotw9#ASYKyEnZ+{0+QLgm2;q%>Z$eBV3DTD zhHnrm*JHG~scx=C48@>OqSDJj(%~TKa0Kw->TaV^0TMTeEzGevvFFC_oqHL#IeBaS zbUX0bww2pyO@@0azmnN1(^~JQ$7iR;>_g88$DVE=kuL5$&SBfS?WWx=!1^3Bw~cM1 z*^Iw;fPqFQP4W^ST)xJc8*9wveXNxa;CiNw#@0SMyFX%~2vfWAjpdPZA);4DiA_(k zcIhe;fLUrH>lt8hq!VA`4Vt}hEe<+Q6OH=@=<=pfV+E$?s%UEPVY;KN zD3{s2!BjvHY#2=4^dEkLXTNcfTA_pi6(|8=rhf4zXQvj30R_o`)mzWuSN@2R)>_)k zB}#}$Mgw|-h)|Zv%zeV-*n7+e)718jaO{Pb7|OiGq})J2Kgbh)ff}n3wGd?e;u^pH zFvm(nK|zncwvYNF&+)xyYVq3*lx2aPTwQvbi{>Z3$Mekv8j|OjUyWCkD1#kZpWwiA z&AjYSaA|&(6DcE0&LN(7^+kNKb)bZL!u3ndEo92#T* z{Im}~$MdiB(h_=;e|_gH^DC(hldK!N^AJyd_Z9Z(uamp>4hx|)OH*S+r^dK=OI;U8 zW_t;(57J_+Ml@J=*^f2YH{a2s$DGbn-{{3E&y!29GNugRsj8w$TxI>@D!=+L%R;ma zdLzERBaA%vEuQt2aTq`m6huRcxi{Y8{Bnr*^F<O)LS`+uBuMe zIY)LkqZlMgvH~TCv83vz0Q|tJ)2Gh)o$#LXORw+P>-?}S zkJ05OZmpr&A&{Aml3dRa=xfGlPm^7}$!|8oT+Ykn%zn(h-{SBK-F$D%M@a@W1A;1I z$zA8?zxjmqaFRk%MQa+s_x$Vpa465#oXXUak>^j;zT3EutnN35J*MH+mC z1II&r$GycD8ylR-=ZS7#0Szrf)V=ry?~KVLe|4I3JM;Fb<){OUnA%2YIQhn1lfjP3 zO5XUKr5hi!w3Q_r8o+zvRem^}XYKUw_+Wnho=IqDRJz6(d-)B%>$=8o-~W`^)dh^^ z0}SmSuYs01Jv6=FSTQf{-M);^85>>3g0Nuj}dE@O~0vNGd zN~q~Y=6|)qdsnje`-$o2XN?ziAd3lQClJH!g<_zI{0>Hbgi@eGU0akBeDSZd6;+CZNJPg^~W!}S=~ z{u7tJsAV#FlD|5tQvXoBW}uC3e={$HEEtw>)5`iOsc|0>aV zmhv)@$ZbYRQC48nHj4Go^9;ABF#aANeR7?vw9xtd0S+B&r=f703zx_F_3!40ri#=8 zI+GJq%}Wdv!Z=pW@h^XW4O7d0x<>bNp!qf0f@kSqmL}-S*||K8O?En4+UQ=p z$YMUkS$!=B{D-i607nc)PtkLrmm}7B7XRUWZbjp)c>J_H|6TgK_H*#x>)87F8Eyd> zOi<&;l)8X!=?;_i{|>*$Mxc~s;lE8{+vmYCP)l2nktMN>q;QZ^C;RBN-(dcuv%EhJ z@k|%Kz#ymI?qujt8k?5nr=Knn0T4`J@zXPq$LCmK{a^l`4^6G4x<`3?e;Yk*b-cc? zz?q44vJG{lj{6B7G2jMvboXr@JBNcV?CIN#XOmoHd)_`Zc3_Or#y*a>7Rg-tDVJuW zOl&I!wPFe}6DOJ~f>)vx7mEJhQ4o*Xu7_m~(v)qpQ^gKPiykC_B=+>=Sy&@^u) zF7w_v#G&luTr)(E8ppI)UORD1CxNaJ-WoYbe{Y=J+AL=lAo&b70E5+nf2fzt!g=O@ z`mbDAXrb-U2&1Eow7t?x-8mVqMS+WqpS{h>Of4qHIP!8AV)jB^c0Ol-E?YG z%>I}6xEV1K36#wr9j+AW>IDDoH#fL3Z30KI{AZ1|xSa*oFa0AIXHBfBU7URD0D6aA zN5kCRXL|PY(#aNrPBW6jfUO3EYV7?tg5k)wUZEvk%Sa$jZh4+-*KabPEj&`S{zwA# zSo?<<8VTZ!OtNv|9Jju>!^R`@-GSN$y1RO)({C}oKEt_d)5TZseQb=S- zt)=hUhjoGu!E7eKu))^l3rvpRLCyNe`}-K)*No5Mr^ULC(mq5_cP(Ak6pIs6OpdQ{ zZP^CoQ5p^Cy8AiW)kXJQgr)W51CcgQLI((xv<>o^FSs@_!IhZ=t3rr;e-=lFhmM{W z>OY<&P4+3}r~+vsi<``hM;SdC#1r(=8KkU|^|;Zu`tX#(Y^`l_c{WXcw`ah1RERee zqRx~fyEsQK@hou~+kGsok&oZx+G+=?&rGYPQMi7ch(#mTRFB{aU^F=~oAWew4-j(Z z(Qkdm_^mIvwvlGjQO9O!Ki=mXXdLdR>&hh}PDrDHP$ado%Id9Y3P&YehCFIvm5DnA z>gsLujaqTI1cDtQimpLMngq1zRVF{X#`P(P<>R>OiZgWWW9Vi+Y?40fX`M#tJg@Wlq9@9&$S!7%!qgaZ6!la^-~fAEM^-*V=vtSGa(_v z;*B|cMm=_uj*^^3Q;KLxflPdg`IS}jH_Il2JaGacg}!VXot`>+T7rB$S>bUkKw)|L z?%D|(MH&izjt`CC^?PV*fD3CplOsh*D8<`uWyp`2l4kbGSbq3x1Lj~q{^9S@R|}#9 zloU`?q!t(NM&21~e0ZAbv6o^*k|~zg6;jqP1%E50rX~WlCQ>;_?d@d#HRHr;ZJ}du zgpmd#b-6oyIB}gzcOp#Rw~dq|1RrHu$|n@+B^^gzKT2(VH~k&AxwIZ9Y4u?AG*Rnv zpf|=?$Xw&j8blwu4;D$U&5#CCsWf#*MH)&e%&`UT+`7d|B=_hp$OYKC$=nwy-VYlf zJjeV-<(jh~=v;lC?5rMM)=xGs}>#-f|rqP=x zdv=P+_r@tarhLe0W4OkFEq{lNLY7;|NUV{_M_Em33?>&;V!>rTj9};}d-P z-Z)txABi(Rx58GZ9aROd!%X`N9W=EXvBX!o{e{HpDnK3>XL7TS>}(68gG~hOHMFwV zn@pMf=2eo{f5wMXu#o_~D&t#m`a@p&Z64YMJux7o6ToD_Y|vxY>+Y|lq@olhBuPdE zVlx}e7N=Qz?hrNgZaTUQT)w7aXmMj3_2MZ^b8~5fPZoD+klu*kuETod+cforXc5+# zx^;!f+SLFP>-02uYU<3nmg1YeYH&6uSL1wHv6>AYGE7m|$~0$?dC9Hv&px zlhoR6u1a+b0)5-H`?~y?x|*pqEOTo)_UU54|;GINe#yx;Z4%0o=|8YK$>f zZht{!ZFP?_)X=t_jb&LyD%q%O>&3rN#I>{xXsAW0JoZ2-RzO`yk`aCA1s!^~8}p&p zIkL~oOZsJgvl2!%>G4{0D5)rlm?odeGXBx0<$2|DVE|mDuv%wGWs9ix8XV3R^uqQ7 zXItiT6W2Na-Z;v0%vLjcz3%>y`;vyHw|049#~{CmZjTaCS>y=Jo6R3tf93w9KahG!oL%prxie)Xa4=)a(j6V z5j`%ihuQ`Y=Ij)ST#Thc5pFIbb~aMzsimgP%2rwr**~O^L_bbb7caKg(V?FtHg$oI zr*o`6bPp@%2kWY7;`v4k#?{*_#8(;L`FeR0QOD-&ixlLnG7~pfK}u!dJf_ z+}%n@^d zE6iUx&9ARVnGIKzX&)u9?-+mH=cU$Gp?{O2q}FG*$9->y=dya-hsSOv(0BrWQ#XG- z!uA8!0C@4$T5+(+BYkk6gr-0)Nu*e~Z$3Pdk^>oc_mIETuR~ z1`=5iqG@KAO`+!1U%)4p&uNhv%!tubg!J8-y(7QpZIKIi%VZ~_^zUs zh-M|SMkjSO4ID9;fFN;07o9;TKGsNwXPK3YM6l!fdYi-D=)AeJY~J{gspXyMJQdUe zg;+JgbQ4+?077)tTWsS52LCu48C#QtGFp2QUAetwoaQ_p;Y0t}d(e*7=K zOn&P#RxbQs{QU$(!#b?a4xZ~Wqtl*l?5cb<7_MBo#AYdvC3uX(`|Ii0Cy<-EL}oI{ z<{nNTvQ|P=6iSMWqN#{HK1W4Dlvv41NX8nP`}gzwn{H~UCp1t?ow~{5)jKRMM(#I< zX)0PFLtYZ^eJ&;`ipjf&1$)3o06-@o=nYuWVdS3j-f1!tv|2C<&-_S#Jeo#H(~v2Z z4i5h1>MoyqemA7%Xb9VRSR3%>Stn#N?Dii~`9irGv8O^3*2iRXw@nkJ*F zg|Ze88CA}Z2(PoDr72X1R}tf6;xgH9V1JfWjpa;^xZ=U)?_l)g%Q)f&5}rl|gEGp} z64O^^3Fkya_y!J904hpmo$Sgu8`HZ)=NUZU>Be4DhtFfjR2-yXpq`Sq{I#z$gwtxn zR^N@wy^f2Gio~10Z!}8CXj%zb7Lnx)Px8Ol=>+t8D>~u6T^2zX#AY^Ps#N-kNs60y zn7#A~7bA6Ob>;og-w-6wdzj~5$YU9wM4MZCC_444BZF27lP@Z0B{P}~x31k_{K^d1 zXHtL<$AAg9MWq;DK@y)m0au`9VLG+~x-6%E?m%xkLhw{Qog+qO zQm_{lPApeoF_xmxqC;;oVzwC274K%FtDyY8t+cGLRS+o_?bHs8G1xQ4AV6`0*uqUd zKQqnzdTh@fDp5jFR8)f5851bdh8fWn<$!$!uFv-C!o^_7ytnS z=*(CwM$AS5-D7_dz<{7LV=)>qY7%ljLs-*D1LV^%ewxeUaQP|PpO+NIm!tI6`4|We z&|$A9=x|Y^4|C_5LVUTRu-=H^2x9I17SA2-<2(I23b)U5_3AXI$9JiGd6M|@BtL#^ z3u*{HMLX}IQbI*hOXR{6gs=UCpZ->4HLmTx364R_9%|RL60)YFWb+cV+37OFH3_mM z0~WoNE{~IdMTeRdkxS*oczb%Qb}WoEx4=q#A072>I*+M-WpRUIW`hN7nRKCqVrs|l*KpcZZf=RJq)Z$i z>BQ9PBX24q#x#niF1)=j^Mm0gJmG(3=KPQN$B$t%W5O3|=e56VXUy^B!?0j9V6>Vr z3MGoUD5>ZYstOPzlZ^4n&v%c3B0t#)tD>y7AiDkfVeZs#p(4OArF{C$%~)52u(G7?4% zMjK|Gh=B*!atTn-N-7#A9G*@bwm4=oW%INlh~C_M1BxmLMi(Yq0Eb1P zv?Y@XmlgO`zJAL01cwR68gR5Z@G1q?VCXA=eHORbu--3#L!U_>jKQp zl%p6zzApM}Me_5%Wg$GpEDl-$%vQ{H4;_M@9BoLhazxmHZX>2-{0RrCHayltoEmCj z$hk~k&Yym3kOBJ!u^U(U z>3ic$&VQ2z%m_s}#cViDUB@sjLo&y{!ep)CXqpv6oOIhspK|~JAOJ~3K~!r!bv<5& zkHGX*$Y$EGnhrDE;=`j{WNqd&cZw+@KM9%e2%OiRNMUA}b=GgmfGw}&tt?x)G0N4mJc)cdoDsYiD( zQ&fm%B^3L^N248+u2}1%HrPp*;SL3IkDlAxi8P-((8OE{dB6)vvF zXsm7GrRE{tI{qmiUV=-TRu~(`+vA~5jWK;mAvs@BcW{83p2Pg|M?}CZccNBy+-&}QYrIMS{jbBuP=5tqSn$|NAK|t8ciuS?sH?P z@^xc)^UXKG=7Qc9T1*>6uV3ftbe5I9YB4iwWEZY+{)~eIJwY0ezRXM34N{pR<$FV( z#LNPl)0?bOATNs~CD2*x@CGb2ReGV9RN6aIY|bsSvaQ;ET2wJlX7(~Sd;)Gmh_1d9 z9CV~{blZR)`r6F6;y1Z`b&koE1o46a^UWDH-R(5Bbg}>Bx2Q|H5FM>_TLoO2yz8yU z?Cqw$?@eCRK`P&j%hkjI`zGndTU@^~%lfv7Vb3T9h}g9(>jkj@%Zhv`Q|wj=XV`&15YhXE%+* zZ}O5KGX7RvZS^<|MoJHwnREs)`l#z0<|71yYV0C!rOL`=ihWt3*?*oa5cFwtzBkjdXn+A40*~4V}s3Iw7T_FTEc6(Td3E^ z2!DQ^<@t5O+)HmHg_c$_F9~c zZHxtNIE<~heIe?dCS2xj*nYl**Jp@tPBXQd*_OE%|B-#vhxT*yWj&U4Fg11&Y|Ih9 z@&&hUEHay}W-I@uF#N?|`~^FCoHj3?;o6yB^8OS=_v|vXLOP!2^pEw(KRCdtw~zCB zGu!C{WFXAUyQjH4y+VvN77`oiB5-2(4Gwn-jNVl}>Jd;dv(D9j`z;@>Z80IKD3Vxy z&sM&Oq&&uhU?)05Q`i(==C5CSmEkrE`?tR?CyV=((-*Rot%W(3KE244%R*zvA-dma zVpxz7vpE*7E)$gmEY<>fRlQH8ZS@aPTiZ==5Ht-mF^)8UnltAo_~mCSdlg;<VT$b4y4M+$`#S7J3`)2vVMc(T}D1IBz!Ze7iHIzu@MXIW{v-dx%oe z)FNUoLryMI5H(auq?pf<$rdQ6Dn+@7kk63O7br>!QZ~WTr|+UEGUChM=k-^=O`D~{ zs8-x0zIc<pQdd&i}?r(VFzL+PqCn&?qtr?8Nd{vc`QiXz@hCVu1T`1(|qxh zUvXhI%=JBYvTW9oi+OUHEIjc3J5?@Hte7W{l!*f7{x><)FEbopV&S(7d^oYih3qn) zuSRLD@8a0#@ZGhx;}T#ZPGpmr%85iT_g2 zv^-KSgI+8mE4wEpH3`sQH)1V>Nv}_{C5!iK9}-(Ai&MnHotR8cOujC3`dVuHhS>LJ zFHW}20}>GYE-gW599kiBbB61eGsI#gKt`2vNU|PX@Vm6s-ESgSa^><%xlP#PR`jH` zT;4y=u&|M3eda2K_$G?wuQ@q1%%QRU43tYD#+O+5?P;#gtly2=Yib>!|K;!Vdbq(pr{GPNb+l@NPX%D~8a1YHcM3=b3~zFRtt-Fdzkaev zR&e9-d2y&QVu?&S;o9S{crZJCgleoKt@+L{K0bA$*fBGN3ONVg+dF}(=`(oR~pvh>37~%L+wCyRdcmgUT5#w@3b9q<86CM&c`O{}61w8H z42v>~$%41O8JEq>-RescnkrLJt>~33nz%jBhhC-Sg;V^W!z!7qy;F2#UDz(#amTi8 z+qToOI<{?eI<{@wwr#s(n-%W*{;~hD@6Oe^o>*g4&06)&=Y7C9(*802>c&>~M|&z> zYln7`M!0jSW5dlvT)4G- zr!62#VmEN<_V0F+xlgnPj9g7@oIXK5+{D?dFQ$4Vv~VOy*<%gLq4eVkJ{dQ@+qA!P zb3(G}2BMaxtvccY^EofO>UHaI}a&&nF8^xh?Gk^=l#)f?_Ac!;P0ZkZ+9R6dbln*>3%t zxw_(0{>^N}@+U2dZ>5$7cehY3=Q`Cr+(?HMr8bNeiL_33GpA%4?I13kRS&Sf@c1d- z;$iSL7N<{|;1{78Du;L1|CSrDZdOpwC|0Hr%Fr@^x#);7_}d9rg)EG&5k0UJn^=t@ zK`VE27||g$Oyq|&Sp(bWqn|rD{1RSyv?+%D);|m%2!!?6-@KhOp`|I|ncAYH)$9s< z!(8(d&1Nn^wJC8XLpIHZmGN~OEMvoKH4R=(HZLNOK+l!uzZ%?S2~uXZ=ght21u`Vz z#qaQ&PG}8^$(XHKX`Fsjxs^U@9|S0aumRa9rcdDp4aSX~j-9Q&c6I~Xn-X&rg|=0w;S9tYg>V%< z!$1EJ6b?ts=Z$LU3_9;#7jI^Z>9tL-r-RaZBf?eRCmWUg#s7=KQwVh5j~;}!gRcXo zHe_aaVKT5waB(P7XyDh;s8#qpd=MZgbN?ebxKJ2cKk+Pm@IQPq3l6fk^S6B}Se;D6 z_@c#RP`tlGm--SOX3_wBgL1^?)^qL{*0D>4YV;jUH~M_RjtI6%Q7C6S^!gu5W4LsA z7shjXOL~3{6MUsAQ%xjghhBkHrAJojegydQqMCX=g`=yNs}xUY%-rlDHQV0nWc_F0Ws?$|CZDs3!O6Qu~wdlB`j4z4HJ{SS))|V*!(hSsPk9v$nk&l;_TwP}i zLrNBoVe)^%XiX)V&C&WqOddl?w?26#Qy~KgJuVV5Xcc{cPHG73$y5>OZ3orvrjhr0 zrbh=`+RHcIz#x6QdYLHIkfQWaoa=oMD+-&9GZ zB^Nq%c_Xz7RZsBc%KusW-zF2RO8jDK|GOI>*s|z<&-rh||L-A#TMs_>?_Vn7XwpSQ zLC>S9I@jN!r^t^Ibn2*(K@K-!x++TO={~{|)d(iZG>CF}qnh&~z%LdjHU zrV$NqbGbOvDffaP9)~%WVsp6l8&Oz~JlF5x2@w=0$mHmjC*66mwy_Z^Q@@hb+$?7Z zG5`FKpv5ReK*doJ7E@>MX|Ov3XVR=ogVT)SnKKbn7D*!T1F76G>9=SwSO`+0c9xe& zCchVlP}}rouo9j#ZrWhNengBV&l`t8D-SCRQ1?>xgqK%#OO92TGiKUk!hSm9{wW0H zO%k2JN>xZaxi;?Nh4cb4d)wc0rxu{-RRjPWX{rkb*4J2h1!n3tazZ`kZM^GOw&%T~6pb;wC2t1bB7E)qy zf5G_b&#e$Po44#e#X6j43v8TUa?$q0J7}LYKa+OUgxV#NAN1-|A=3Kd(2E+d3X}M)h&fn0xv8 zC@6Wem&%2~vd^*0IzbhWTQ#eDOlgh*O*zcZ*?+z5$!LyGp9~fYIVNWBH#Bt=%iZ_` z`VRT1n5w)vUGK=)ZF$b?ewJ%(xlhT!yu@V8mcij&@`kw{{a|lL9nirvH9H$LjF9h_ z!5f0jO0L=N8>y4d=dV;-U3rgGGlG!;C4p_nQh;7KRVyPDwsP#&@x19ljdF4yEpE12 z0aZ?;c0IU1a%o@OU7D=znY=Us*T_6JDQts5sMjsYrNmNLMm_>GHiCsQfD{40;61~( z8OVkztwGIXn;qrUApTX9ecy+>=l7gVP>J70$Q$?C-au1}RFfu=ZIiG(<<-+C92YwRLvVT;YB^R% z>16?gzcVI$GYR`XzFoD50yq^2OnEigJRcPflFjf6>yU*8yczlAhY#p2vQ>4V<=piA zG}UnBFB=A1!RVmsHScG~S0PG#Ck#Ws9JRjX4LSK$kmp`3(H@`dr7axhGOMB<5IFxA zcYmlH9*?`)*9T*IpVD`=XPuR?Te?sxe1kp{Wz$G*9jl*+bi+!nns((vLtadW>Mk2M=KvP-ianFlJJXx32uA5~ z6-xO!qciC9GEA<@+&U_nL||AN%aaEV+5Lkmi47i`)Jr%tC)Bj3)9V8y9c%i?aXxkK z44f@HKo}~cqM)4oQ38x-8?55;UG*{9&ZjtZ`HA-lSH?odvydede)FoFs@B4^@sD(0 z)N>tPr#P@Azn&U14CEDY`nVSqaP4KI|=I^DXAL&a2;uM0f)Pmj6ds|4&)0D3- z-=mIRh-nsV=9-%m%2X!G5WHB3|J(p~X#-RGD;BP+|7rvSrqlX_kj2eGM4`6dp*+u2 z`2&mnk2HEaCuV1A_(VdEc%V8UJzdwre6CNj_&cZUYj2tv759~ohoPn=Ks#q?2?!+H zIHBYq>0aQ?hPzZ`URG*1A=FVZf>~%C^DwyqH9FIdXCLT0pWAeE)8Vc9Cr>xgOwSvJ>cxB- zDFswmOf3kgTyHRvn-OGwpVa1l9|Goq#~R=Glsi6=2fKdhy5(al_c+`T4a=MdepgAZ zff11Pd{*ir4T6I~`wV7z$$^7V-1qxP@EBCq(x(44dr#T`{o*yC*aW4|bic~gpB{4z zcKbzL4h4;+tIY?u{59Y^DW6`!N@_YQ=6TYE?9OwbFKe{hVg|q9oCUpNt#u?wdh8T> ze1F=L1l1+?c{L%%ZpJ(y`)*ZkA>i9mAbm#7GH7I=T&G`c$W2Pgnx>0UFgjVo3#HGP3yy16-}a6e0;qv&?;I{w&{& zY#t6#)vyBYhP^+%{>ojuQBtS9#07L-+xCyz=(sbroP`bd6gr& zEm*dR=Fnxj0evg`=1qq2<>UEsjhv@MEZPFWAW3-)Hf%y#6m+8ntp38?4P!6FkLpUg zpWAT$n~-StRVHTtR(m`UCNR|Z8M84lU-c|T7uG$IIN}=U=4P53p+(Pp^?k6a@UZ`k zVKaDKQa+hGK>O46D#+=m1PtS9_g8N^DI&Dr=P)N=o3*_`%$8?=49k5u`1S*FKY@ls z%wAJN1#*)tUAdu8*(2J?oHMl5vC!1gq)B3q#~;snc?7FRnFSTdI{N%u!io|sCseXY z6Lt(Zc*H7K<@-zu!B``k7BDRi#2VozSGZW~)fhmz4Gif64V{9%Q1!c_8F+a2W}we{{_|I2rOEwpX;L=i z;XJqQnrQdq68X>Cq4we97MYcx@dX(jMNax*vb$zJ$n21`D54S)v71WTh$0heDV{l< zxwDryGeX#rYyq$S1cgN8Y!7R_rl!z3O0@_IM#%0|fwy#>MFVOL_1IVh=c3hEd&`id zG)lwf{fqM=N3K}EMyT(+z_sMa zp-7O05&btrLW4HZ5ymOjMi@`#ux)iw|5?B1NERaoHIB~9CBeMX?s};~6-av$5p8G^ z01oz5YaJtsp*3y4+)VJ~x`MSLen()e)~bP*_db->1@exfgBv7Rm(Yt=YVyP}w05TQk9eT9|1`PdXd)Z(6blQ)s;DYG+EvMu zHrYzSQJMj7{}sXwVJbhS&-*z&;##J_%904hY%gajFXm&-7Hy0TmG5p%*H0qkkey7+w1N93JHO9$)xVIF5+i+PLgvIbrcDa z?q;^v=u=qeflQio^Cb~}_I0jdo2>MAfhnR1PnKbn3WFh%Q%55)MKE>*MtOwbtxNoY zdijFQg9~@gId%I{D@Wry?OV=(y?*(kiPb-b{{FP9q+nfqDw3VHiEC3R2Mt5#`qnIv zjw{i(`-lom2709qC&oLUciieNDxH}2*nPgQ=x^sHD7`#`>x8*Sc-z3(N}O6Ki8Jac zhtCmPKVLV%wXKMGlQA4Y9=RW?>lvQ^JL5^-yH1qvMW;{i5xD#p-WAXm?g(jcTeOR% z2-4^Q<7DQO zEnS{|;13|=o?j5Xxq!~9bSwbu{}S*ZH%ON<3R;H`?vGLbb4|?y4D4)xg!;1_x~)pq zTHk;F!Lnf2SxFQy9?@?yP`0QPNm6m&q&TGa_MgkT?fq9WS@vf%-nx0I;~u6DF%W#l z-|yVleAchNCzgbgqNcaBS0;bL$Ng!O-)&02hl!}3nv5VS0;=I(=iLdjfB z9dltrCA{C?wI9u977>GxYiiTGeA#3gUDcEsO|n@(bq50qnTQ^#+!rOo%xJW9h6J8hq(Wn?F-Ynx`J~@j^wev5Nw3!+4q+(f{ z<7bDkjs9~na|Pn5k1Y9B=%N+`gqBmSj;@(Yi1_OmUrj6grY7xIzD?QCak*T!{#bvv zm|Jz2EmwzqM!;S;M$h5{4^)=5Ng=LJeAfOY<42m@Xc<61Y!CBYbCIZHZ76daWNZAl z^TmGe?ZpGqj&J5VuNNv$B7CKCY!6xfm}gN!NCa}{{7j%1BYX#hO6D)RiM&MZvwqpD zG<^4!pQ({`Y_dM(@y+uRJTITng*;$x+!BT`1=!f))Criaq`mhja&+-Fh$!o;3I{K{ zLZzGqu|?caWJ#bAbSiN<^hVm0Ys{Jm%pY6A3f+4nJ`br`pW9r$T)mN=^J~&|c43(Q zOj4YQCW8LCxnEWp%bM_CA<8`utGfq6vqS?jVV(cW1(;ob(AAWWo8jDRiMq3LN7_BM zZ-3aEeZBiD;=zf#u%I=PYVh&kc3C-Pr28 z=bS*j_aOZccG$%Xj})`YCzEX;ziG&pAy-gIpHO{TR8(_)VP&1&QuqX8cV@UsOs;qeyogRQhbj7&YJy5!2&T>GgdZEQpG4IgerhWDfhLp zci*ETpqgtWdUxkwpxINTe(Ku!+(Lx6BNf9u<#Jm3+Segyi}l{JHJy9E#YkqFDM#7? zED$d8Z$hTWU@*R&905XI0=P&(duD6<#~yq_J)8*DIPj}d?Su@HkS$bGJWJN!=xoLs z6riY)eof80eC+D?=nG-8-rM!qC~K`*2q)aWmX+P`kG{QR1U#95+as}*@NupTvT;Y@ zv9HXPtHy`uiD!eCa;DSLHSBCfmCws)a8A(+cPz)e0UaOOhCYwzXBdR`r6Z|+!Q*j> z9{eNn9iiF_w;lqWWK`;q!46t9Nv&a`%o+%RCypQXwu`Ce!Nps^)YYnTbFe zVCx-IFG%*v#wlbCQt<`zUmE<3Htss)iCTvQ%5pDDFmy+#GJiK92uEw1_b<*zyHdmM zP(Fqkq!e%}$griz>lfoIKBsXP?d(s?G88OVI^rauIV-~$WysOZM1S8oFQo(9-QBn; z@eepFq=Q`W&6-u&Wva>Zzseu7jiF3`0^)f=-698p> z^tx<6OqJVNAV-&{W>3QHH$$V~R#(T_c)|&r4bD^yr+(ljKRSCkX~f(LMnBH`4@5Qo zk_-jf!FYrC`Qq<08r0-ObP~#bPj)T+ij?dadK=I>{tHgLQD2U@_-`pM%&xAPEt*b* zYJFO!D^&f(?fVWiQto#wQlwnN$>TfRYOcW{Z%~s7Q78NO+sDjUtqeBfHYJYT!5Hsu zq4goX{x<6b2vLVuOmg||?H;Uz+(nhw2F`f!r3tF~eD12%SJ*&4HGBNcJ zVU+autnMDnX=Td78Ayc6NfsLzh`izRiqe`w)aj{-8%_5^npPul$02 zT3g)Dl{ICxIIb4lQAF!ZO)LM(?2Ed|<*8GMsgB&6zX!FA3wze1<+IIbQ4DSAr+~P~ z5)3&{GGwuOtZ?y2NCKKflNCLrYrGLd2$AXdy+f=zHDf|7{lP=6gFC$(LYxS#%@!aD z))OD%2FEZOMlT4xkr{Cu>7k!5(~{~269#p1p zFLV42p}*R#!807N6R+$A!h{!!R#?`k$1TA4DEz$D9I;1v2V<+?;%R)dzU`3W`s^T} zMItY!1t!bSa3)!I%%9g%IhZIWzi`PSSwKBuoKg-Y60#K5>i3o+)Qby-?M7_v`!u&^ z=PKtif*UwX!VzN8yD5T}3&b>v8qU~6IjB)!gBTFSnIn_Jkr~c!FR4;yDn_-m|R83M<>VG&z-C6|zI<3JQ;!^%lt=u>q7=cI{25xER zRG~@0*fY1Ln7SxJxu&4=xGH~4Z)@V=M3t-6%-D4a;U7y8gGN@_u`%^n9H#*>%F%P` zrH}x+`gU@T7IIu-QDSUT(k3G|%W})*h3?Yy83oMgKY+4?#Z~r-|1$D;Z9m5nUZnoyroU1%?qUpk^tnO z_LOU1{5Bgexr)$Xx(Uk$9b-DcuPVFFut*dLW>G%XB27dz7&KN#6{C12Uedo4#!9vq z!|OYu-$=>Mc2PpO-Z(ZE$=FR85Hz2IkIdg>uz6}WksZsXOxQXQ@Y$>-7N&Yn?k@oU|T{>e)q1kS=bq;-4mFbQsVJXWgEp)C| z)#lffkT|;G9oM0oJfRq~_UlP*Sh>*PY~Z(5iOYo3mw-8fhL_4!QGfxxi3?d|*>Z^L z;w#o1khybB__IhTxRiL{+md9az}KgynK>4tTB>740#~`Rcgb>ONJ7=6Ve7eI|AB?l&8$8lPk=@zXX*0-x7cSqbE3d|K6kulH^%i+~`}cmba@p zmbx0KwqLZeU^<;2Q*LMwi!#3*F|n`k8ukPEo67qEeSQ#;J3wqb{v-_!We2j z;4SX@o25&h7Q@#?phbkC^$!zWu%^5vz57Q)7+J|W6~-E1t3ZWjo+`OB>DDb!J6fi4 zutF(G)cwiq)I0nuh~KC4eXqX+4Pva?;UP%z^~xv!Ep9Y6NuvSBFVZU%*IkD*1Q)`} z7UP+F*~I)NK0@F)WH(0F8mGwgyRvKdcck4X3~Q@jKOlY71VNFqWxmzJx-Es`VGzDM zEK^LQgsZbDCTZtN01k?#7`9SaR^C_edPG6j_ek`RfP_?xa~v9iY5*QmH&jfCC-aO3De6{OP6y3WwDQFUu-xLOC?vX0y z!kf+!gQaiWi;2bu=ik$kse5)7f;XQ}yistuCS{HBow&jb3=lv0<-NRNVw(=Y2xP8& zp;VVD3#)8OXd|h}^TbPU^6S5_ZtyJgg?l2upUDL}a?JQaj|fx(5G`s2~EZmnlMS@{v!3V%t=_$nP3mZ?6OxOLlvi?pt;~y@Gn2qea z_W+E^)>kZ@{-giYx%9)0NcIq2YoOR@9X%_2@F~~%tS6p(kW}(bSeOVs2KgX=k)1Tv zv|pk#T=_+yW7*D1zIo|<@b5?tQu{B*ZvuY5IH0zK%Q&^2jbk)aF@ZZ}1X^4j5Swc? z&yNyA7e8xCb8XGKf=TDK;U8Z1BE29QZlo_1CKmP-P;HxvO{-?mBuH`ta~amad^#Bz zz$n7>7fAY6FF<#1OwU2Jir`nUf=&FpY9E(MSUGf3F_;ZdL~U>BM?85tU6zSrZ*JI^xc)qp&=q=EZY`tStxB_W3_ zCCXilmN1F6h;XTIT5Io@3u9m{=Yq8gg;dHVN|lWkXy>mMgd%XMQ5uy|w%OOTaZm9p zj2($ZC|*2dQxFR)*|{y7(c(C2>XF9leN(WU{LrU?$Y(!pOi(?Cq+AM-`W6V$-VASAiI+~X^^^hyYZvZTAe=GY;k2C?BMsa(H;7w^Mk_rE@Ma4m-ozq4a4=+@>!`7=s9`E)wb%ja9Z5 ztLKwnQb4x_ODaI{^pxfL%JdCh5NA-nK%i|-+Ft|r^u+K6 z6az0>Gn1mw6vy9_NAOVM=ceP)e(%ENRDQ8Hj4E3WbWs4ig&A z@J?^}t}V1GYgnI@Nd)UZ4d+l<8{@;jcid{4Mm#|OVWl{L>$Rzuj?63z!N2Ze!7qJfC`6QxSW*PyqDd=K;Uf~XW!K3qkj;1RU3fDH4t zdh}HSvhBI8@^xU*q7joTPgyIi*|c4#X(smlD*Q*|o7b8X zV~09&i2*C?cdV}e0isi_ve$rHkM%&cz~a;VPZ(XnQjN15t*m~`k`RRpjIzr z89oBknyy0?vUd=QD9g}2I5=L!3xMj~%flH%mvWA3K5J^k- z);ZH~v*e7N1rF_zkt`XAAFH%cIB{ivU zdz>EMM;tiA-c^e74u(F7PgGoZ2zg?{6Y-c3PJmJJmR)pZF-z21`|Okrj*O03hoNjx z?y>GGvSOg|0I)N@**r*v64O8irFpX*R60G~#|*WYDipsKx#^k~=!O6GN*C#zdJBVO zni@$3%&;J5n1-<6*_xE)2V1+J)ZGqaa)r|8a?&pcuSO11j~4DWzDZgZ>7YuODT!0H zbQ%U_QKA8IhGePWBvfI*0Jm_+{t?Y$oD*LHQwZcLBmuh`M3G|U)Iq9oab)zvU0{{y zhcSj*g|+i~_Qf24R}vWz7XKA7t8vPPHTC9vE2(f%4YiYVJizFef5({QD1PQVGrdR>2c9oO*;g{&a6h_&cv8V7(wHI3P%vc)2oP-=`fHN zxQ7xfL#G+*&0Iw6IT>QHtp&!+JknLYLebsblv#a31bu505uB3__wfZZ*G(?t#gib5 zWg_RRgsV611Qz*8mk0#JL&Zx@ANa%S)Gaq1*|QI?1aV7dJEXn*VjeV3eu6im<01_E zq;!$RCHwp>5a_}seY{+kbf4uJ{s-F5&4j?-@IsErVVJ(YOtrJTJA8+wmIL*)`*pSZ zM;qP^Dq^`(PVW<*P(e&{=Sjpr-9zda^SfN^V;Uib;1l7yga|`p@y7ktcqCIo^5J=Z)b$hkFa7`EKke z<3xtQ^lLsYNg6w+`MBgws7GT}A@p~5XX}4?zq${`?JA$7jvRBnn-(;&u;}g*{o0i> ziG@5kCdoGm6YmkTktH9v9umT>ZN0v|;>WU1O~V(|iNOP>O8IF{CPUA@v~~$z^BQ+; zPYjFGqHk9$L2QiKKqe!;kZ<`nox~X`6U)jgIQ|B1E&)VK?}uKBZim$4U5ApD@Ne0h zGy8u);T&CFy_NEWfV$r!NNWiuma+SLnOkHU+HFqepgK;$`!ce^hdgX38Fu^65+8(O zEb@Z&l!uLSNBsRM#2A(Zih@V^`$=F)m8w$Y;+*wVQ%GpF|M*Ym!&G=&GWGiAt8VT@ zxD=QiS`{sU2Vk1y6l5&7m%WwG!O75m!}cvlt^`IT%(zKHW7S)tN(EYfoCfW(bpP{r zSi9NFfrPYn@AxL%pfx;a5&X9JlU|IuCjPDJtqJfsS%afT^(}y3%~Pgv#8z)}GX2wt zN%LHNz*O@&3g{;oB@HbxY6u{aydHsynw@qG!v8!EtSUcN|D;C1f2ZwnlsYywJi)8i z0ocC_%?QWz?nHpqtu7h4V==P~g|}*-;R`_2W6$Vi{M&!U;PmrD{?rL&&RJ^#uoS3( zQDANisrjtV-u0IfW4QUQDDtw`7|whcAlecviq`f>i|dEg0d{8`%`J1nHMs{m+{$8l z61&+p9@C+RI(*MN$8-A~Her?^J+=0H9CYecs zP1PEF_B$5w39s`{Sx?5RXA_E98sRsyo1}`kXk*J$#)yLmtYZwEDG@3hN0Bo9dCdiv zPb4-zgmG6bto}D4iGnc4=%eR`ne)<)+Ilw=Xuq$kMADgul-7SEfA_kcz5b8oD_pUy z?#J6~aEYLg;xDRSo{Edk@nosbES>k83rN(;w>EBiaL3ov;!AjWJuVNAvry0|qy3 zJpE580mgcZ+sUgvsxhQpG90D4G|uZ+gA+|1V|G|ep-lM$+;95UKW-e$jsuH2uPbOk zPNbbKHBud>((vb&;!zk3_1|dE5kX$Xse``8?Cva~l!m{<@27v+4^J`9u0(TX#Ho(Q z#9G#TZuP6_L|lTFJ6Y+(5-+_XFj)U}4`&&O%6Wv> zm_pk|vHH@6G(64;B$1{2a77s`#s8W-a#Ku+lfAI1iDpKQAhls&?Mxugz{qdwe;cxI zN3Si_{6$6>gR*-Sd6WRMuv4kaV=jt%-%t-odZ>>;F-g%%SGY|VlraL*{$XQD3Xt6B7I8~FJ!Ww?_Yq6fYBGagcLdH*gZgK_*hUbV;jfVczrSoF<~9wlMJk=TcgdzE(RO;a$AdiaaPgC&_ZZvHxr7V zH{Np81NJj`JY$0`5}qd1sE;Vye9~phM{SO0@LG**MuZsx(qK?^(@X{qiB=Cu3^cAR zBn5x{()YPr>P`DJ|He^jYHIq(Q9NJ)3Ci;NcGdUp1X=9`WzMuCvGFGF!UK#ZH z_U9JOHOrWK9Q_a!%pE115TIS$MYa78<;ed2#BG`|50Cxk{QA`A$_F{nUN(y>suyi0YER80Q2CLN2@t^31k>-%-B+thyEcV}#$2PMn{g z2lXb;O1+>f3yl1(WHw$(ZH?grBD^J~kvyFQw!~62XVqeGYUTIK1{KT>hdM!U&lU6F z$6SJ>OrJ&3t^b!;j-Y?&v(Fd~UbPo#&xGCLIOm-3IhtURNlVDvQRjiDiK3yIm3_D( zm+^RW*{umAxzDH5vEA@XbuY>kPKwOdL2s|{u^t>$*_e0)_RakdUH!f`O0bWF25QT6 z&OTG@?B2UnN$@335{bqljS>!LsZ1jY_LYBA{vT)l>*p)jWq5@_jj*}% zg2_srhG4}R`U5Bs(jy~Q=kWiQ6%LiK?q5C?(uh(X`@0qqq{_c^X&tIvIjFw+ce!k| zjK;o0A;frSAiOkp`@wZsH)uv%G_gDYE%MtjrT)Js_$gj)p+1G`{6A8@&-5#pJzeep zCH$)b-hS!*zrn5_%i{l!u@9^C|HII^z28G7;ums3qZo%-`%O^PD^yn{&1^V&VSCK= z9)guE=pQDG61~bR}^Pj9lF=V-=4l7`VOszmNrLmzbLx*jh8PdVa9%Q{LY5feqPYH zDVoi%)uoG@C8xPc*blCp+jtz}@cQGwO8CEAfH%IQ5fe+J8)8I-$`mN~#>Q=DUYSd~ z!G)!9;#lNLb#Z{H6vP5BLiY=c9sw(dIP_dWs;}4z5T0A~@FjLq*+cZL1fJfjsF^TxgQUUI zojp}ski?S5xtaff?^5oQC(@$EqH2Wa?l1h9WpidbU0^1bhzxjlWBktI?s4)C&YPyu zb0Ne`B#o03;$Ur;u)j4uyaYXDB0)5XA~R#$_z^NF=bgMP9e6@fmEPJ*?q24N>zo;V zAW__;Xnm0|vAI$(!~J||EA)s{k+Ubva4jGbKjZly7l2|HTk7EZl<%a=Z^36=JV`sW zqJ-e#6g%eH`ncN+znzb&$tq%^9c!Aw=Y z>PAkf-|)sOWW8!evl2+XlC=G4LC+JH`OdCv3Iom!*GE4(O^U!#v3? z;IKMEEcx#sZ*G|PmuTW;VU{4_@5X<#es9X}8*8l`o%3lPt(ScR3pWHh1+G_yS~oXV zmRI^1|2JAYB*SY&Uw5^faBq7`U&-hBjLz}x*pxOON_f1()5>f-9+xmdf6B4;*^)M< z`n%AcWg4|UlhB}>1^2qp!V*(;zgOayKfIT6$|Q^?VG;>NAP0%}WmltH{s{;C>UewB za?!p+p$Ez-z?dMtlLNwOXX#zJ?9$l9U4G$CH+0J*3c>casTK8~#6S;Jw0@W)OFa@E z_uyn5%(go4dR<0^7b5c>=cG@{s5SW8MA%92gMpjUm>z{CARfxspNnr*#OxM%_x**9 znIg379+4ANi05^tgBSLjh|@iKQ|P>%bp_<=(cQ(#L`eL4W%prEB`tjEnU8%eUzB18 z{_F4TH3arCVJihTj{eW*0y(sy*Or@1L<(H8m>#u@#*c) z+Gbgknr|=-43Vwbc1yu0z30`N(wn3|iO#+IW)(b$>Yg0u>FL;YE5h<=pYqWb);Nw8 z&1w2nyzu|>+B=h5av*K2sJt&Cg+fj*NpKr!Uw(_UFI**bP7OgwN3& zJSfBEDB$R9mL+3^W7v`{5%64DJz7!8P_yW8YU#?>qg45bG&(V2CU^kqGu3Xe$!OMsB zsO_RiePDM{-8>k`-95H{u0U<5({eFX9-|VLav>&HgR0vxyj;wUf$=%z;T#a)T^npS zjATnM--IBi zwIA4yDXvc*WC&Mn5@RbaX&wxbu9awK{gi;zemk>fn$Mr9^K{1Xrx|p6=?6}2j~;X- zVx+(6k#{YT`BHeZ%9(42wfviHx>fTzyKIQf%p+@J9B-KmCMiohZHv*gmsthw_6WE~ z1fy?yS)Si05z)pOZA~9w6ae_;u(?&q^S5PYSel|M9}rbq_Zfp%-%}f3c~***mKImW zDx`uq+r{ukI?KI^zUC%;%>(b?Wrgj42;Pj0wIyjR>i7qWWg+E@z~vA_ubjrs1z7uo}1LN1Hh>S1^!3y-F3u z3oy?>AD=tr_FL|&Ww5O)%?w^HUGsqg-?nDg(rGzMe#D1MoS}8?pk9aWL<7FK(4nIecfqZH(q#;I4bFe*#8E*bYeaG18Js91kY+Mc^m`N8VoV3a3Z;rFtZ8p-JpP&T))0pj zv87@X(^AKuH;fTc(=|xoV$lSNrNM*dJLW~}(vcEkVnHK$lJ-i44C7>}jI6vAEH{cO z!0;E!U7yU)b!WO`Tuqf1=Ow)XLk=MU884@x-@kQD_^C(>MNhEvEFal+eb&P_i%N*7 zLGZoSC6@$+nNkKWfS&i8mY!#d9^Gn1)Z8KN^tv2q+N@0k=DQcwS(Z`GtDPg})cAhy zNTa=X7*BU(=gsskqn%9Y@L00qE)pQSQ0CZ(Hpt@BfN z>q(n6@y(JBnM)}FrN4g<<=(|#`3CPD$aiU=8j;kEltyCzNsg(t+?G8kXZ3OK6?;r2 zbhhl=6|iSNm!D&u$N}5_uuT0F=B-r4fivTu*rM43Fn@W@D>7u0mn;1l2?I9e5qh5) zN@-lF)OxUAzWxMnR#t)YyTIk_FSqj6%~m-*H`3AeXFF9RV-?)=3Gev)l6*^*%}Ryf zK(UL0Qefp<8rhUj7RX=zl|=e;F*B>XZA@KB2pli_9gF7)(!N}fwA|Wol1VC6Yb0-# zpZW9Q*{NGwymj!8PO_v-(Or6z*b@#?&)No+nipG%0MEvzM|ro@@eE_T@9ON)GULZN z!yV}a%rS?;qE+ksg-yO%H92^vj+o_RnKdpmp=YM?dxmGLw5&pi2y}!9oF#yc5Y371 zbuj?p(|MyZOOxie{jTI>IVV6p7bI0ZJdN?Ys*5|szQTs}*9gTFKc(l6FgGTCtI{Gkn}VIQQekvB@^{l;0t3eudM*-Cu$d zmd-g~ZwIW)XDH0-C^V}V^YASzI8O5M%tH;f&Iluoy1{8WuQl%l?W?&xzsi`dHPPVr#6bFkfPiSVu@3Ks3o99RU_m zswtN0)>goB!WOa<(c#u#z3yodRt}`B>0gyNZfBGcKwuGGFmJ`KPfup=vvv{dWz}F^ zLsBO;Bv}`VdDw7=e_1m23t14(vLo5dWY1N&xOgQMBl+Nte@cw9>;j|4 zp|A4@fBoGOADq9%xocl6nCL8Ky58)k-55r z;hY|Q|4Y>GALTDPvTR)+xZZzc zKPTTFqTOM@P;isBb)r(0f9P(;0Iy;0O|5 zTI9yvNmkO?-Axz(?s^OZgA5GRVBMU;f8{cBlM8Gnb5Bn0_R!baNu6So+08{R&rGvG zgnUOmb9i*Xksi*c)5Qkz>MDj2+*d1o_*DO07^>o8mZVdZr_>Wwl_{d znL-#!Vd=8c-PuB;?j9+g_vy6=qzNr=GCvk%_%%0ncMV-0*oc5oV@1{Jz+Tv7GqA~x z#q^V-CoA%SqosugZHCm+Jn86*_@XOi%&w6R-D7g2n^LWwj(maC#63a=h_*JOv^r30 zOz3oJTDtmZG^Qx6-{kiEB$FFSg61d@#Tw36nrPh9M_1cbw#<;A2#Or>wE(`UWkjQl zU7aPL_A%iVX=paHSEI*dQR41uM6&fWSP%KR08>|HxIYikTncMkLho~P!sB62Pgg~D z0Tc>QYEh&Y5d2q}n4jWaUZ5zt*&G_dVK>q0&Z1qJB)C=2a=M4kwr(toBFrU#7HTbZ zv{@z6OZV6c28iso3iA>~{DdNu7fFD%$%d}gfGRQ1%EBBI)0=GOD&8%X2FxDJRu{FV z3@Obr;Yfg)&oy6~jF=;qErQB~Qdx`9Y^Hm-6Kin=F&1JvYeH*Ppv&h7Z5EM|8Du#? z;9h`0z|YJ~<;fxCCRJ=F)zOO8GkQTc4c%Io;Oz zY?{dACB~9NnA%(D-!sJFQ+AAXy*yJ2*E=woi;Nmf2s8IsxO0ysUyj(Wjns2sYewI^ zpT2r4_QDFW&AY72*Xb@Bi1!j#JT}dRbR1)nvNOQN6p(ZDu{uV5XB5O-ATAK`5v{o7vMNDcX zB{_paDbacGWxABDv^ZT1w8T*qj4VcVv=}^SbSqRBQB|IWy6@;44CgYaBcJlo>>WP2 zxr~qzQ31PgVyar|F&^lq!JZ@e*&H*!nSADuX)qfYaG22xNw$P63&@CUlFY@}NEVT5 zwOCaeJUm>8lnN51jE{volU(}EBq<;lim>EeVZGgmBo(llb+o?JPE)H2T{OVV9f^P+ zAO}n`v(-p;shvXujntYPv=DotipvJ?5}*2Kemf5vF`%ZvWH82Ha}5JV8|_LJVIWzF zNHS_Q7&SYO{2Qfp_C))on-d%d2Xd4oDJe!oMYABMqUX4ZSz;~K_h zOJPthBI-u4Sv)w@Ay#K52nGVXti$4?V`p2c+tb0GBb_*+A92^a^k_Sl3Ls_336N3O z;6CW2z98Z%e!ib1MVYO%L_wuQp{c{{c5(6>Z_*-vLTupzYa2GS4h1?PO>(tBHnK@t zwaJz1X0#eLE|;tPn}P!CYMQLng2|!9(h90=w^Ck!_&j&-&G64xeC2ED6a`g;*xSw2 zxOCV$K((6?uUr!Do@e~-7XHQ~eD8l9rn~Pj@An@pOX0uzgge0)VlK^=yrTwn4h$AO z`*rKwj&3n~XA>d!yNa1opwgN!SY6aOq3GOC{lG~MG$_%oPct)n8Lt4*=gvuW#}Ih#Yu?oMWXGJcXV zKj(k;>{JSc8kNpY``|umU1#Vr%cz65h%Daaw(&jonlv=%t)NgnJEJc^r87{|;AZrl zUV3UJSoJb}TOhCj)K(HHHK;AM*bfb|&t>CGJ;=FLZrzV@H)P~Jj}eVZjg|5NiAuE* zYi%2c2j9bGbyH6WY56Quu{~^=2Jo0HC^h=0-&B<?8f*sg&{{Y!UP)@h(7F z`3#Ya+~DIM&!a0P$fqHm0Yx~;!fKRMyPFo1jUy%vV+R{Cy9G4sKF-gG%L|(`eE)_`wCcBe^@BJl%ZFM~Ch9Obs zm-*qHHHt!v#v^s?8C6ltMJR~rFIPcT{^(JU-x(uV%3*N7#F0a_v<~#MZ{{kAdoeb4 zp#+JA0%=*Mkk6AZ77;1$gnAlLLByAq5Y^UTVSd5P-K0`enWd7dIIAs7o;bF( zSY{CznMKV`1KrT4_vNfT7Y(A3kPOJ4EI!X=pYE@}^PcZ}&wJkO(AZN;t-8kS&@>D4 z8|+%bnu=D)ke9`s&&3p?m|}4&4B@JAQwLx)VKiBBW5CAFjn`|nQtNbJF&_Gs{$w)WRPQox5~LoPmNh}@+RYvBz4U`+8cUlu(%0$s%UX% ziQm{HwepZgw>ZJyNoW5VPM_+a*SgH|%p^DOEE0-9s@&qpCXm+Vm@{t>x0gK`DoL`N zYY4K8NSRXF7dDIrBNnp}#0}EI6tj;s!Bdg5F=8`mRsshayoA93CM!0h2{$}=%C;B{ z_?-^CR?F_iR@6W(Am(K zS(1m4;SOG$uA_85(@Tp>Kn@M_#d3tz)I+AADnn+S*z_t;t9xCl7Y)(7Pok2QI zY1mW^*i2G7SUAcOGn)ci^GGz zbAbNS=NRnpV-0`8%+xTSF0K=yB&VXLv7XD5(i99z9@E`n)<#D7Y$`+quveX=!Ry2< z3B;u+^Th-;qKvBAPzn;GBNL1ahnSj81AeMb+VMGL3b7@`!hsin&NmEmNLT@5j_bdx zz~(ti!)vv)^_rOy;2=9tNatDFNRe+bVz%3Gx~v%UGCb0xu2jL1Rf@z4d8E7@fAARX zEyrjF5Z8$>e!-oO?lZS`@CB?Di%61!V)S5hR}plX5iF3BOVus`r-z`=fkn+Dt0EGm zEC!55j7Ad{z=Q>iPMl5~4yy^n6aNvwg2~{(X|rI{M5JtzsHT>}kPku_FtU&N=Ou;l z#Z7u@tLP1M)9R_C*6pFv5MkJI1r+U^YbjmP7aFW&**MFpim|Jo;KeuTZ4ik3@*{5k=X-nzWbLOp z((w|$V=g?8o6oLuG2`%9uoy+elteNL>eD$G0LW(~#&67V-IwQbbkAvczvLcXO21%Lrdh!ji_RgqFSVAFk!No zuv)<&^Mof|3nsH2r`v+XsG`XdnVg8CmU?T!GU>u5(L^5Ey1?{Ii2of~CMN=xX3VZ2 zRc;H0^d`xT<+63MRl(=5VRzav8;WRB4!Q8?bu`%=c8zlOStf5?WhAt= zt0GxaRF*fAY^LMnEio28{ESd&nPo~cY<7AG`fONon`{;qnNyS0r}G?5q_M<8{9!0W zXh{I08*D*b?izfSJlWV1`Lu3C={%W|)4^qd!A9JzZYq^5;aCyrpkBGG2Mc-MN z8iGu^4TtqCea)5ll$(U_zsGc;W@@$yxdADD$tu?b!LIZ`^yKajMBs`nb2*c$J4-oeT7(Pg0VXx*0SOOnr)V$rlMveo_Bp9(li2khsKps(zP9&3iHO-XLU*oHY3Rq)GQjbdi}=#% z2g%{68S;q@W=Cd-9CY;PJZl>_x$b|Cet$ciFI?e`dPr}{ywkkE+RQXVqwB2a4$|Os zXZ~_7&id#oF@GOQhaY!*gk*e^Y2hjAiEJ)t?&U~dAE&w-2o&P99*1+*;MNy3lzf83 z+z1PiH0x3+Y|#>^puxRUfM9idsB1Q14$m_C`CXPWIZ{RmM?@rVsKaX&@v+XRkRZNM zpek+P^*TFFA&syVM#-)u36Dn*0xrDWr#N-RM9oiNtin3c)aOSCti z=k!GbiuVp}$*y+OD)6QqdO6$OOZQ7Yighs{ zNNZCb)ABWLjw}*d$)e;;2;(0!WIv0er-|deukw;NNnOkZokwWOhgrHd&geph@YhiR zs`FRH)(ePBas0^e2%{hWmJg;OcHoqu6;kmu*MDI`eft!zT^ZowD_fy5WMGpJD#KF? zM2WDHjA9iGyx8+1{mllt9)wNIm<$>YbCj{)z0V)lB8=o@q;4qg0g>jvQfX{sfng zg0#57!rbyBPyGR}nYL;ZaymiM;>J)jz>BYJAKkvDMea#6ET{HsL@B6hj!Z%zq2x$s zRn$U;Tq=R!Op{hr@?s7{Naek#bP%iZF)~UC- z)LIG(Y|DJ2Jbd}k_z%J#PZarf6Td8RqXSQ5md#|8<^723aoAnZc^Y?3fGTnn?5(t( zXr=YUj+_heMHa8mpybnR=G@fwzrg99W(MoZn{I6Fog2dp|KQJ&%~mmqJNGh|Elu+xI%L_B7MqYv-&wMKWU`wfXS)IaFCLNC<$O$sr@-Js)l6X4C zFU%g4fgo2pf?R4X8}ps_`7|8m^IbnGg#*QWibQOa&74T`5&7GJAU?B?8gr6N0xYgp zY6e<)px(3s?(aVIr|RxZ~v0_Z$mT*u$5w= zsYDE~@#FsUbPZbQ+TLsLjB@*zf8aJ8pm&zeHx%a@C#4Om1<$H*mPZ00~YRKlnU z@KI6ip|aY66}G})ML;6I87IA2AW19zZ@$L)*ShG4{x_rJ5qA3R)l*s1#ihS}mYU2M z8^hQ5_dm>&D!TDhRNztt63HyFFN=xTyjWco)K}TDn~e{`aiwN-N!DUHBt@fC?CQi@ z<)gyy!EOYjp@^oc6fzPfD;SL`*>IG!)QGETknjHETeO>p5ofNJ+}CL+Y6``IKrFG3 zx$Og+*N>~BiYhy3Sz*uX;;N{|TUCwQ0;WgejfcIaHq2HR)%8_awFGJ*K~%2B>#|Z| zEy+Q$d%;&hl_^Uik!EwNe5o{NKUH?a?(%<4LJ@NaYnx;(Zi=1?8l5UqB1tA)z#3@8 zVUjS28P;M}oD~i#Dh#N?8p*6gN;ZSD8o$qp-($tVmJzj=%v}{&%f?R%DRO+7Ayo-n z;*Ia0=Jjtmkgxw6S8vU6ZR#nmqsaok0M#A`)sDSV^^0gqfr79`A}f(mtvLPl_*`~8 z)?IE{cJ@xGA)<;4i`7e@(T&3-q2|+sqe&#I2dlS|Mz!j(zcNu*3Z+Oc;%kXD+xq5T@(d#HF2lV>wtShI@jJ3Sm$79y2 z$zsJ9XvAaDFv?r!D61IFJF;?{B&1B3c*;OVe%$!m=UcY-P3|rIV8xh^lYc6`w>RbU zEWf6EuG{_UtH-XZFW>Kb&u6RIW;jYplFK~Zk6B~#Lq5wr=kvHRVYj|@V>cF2G7r!B zarcq()73yLkd7tF_W0iGyws?6doPrY;i`DBUu-4=d+#+Jokv+*+$m=^G&eW@Kfj*b z1DxiSzk89_zEzF&?!WNf9~XIdJL}rlM}5~t{^5tu)1usDWAq*V^*0g1vBOn&e6<`U zuw_KG$X7{>{EVM`u+=9@=PwqUtCr^8@ALA7I(m*o`Q(58gW;(Np>JqT>CqRy%izo3 z;w|qOSKt4LpZ$J6B@sG0Iy&DB%8jT)b$NL@N);1o(THp?V7FJ`smM{Y-7xLQQL2x( zP-D*_udX}@N$BW&l^9KCY%UKriy41y9p~QYpxrGXhQ8oNsKClM)PT~_(b3V_KYs!v zDg)eRH0&im`w~BB{}Hbr)j0d+)?u3$qoIIp;iugA^b7tl1aZCJna)>?tFoHGH-Es1 z);c;Wz~{>|_t7vzS8tQn7o3icj*iYg_!AgWDj<+pyvy{53Li9ksI=|w?4yct(o3In zZ}u?F?!Hb^UHcl-Pv6Z_M@L8Jua-YSPLz(0j*gCwj?P~upfj*gCwj*gDbA<&H|9UUDV9UUE=L!cW` vIyyQ!IyyQ!hd?)?baZrdbaZrd4#EEcF)q7&0eqP)00000NkvXXu0mjfN~++R literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142222974.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142222974.png" new file mode 100644 index 0000000000000000000000000000000000000000..a86d477ca1e37b83c224ba507a36ac4bb843f60e GIT binary patch literal 4660 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142241006.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142241006.png" new file mode 100644 index 0000000000000000000000000000000000000000..3bfaaacfc7950a163061374ab9e3952a44734d06 GIT binary patch literal 3541 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 P00000NkvXXu0mjfUBljA literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142314782.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814142314782.png" new file mode 100644 index 0000000000000000000000000000000000000000..d37ad3e725838496be8b185f0009006c826c6ec1 GIT binary patch literal 4001 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 NPD)v_>YZuu{{rA1!Sw(D literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814143203487.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814143203487.png" new file mode 100644 index 0000000000000000000000000000000000000000..0f847808ac13ef9d9015e9f3d8d3a668827d42aa GIT binary patch literal 15011 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

%A^%HYIJSojp!>D!(gAH#2Y1DX*+2h!@jRMPNS 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 DO#yzn literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151409352.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151409352.png" new file mode 100644 index 0000000000000000000000000000000000000000..c457cfb56c9728ec4251c436d73c9b5bc8f47688 GIT binary patch literal 2977 zcmV;S3tsezP) zPiPxg8o+;DdT|9YIE03plwx_oQV#}ag-@XqT@1sfizoPy<`zaL#~0hHQ>jq#$;7!x zJxTPI<{+v-vJCj5OzFvJYtW%iU?UL-E?z=RT~Ko>yN8*PW=11vB-wGCe!r8g(R=TE z|GxKq?>)`;-p3z*{67Ri5QKsF%V`TB2!e1HdH=Kp5KbDMoS_l5|7-4SvXnJXRU$!n z7ZBxXqhv~?=Ofe~sH_xDTbkoT&uc^*Wz^fnoo%Xb-Q&v~- zNRZ4@T2BxeP&PeppiQ|y>5=zQmCYL&+)IU5F2MJlj{Hxe?S?`jdq2%YWr*?V=_>}V zlc!DmZR)hOJAo&EOYX$@aAm*Ei1M^MH~zFroy2JibId4QIuG^AF%Q;cmeS%ys&`Z} z6T5DO_v3mom@7c_67A8f8?q*h-tu>zHl@ z7_dk===n5>S7p>2MI0|EblGn?oyyar2vz1q|TxDTBZYeUdEMM40y-`HZ8zV1Q-m?t8`nOXu%feKX>Ydg|;QO5g(lb|4Fwgt~1JWuPH zo;R#j+PwmeCrGc?DXS{QWR}wU0@-AdOhqAkU*qD=CTiBC>k8I`$b6cGolVr+rY&a< zz0iNMn?LTcJRkR1Ak!CIlO(%z43nk1HN%uf+F7}iSxW26WRqr(!F>#6`(3HlglkVo zC9~|Z2nH(EXU$rD8wHvlDOd`-$=;7GN0^)~%S03?WLP?ex_2dcmH2p_?E;vo1JcR% zL@n0pXp0&~o&eX;Rt)oLN*RW-jCzg*ztx+{VJw!&)|YJSy?cKYZ>tnXaoauU%uY4g zE58BN6`de*w8vwQG zdq)v#!lbT~7_YP48jvQLLY3y!EP7Z;8|C(ZF4U-VkxR)C=_(nv8xi7H6#E06*(tXy zqo8wrK0^IL4<&x&T43C5a*}0NGAyYos#>OwW#Oo*it3-#gS3B;1bG9)NE3g$$>vUz z$OZRkP{`glFboYIsFWLU@gt>cUc<|v5k0E%y<^>7i4$qmta=t|)W@xb6R@l(wM>0V z!!QgCBj>5VnO#D?Q-%4o_56O8@DleL3(nm7zWuDQLfJDe8M!~q>=LRPY;`J`l3izw zXk&Z0#XFg0c|JnD;&ai*6Qm6zuuYwGCBs_4%W66N+pUg9E6 z_UeO4ZYhxv%DY#+hAi8`%q}sVH_!|Njet{l{~?2KUn{z3Sf0df+a=DYX})|0Oal=T z>uF1A+pcu>J{;7J$<~PlJhQ@-+b%!D=YSEV2Kr>2Qa=W<|$1=9P zBO}LjnC*-Z{n2f1L5Ths5!2;iDVY++{Yzc*2zEBTmT$%DNp$Q%yS-7c#xw`i zPSX2$L%5XZGY*enqT4s?hct;lvfWtjAXt0OK6lk~$l%7>GfTX3 zc>=a8?aS7hc4C{nN_-q5u6;oO&Ij+Y6>pcBHMI63?7<{cxJqd~ zZdpnFCVPnf@GhEGoAJ^uPmlgMMy#!@L0o71yrNOIx83^Z4cI#4B71jSi%)cd$gvwz zr-RFFH+lTDNpvy5?8Z7IU}w{I{{mdVUKDE7iL#J!T$BJehPFGaWJdKWk5e|3} zO733$;k3#1_T1{&%5oFbA0{teL3FmeV{f_UrB=Il!#eP*b?%b~ZdJGxXW#P)g>1@| zx4li(ZWDXnk9a8ew(y?+=b8Q!!It|Fbf3%ZMmneMU0ng+X}iBO+-_o{Oc~8{+TQDK zUMOt&>F1t0H5=f*r~huC=d|6ExBo=jy(Q43`e2Xv;$WxkUCXwflC$?5y>;o_iWvC* zou_V{C-t5_>$q9r8V3WGujdWx>P*0Q-8VE`lGs<#{>9$R-@SGA+)oXXEBp-vk9=MF z!#j@MWryvL-amNgcG})Ce}eMvayK^chK;LUUG+t~bWh#hr5|Z@D9>&L4a{Bx`8esg z(sNemyPybya8?QV+je_@#)Ho66!sy3APB;ri;%xCayHM?7)HAF>APft3xXgFLTI;L z5ClPJBd??r1VI>r_dodHgVUBl5QGzAYO2Sbzf+{qXq>hPBO{ilAPB+`y#M>}zn``Y zf*_m_fBf;sX^RlZyP$W(@)QI?7y@}2@;i@&;ShwAK$NGAgy9&FQNnQaN!tqv!!gA8 z{Ct(I&nDad@0+aMeH1$Rwbd;YCwcP;_r5B!8#?bf^sjFci*$Q_b`j+%VK@e7q%a&h zxkXy9DCs_WAPL-Cn6IK3_$_WNqzHEA7qIYwS7-uutCC zR&Nsf)nx6fN5C~!w-h#R?Q{K~PmZ;Ur-6jwkT4uh$~O~+qf%t09oM1trvFf{eG5Rs za10uTW0(K_dXrDWR_Nhf)?8_KpKHWE`H(rFQ}z1tzN|Ap`I;x+IhN)l%%A7E`Nsej zz&Q!SAz?Tq4993;IGp!C4jC2#3B%#0R~U}DTN`X`ZLzhbFuA`&@u$x3^yRXS_URb= z|1Ns0&c1nH*4fzFV(T+7*G%@AkT4t)hC{+|j1q=J&!ZawLXVTp1k*e<24gJ|L!iW^YzJdj5U9g zFdPzwL&9(X1Bc;gE6%~*(%u&d!x1VB$F5&MUe=N$UqCVBmQ_ss8if`s9aFdPnVDhx;9I0|3Bgy9%03`Z;$WA4_5eNbZ) zqzEtTY|a%qFdQd|gy9fQnOH1# z+9CwZCtjzkdBcQla6T zT9m$ZXgHJLnn~9+*t?XkZ3oRBV(ng_e;jP}K2J`wi(9*+^TB4j5>hDsyZn{@rxWac zm0{b$b*<>C{|k(mLJ?y2T#UlHQjd||;#s!3n!~VNA-ASj>B)BaBfUqaP$(4tPX2uE z4k#1~#bZ&1OrcP`c$6ViC=@RqWyll?#fwK7GKE6%;!%d|H%7CExIOc^yP;5Qoeby5 zet$H3h;^95JJ)ITpSw5zUBY=-;4?jGV2@+J!a235?5rvi2epgR6?smV+P|OvYYr@% zJ(v3J1J0Z!&#`44Q=O5vP}w@vg_#-Q27I=p$lgR|RWY}1g8x!H5EdM1-pZ^CFe%@S89 zx{zLy*c&fQ5|c;W7(*+Y)`#Ko=^o$OBQIcfF~>&?~j4ia3$ zJ|;ibY4lCH?!ydOQZ7;7nqA!TjLvO6DqoVP{OVQBVc5=dky_C<$u#(dbQ(S`v(T$q zRacbd$2zleSU=(Y#Ma5OXS7x(S?QlKtyz>LgQdMIk^AR@!564Et7uF_ziU-WJ3d!m zR;!R%F2a2DI3u<}KbAbB*!o{zHzuos^!7}$e$YNYc~ju})`#7+1DareklO0c@Q#Y) zi@;div;JzGho|AxiujkENT!3)lzO{FwFZ;%QiZLsoFi*?agX+xp6KYh_>(8;_>ib< zG)F9cSTHHht$x{j`Qm{P&Yki*FxTGVfY`sW_Sqb_M`Prh8? z?+C$$9PH-szkOx`Oq|A}LP@a*Zy4zdnZ?>G7{XWuGU4zzkjdjQd$LS*^yFeI7?I36 zmp;XsgBJDsJ@ob1d>q?ato`DV8`U4pb5x8#;x&h%yiU$iSMvJqavU>M2Nq`Ri>#A!r2 z<;(N=pm&QU`8)w)(}3!!i|dNN#h4Dr$2JZjgB&?w2!9a?Ll#=sPl=pEQ2MS!?*59; zLD^vD!A_oo*spx1CxJH+EUJ7FXuhYi<8cv9`UJZ_#V?do86yDZqs5}>&+yn|KaD{c z+g!|ZVn+wSq+F2u@)%6sALj7RH+WF8v6p4?MC9I7(bg48G7|=UF<%p>CC&4M&)`+DAjI1>|+oKVy1dq}-G%C;$I2H2XNdc4}2hJ07z>z<^n7ZYS6ubUK$% zX(yEq=(i#RBa|}TW*GEjvwqlhiuY5_B7;4kb?znRNABwb7~3>r##5r%4aQ_qLGDL3 z%$^Y&$H8t63Z=!ScQS=Ti*9UgHJnoy*EQf=805XbA2H61Btpvr@;h+zW3_@$e%xRk zE?mZyZn|XXVlHbFxWD82NxPqmxxew3cH;@h!OX*`1tCbYOmRM=mHIx35DY0ys_nCf z&y|<0=VFpm7}B4O>tl!gQwz&=vB(&{t$NXU9{)*fSMRsbgSO4x9JxaL0|KIV0b`p+ zv5R};;vSJb`Mgt!#*`eh_O3*3ezAIPgKHC~5rmqK_|QS`K=N(|v~=-rv*%*CL-v;* z7_4HmegN>#_YGql&^pxp)W9-H> zS1#r59`?RygpW#uY9=Z9Un|>y>u?V@u z&al2Y;r`0r-_H;sNWN%Ne)Vv-dtJMgrn5f0lL*74nSB3X@h|cV4`lqEn~YT=gIaSq zPCmrhz+mQ)%aH54zV$QqY#l;L z?J!<#yeB`FXY2ab-<&F_ISiBG@(M(lo79gm{9Dc+E{xc+XFB*h-5gC);%83(xK}np2$Qy`heDXc@c`tM~vnM zb-9UxvhI@FCO*v3xz`Q;!!V+D>C!; z?c1%j{q^hDt+lQAeNi5nLZNu^C_|=DC|*4O2W39q6Z*tR>i_@%07*qoM6N<$g132@ Ay8r+H literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151440881.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151440881.png" new file mode 100644 index 0000000000000000000000000000000000000000..b4341643e5df469e141cb01696032f6d8b2dfb2a GIT binary patch literal 10646 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

;z&TY;IFB`{qn8o)`FkF3lzyjAPvA3 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 G!u|_E-z>ZU literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151456351.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151456351.png" new file mode 100644 index 0000000000000000000000000000000000000000..c97eae964d1d7d5c7684fe7c5e3863c5222a9912 GIT binary patch literal 21475 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 XO4xYl)X@eY?}TWm=w2yMMnCu`ACP_u literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151522526.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814151522526.png" new file mode 100644 index 0000000000000000000000000000000000000000..f3b5d5f4a10364335c01953880baba2376c4c0b5 GIT binary patch literal 2539 zcmV zKWyS!7KgvL+G<@yVm4B=QeF{KL^M>0DiUD}Bx{=xrI_ASBpq^#+@f?a74#|4FwM$R ziX})>MN~8>#h7NKQKWf;l!9${i)({z446PBd6V;16O8Y_bA9hQ=bGRA_WSR@{|{kH zP*w`f-~Xrm7LMc~R(jD}6|!2ijTvLiN*V7q|Ocjn4p zvwhFUW*h8Edn_R^CJQ!W^_}^7;I%umGk*L7-lkg3!$yz8YpX7+)OuC8}RNs8ANIrnm|+Qu%yaP-9bM;&zC zt9y^4?W-He9jD-~L!T5UdEbRlyY$ew=BjOq@A}mI*I(HK`y^J_W7WMyyz#ElCxhAW zkG4VGwn=~QGl{s}XqaSvc=va34vMs^v1|7>dsZ$l=;BTt~uS2;(BbkY8&%t7}&l1 zpHVH7=<1v|4eEAgb%Aq)`USzobfL$j?jz8T;AesHUa*6PZQ>u7<-31qhhD=wFpA29 z^K8|#ZaA}xq)R|Ehm}tMZD^x^HrSyU}J7-yY#Pyx1NAPwdpjK2`tpKby1i33+2H>=E$V zB4}QsPygs~dtWAVv`-G`0Y;<1_)4dWMLQe1H*Zlmn9#qP*38Gd0_M>PIeM>VQxAHA zr8>56hu3v|HpqF4a+c|}&Iq-T`5(-k3}z+4jjp3#^_d(Lu=1b`Tx9RAwq!?Hj+Qkk ze0T5v#FyR*sOv(7gNe z>aF2h1ic;OLu99N$EiSvS_3DdGZXq(uJO9J3?JQrE}fCtak!Zptw*)lXL68^wU7ZY z>dcJZ9N@6Wet!8a0CcO|j5Jcm-o!RYANbp{0i`oC^!c!$EESgd#?lhl2U+T8?g*FPInn!$EG z+s?>aB)5yvP=`hzJ#Xtcg*Fv2Oy)siLl z@SZK7ZJU>L0`roM?V&c!MT^oF?2)%9XEmJenyHz*McY;$Y)9|Je|CQozHs=E#11@s zi|$_U+XH5H=0Zn?7XDSA9@Y15Sta0c%$Kb;-SaG%CBmoIf}ve&;84uFE_f+Tax~yF zc0J)RC4MM=xT~QZnAo-%_%;}ZiXO9WP$V8^{){?%^NikvU z{;Ox5bJ(yc+BQYzL#uFFB%BaWp4!R-zHmd$hRNjn7vK=k$W%<_wYVXwbqx=LEd@Xa zMfEVxwM&JxPInf54Ms%@zK~euSX*wJZHjiAeSi4at#aP=+H7Llbq?cr$xH2_SoCZ` z40~+EHteB1NbYLuMNT^z%!)%t*VP#2E!sRVSQUoQ``mAM__S?)3%@KKKEaxLGIJp( z1j0`5ba>&b9HCRx@Sys`uTh5%#lY$CvUj^;;kKVuVV~Etbxxn%woUG8-0Yg92f>7R zu>AQ`Satfh>h#tnG;ZPd+LoP0&c-dG>~$x3pkMQS3e-LKCP45seVzJ^hOJ)Ni1@Dm zjRIdwu&zx~_y1;i^smr(&Y#u?+qK^Nbkp|5vWLI!xb_IPG2ZELMBP!(&w_U=Bi{(| z^(*@N;=XM+%-;@ki{K)nCfKqGxlMA_HsyzkxF86^ zpOctBoAZ*y!IRF{=-LW`Agn{|a99uo;a5a{J1hvon?@EvK@i?FvIq)-@TQSPP!NPS zjVywKAiQa05!@-?qGd zJ80v|8i2oZxt)uE!$MfdDWVj?jVqHXptv!J+eAx>?d|3`>4I9J)}(W`vilTfmF6Ny z;}}jAT)8nR)@~M-z_Ni9uJ0{IkC80f@*|t`*_1 z{-uH4eUa+DJ!(z76V3lHp?`TAYx_b)Qg-NEl*o-;jI-=2rh4UJ?#cg|^X%t7jgK}x z=~BF2K;k=7&tI~BFNcnEZISP;Fh6}n+os1V>@WZ0a%(`;tF+~Rl>003+>ltGS7~}C z;Y_-3aO(7ucf2~vRi8q~x%Q|tWVGrdv^=@zA$R{2p;>n5ob1rQG%yT<#yylSnpA`9 zwIvjjP2E*}+<&RwqBPe?Z)04^u^rHgYyYwk=T$U~*>SY)P zh9op~yMwviry*Z|6GC%csx&>1;`ct2scSk;t-#P9OXFsQcGAHqr#vPF-L6x3X!!l* zGTJlg*#1a&ZBFIBGz{D^@Z+oB=Q_@{$McKODq0T36-&vtGkX0+{b_eTV7_%zm z|6$k3cMVQkRhnLD@dMM!c)tTYO% zPt?QjWbMaR9~v5EF>A5wd< zN^x&O|I#0U+6PKoBix`3U7K6e!z@n1eD)WMuUT%xf$m|q`b_qU znS>tzV>g;8tpOu;*v;ZjbZu_OISNOiIHI^G*JX9Ygcd@F=g7rNPUz81Fmc-q#({tl z7SQM>S|B~=mQg6=MLpe6$n>zgqnIEFDLd2;hJ2FBo&RhfN%08(F<%x-;CKSe#FC0cybW6JOS^ zzeFx_C#HhXaksQR7-5!=(dp5v71726&NG*jbfK0Fo(tH$c^;;G`8gR9@MBah*=1Vr?BJ8^mUeAU|uHxc4gN#><2OK zme*uI%L$3{E;~#Z&Iy#yT3aB5-u{(`>5unoY?26zZ-i^u%ZDq<4xJN?(M|dWscu)$ zo`-x+UfVPAw)-@Ub5UlkiM4TAu|9JI=NF!yAwTQ#=!pp$r3(-50)%i{!sYU{NH`!` zetNfUDJDDxlQg;Lle7kmPAVLiVZW#`8e|unQ!$_oGgAncA&+WwVJ2n4jw zeW916$JZYsgb*!kA*chv`1A}r4-Kho;l4kuy!)15)=qc%n8Ft1k_uznSDJ~hx6fRP zo;f3)*TZfd)43=J&t{Po*Zs=lMPcq&gvA~2Grr6936yG;rf1Qy`Dwy4ijS^vjLtV) zxNppuZ-F%)7s$PDk63^!$Nb;#z>mRNapsp`j;k(WJhNhlRa10KS`20(tpOu6Dq-v> z#dQfRNTgWD41_ze%r17D!8k`=t5V!v(GA%+^ZQ$bIyB6Aao}1LE8(JNdiI(GvBGfo z(+|Z6%Q}b^)}{DeWy$ec5iKu{Ajvzqm;I?2cSx;>#%zJE9~H>)$k$Bu7IUmrOLOmo zKKUS>JV=JGWP}lue8$%wpcQA2sBU-gyzD#T@_lKWN-{w_e`?2D5}LDwycqwKb?3{4 zXpZ{=cJQ_~h5-Ip^pnfv&R^&IgBaO~n@#&*@`oxRJ% ztN~8Cq(RG;u-4Lc?xQmE+|E%l^V>EZCWu_Pv|aTDry!(f%cmArBGzxymT|1?Ip_95 zGM<;LUU`_Le>c5Nq7MrX|7CdapIBeUPa&k$Yxy5CB+r4)-c^^&o*w7){+NH}ah3o~ zJq;6m?LZMg^B{&rdgf77eb}ZP$+(1l;E6! zN}aJJ>!i+DaPK@+>WtNXlDLjykM&8iPm@1cp6ai8FXR4oP_FtEDs{%vtd%;WO7jHi z196^F%c#^DsMHw&uaY|BrBSIf68y~Z5IKdyvXY)yt?93oxA%tkMX1yn zDs@K0tEbM;acU)UQXZORQK>T$^`DtKV*{y7$`19z9HZ`Z+*tId8Otdo-`DYkrR*AR z_O<(lP^mLi>Wt{qE2qw=URjh#cr95_sWX;j6RAvurJDAZcRACgZg=pmccU@cDq&rW za1DRnmmNAhGWf;z161k^l{zCEFPu6<#O+qhZ=+IYEWwuzq%!g2>0=jTL48Eb+F$FV zCnoGLl+$r&d2(+sr_dr)>I{`SV{O(=oe>Gm4WD&YsWVbiXJkxe61dY-;R#7-W_d%u zS&Bj>ez-2`6Mx;WxdHbY%-vP*Ij3NEuq5{|a2do-T>O2U+0TQCoz$i$-5=9lZO(6s zc!8xbc5%lh75Nb}-Lq`8-9DWQ6Yd-F`;soHUx%OZ3jehJj@s74{s_*s6}6j0>WmW& z(6BrYD{+1Pv)80`jzKdTuf#kE%MQE~x!kftWe>!rnN+t8obRg^H6{uCN*_NLZ}87axfpVy7P0#V*$Ed5q%=BKdD_) zCv9Tm7|r3JPkz;R_^Q+y3WY+kBr0`=LZMJB$^QXoen0iGfu<<{0000tf4a7M1wjw4C>BI1e7rsYg6GgdTyIh%6LxmF`8pS_vNmPpz%=Iu zi*Ae#vV;EYOTmyYyqPD5m^;=m*QB(MA-)L0OByvxm}rwNo}yuwsNoLY!QSj?F& z{s$KIqMWN90Xw{tVMTOR#g_qDnmorI?;BL!zfLtgYo8eva06?qeD@R!x3hKhXt`U@ zmeO|H@U!J(NiczO)UH<|*5ufmr;ST6C&{d*IRhsLXa{N?!M570&+ojjBy)o7>O&!} z3Jwe#9yaHLlTx{0>RInNmtkeH&TR4tdSGFb zsGjoEgd;3MgV(M6GEUAIwUT3fK=%)ALFJ71W^SVvPZ7KIFvV?jg~jm7wX5moIH``O z`oPnb_|HYaD=UBVf-2Tt77{I$jMrthbpCob-Beesp*Ds1w0wRWuZTVEhmhB~(DQTG z)Lsw!M3k*T(7>`*Bua_#m`KfCegh&J@S@IO;5Q*$OmB$d|U&5hV3yK zf&y#pD?H*tVD#P`df5T*0wH-{;7olZom6y{KyT&!XCnM38|U5Yv!9dRR^fuasoPNU!vw3S}sT%BlkcXK6Mcpog*pr88h_S`9 z|LYm*)EjIp{Dq>B5EJ1N5O1tEv=d624T5FVV8f<+pJ^YoWt&$3r2W^$BO`Tz+Me_UUpJ+mzS7pCOR)JOgs@r{ zNIf$b5Bl`;+oYB=S=Y@P8P5$qk#JR*I4t$e0TA`LHOfb}q?85&rk5vnSt`A^`B8K4 ze5TcMyqLQ#YlLLU-)L30hBqDhNg9oDQ<*5+q5*Gxs?T;gAMabMEEd;(`haHIW2XJp zy(>ESoy5o5hKNXYj#9EYxn}eV_Ils5ptR-(#oS22#b#+?s_Y8&Rhk8YdC2S<0!+I= zE}3QULoIh?Xn`NRv0Xd7d3%@vqf->6?C^7OV0yQhVbb7J)>2yiw#eAG<@G~@ZB)tLUk%T{` z$(!-jSik-H(#+@9Dh@~)`8N_Ka=o#^pY*wOWNaW371j2zjWHTL#d7UJm`obZjGX-M z`mEY9#)htuD^_Q)^op>w;%qyu+DRGX)dX&%U{g|2$Ht2=Ig-caPuQrxXLzO(CS@eu zq(V)H(j#PJXh=fiAvKSnH*2t`%CWg;I2dV+T@s+=PkKhm6U{@;)=AUmuve$qON`sF zQl{b_w)mkPOdJ{Gq|=J@9j9(L3P2a6>z&l6KHDvaA|6noFh|gWW*XrOfeZtpoog8m2gj8HTB}hVI z=5mcAfq&neoKkgO?&0C!YnRwa=WDW$f%|+MpbcTY-MeDUC*O@_%dD}qcYWN~{94y$ zKemknZKd!k59h_O+dH&lx5I(v zf(kZoCai`b!zx+D$p%gVtZVSh+vx~3T&J1YZ2ul43e$92j&_?WyW>hsiX-o-`%hSn zAFcv)%+MmQOfnnK5+6Mk(+^JJ*dt0aQ&(R?f+tf zKuGo>KzfX&f05wo+l(H0Kj#&dX$%pRPLYJE|4o&5c6QEbBztWOSi1Q5)eoPCwyYN? z(9~_Hj9&T%i{5@jz%9We2tpK-5zs-yp4{TVo^W4ZCL+p__@Yo#xU&Dy){hys`C68= zF5bac)f@L(#$Hm}dp6Z-i1Jv$k`iYlmmisv`R@p_`RvxdK%@1c(j9e^VB0{C%X5lu zPn4fo`OvLcr>E_yZ-R0M8Ap`S(w=B9eZzuY4B&di(ohG5l#_P%BplOIRLVZ30UvtE zrxU6)KN~iY_j^nY=r%vyI(#VCa@k2=v{Y9$|Xis*ej_ zM>A;?!pW*LzD{+sai5qsEv&?Z^DrG4NGUif3F`8=6Cslfb&ZfYO?W}|20*S;>`%mN zXm24yH<`D@eLtgIn;Bdm=7L79nw=F|y|sBYlRt8}^$%i$Ax;g{a|w zgPuWjsPAw5Q_IbM4PYQz2q{((ReLvrO~I;ty&|r3Igv;j`0x zxf1LtDT&}^Fqjcod9yhKGK*(yl7Dc;Spq+&8aUBq=ce>J5GZlj=RJCThK zhWe*wD-ls*xpDuQ<2MNH73feCpMnH}%yPstG7KK&2=YZ7#x)^X10bS28EQ6Q2qc{+>mDq zqgM<9`_?DFcPJykF~q*l_hylwO+QUH8yVJA12Z6R>mqg{bv5UUOJ2HYo`wI7f?rH! zoCD6uvJtX!rsZ@4(WAG8>S_^ugk)S)otk@CqimDVrUe5TvDHZE9pcGGw0dA{sL+8# z=Hj(2a(!NAAy^VbF1!g<>%Md7^CIsV4pAUoRaLfZ&~-Ywa=oQfnVdC-a3YWSu0A-V zSg0jg-)%mZPgCYjRk_fdh*?RWG(irFY7&vf>)Q%{L*-V5AIAz-mVFt3ROR7i6HW7H z-SPspq6?)Owo%2`NmEx#08u#VSMtq)scC3!iMxI`%xIfn%+IrWpYgDAoCi8f`Vy~# zZehbSA)&FOXTBafAkf_xpnC#!- zVtTe!`qU8ceK%l;udj0mBHB&?FD1?vTSCkM|MNuC>Gos-!`36``ngnwmojq$4g#TH zgG*|lf{1=~yXv8c*(7`o4;S494|awyxSVT7i|VCdc}2_&uw-FWQGt89>;nw-f~Jok zbZo%g6w$JE?1t&sY)`!tv`^PHCbogLm4j*fHvi;3+dhNm%?UppLJU8GGKQM;MU$9S zm8U!wR@}G6yfC;itZIDf|cYzXB6X15z9Rwc#;(G4W;EY>gtoj4n`wAO9bbJZO4!$Bv7F#DL3d(1QNvo zfJgr6`g#g+gBqLbKcG|47iRTiX_Kr>vTxz+DNW;elWB8h0_vl7pKtiU&-js58-Dzl z!76;~U{090)0zhvfgYDBP-*qyK8kJc!G<89sTWIY+_3#49@7^I1v}3&y|n5l)N1#$ zY-A~)AqPFS;f5?~QH)3sGpq3r-Miauf0}tL7Q=%6W8hPts8$!O-WK#0*md~CvdzUw zM0pfucu1-inp*;!Ny)jaU1cB3^QGV&bJa{stOnEkLmPyTU(@cu)An+{y*X&(MQ2lG zkjdxuUaETQnK44<;G_lS`4pUZ)qO#0#d9ef{tyznCstq`S;WfBSOC4%@5A}`{Igh^=dKJ zMONPm%$U|T(NtLa8JXnR`xy8CEi|n^t{c(-Ta6Mo4kAFy_D-!5D1e$mV z?)ym)V%QNJdF3W_!jE)k`h_wN*A;UfJM&FR46P&G4)G?1!151zbt998L3^TjZ-x`0 zF)#_^ozsdA$d09ET4ho8pO8d@8RTvve(iNM{v#}D_?-QKz*&xM2yntJd676YQEpXZ zVa5^U*1b;n9r#>S@spoj)O+Z%Fd%f3<=vRLnLA~`>IimsNRBFIaPaegAb4NX47|Q( zOo8`X7|F72qxH~r?oBRCUrZNkvwPnt2bz_|)HD$PJVf>55>JmSBp`2%d6|{=jg?}u ztQ0`P36Kph$1hG?9bTf#*9;l#2#-EHGOu2R%;+ zS6#%mr5Eq3qxdunXFXRc#{6swKbgMllbpM-3K7Vl(#Ch1;m0Lk;&x1yX=DR?I;T{t zXX@8aus9O+#U%uj@8vF>R*4QPnP}?T!tUZ1bVEHtJqv2{lneYp#hXfUG=$q!{u%-J z7~$C3Q(xAW$tUVYc-29kn*ry*H`uWP{1MyqH7d}qZUV~*Yir9dgI$Gb62oPswX%Zj z5>qpl7p2t4s>1uqmr|OSIp2 z14Nu(FiTN6gbLDloqmwSK@3K@OYx78@$)LDk11+LntudbBhBN(oJE^~`ty_W4t#pQ zcF?8J`l#)Km|exKpeCR44rRmIvZ$O8cTI!P$1-wc(uODvaA}4Q+r{edjQKrqA*RUu zT!{VSx_!=vJ3jWfoGJTLx4|g*WH8*@qHSs7gszbwRlaLn&~J^FOPzTeLgj_myB*uM zRwt3PRQR~PL@1E)o#06*UY;qjc_n`Z*UuWWL~5`x(x-qF%u{qYw`S-5U7aT9_6#f) zy{hYe>^xdc^JV6N(QX%)>j4wiN7{jW{&!=>9vFp8^MJnT zKXAzu@DAkRXOfd^t5PM|6*bMC_O9seHMP46V>K9doDXH^$uuG`Oy}jEl5Bk?pTBq* zG*yj!s$r!$WbTf7Z-SdYgQD&%*7Ghb;$X5{q&iFa<7-D4C=8!90&7WPWw)GCh(kQh z>uE9GMBs0P=NT^K29|0bURqjGKU=|b!S30pYH6~2CgiRZ@QuzOyI9V~WHz0xXe?pE zR~fT-z7J6u$Bayg6P^`vMECp(#oCf{|Mh6SXkpskoLvXa=bz_gmmgU%+6zP4JaEE`yYXN&VuZXcglfxeVvdnDgo+nVIbHYXj`7xL+4P=0*PXvbtX zW~@(e6hbZ2G`q(z8+=VK-a{>>&On`rm99gY&@IGwf~;sXy5v1tLSrLib)#^&ya+!^giw;w(WADD(>=1l0!R(_fy+y8O1k%= zX_X3N4kw%#V0l;aE!jC})GldYbTg#^1|J{*R?%yzAoI4IB=h9q5q%Bp)p4SDjT;_Y zp=ft}*S~y*06E79%T&v^QRb{J(Ud>GrAqR8tW!rM9y0%;vm6h@;Cbjk>(U=#w?C~A zFtuA{8u?JIkxH)4PId!|@WvOeI&zTeiT19u78h8O<|ra{>5t z9eYMhWEWwdM5N6}c5tFR)MT3PzD}rOnYIt$$}{;fr9&|wWZSQvliP9z#M5@hT0SlT zJIJK9NSYx}fMXTb-iIZg5bAZ5)3qyn8NVm-De8v!?zNb0yMG0bfLv>ZBr(nQ%}I-y zEFPvW5JD=dm{DVOyW{X+ZxTLv>&qVy>#s>a;Cv-j6k*})2DVTaVtj6rpeO@(`vu0B zxvRxi?i4aUA_>Ao99W&20AW#Nf}`3ve$(hH{|4bRvvFz~nR&bq zJNYd}E*8t*C@g|e*ZhOdqz{#?3-WLvE<1l-a3`uwem?Dkh3-n4t?0tv`KyGTuwM8x zD%#`<9-2iFDtgejxKq&Um_gC%Kb2x1~i{z=erANje>bc%E#s@$Y z0}CE|_6SuPA-4Al|N6qGhV;CMzVtNnij|RZ)pB0!f@lX1vV<4d33vn)ScQm;dHR{x z4+-Q5G4%kzr&lb4Ri2yxha%--w}XBWr$~l*bGjTrjA*UtqgWOu{3fW6c8EK+n$lWq z-qoQH>6HFK#Z7gU=kGAvam_z>S!(WEf#}^kU>fDUZVf?vtBUsfp!7lto0%A;=Uz0&>A)2EWw45@OK1ldy$%~jj3H8yyRr_vMX zMEiJKS8)d?F6y+#{L>ADa z1qgZ|*>$XW<5Ci-Rp9sgR+hI$aEKb_EY^3^IQW<}DXM1mS5Ku4F}cqdl`KrUYSp?C zSeRoU8jM~Hd8Wunzu{unN>{P9FcNFVyHSS8`l^UYN*k=>W^A3S0Tlcx?Hdo3Jg1a9 z8L=OPD5SRfu(%FD&~(l9uhNz=^&<6cx2>_ha95dpaB2*;1e=p>exp^=-i|Et(SdJf zF9_ZetEH_*kB;?)&2ENyh1IPRcT&guX~c~(7@o_X6=>=Gb6n(g9X$%t`HVw9==vUw zt@bp}^M&E#`R(?5sPk4F&nDDJ6C#f~xypxD{S4R@IpVR`k%?7%3ur!kieK6Gtydqe zlH3aLs1(bPz<{iv38(92sV43w<52At$;jjZ;Qo<|Yn3FX* z6UFJf#*Egf-`V#b()4#8<59z;r3J1Spf39lM!zTiNmmTwJfC^7p5nbLQxx6GsaED+ z6hd>(cxZn%k(x@ir=D;!s~p(kcIUu%ry&{#59XV8djQ`&fLha^`|oIr6TNg_V2PlM zBc12YLnoooNL>8LUve43Mlpd5Z9tPk7~XU}3@wBiU7||xpJ)p;dK18-)0BZv$=`f9 zn>VvTaOKowKXu=?FA3c=DTuX^`NTclLkpG@QOA;+JPQRz6#2JNXPg-QHHc&UkY?ugCZ@yvMkR6P@+ zTMThj=R#0k>_gKjj)<{yZbdc=keM#cD(G@|QV;*Ynf)(d%Z{pij@3TD8(G;CDHnoY z_j*Gr!*BSTt*Dgu&;i=lLzDxTO&=Zn=EtQD2I#QV<_~Kh0i3JCpI~$QUGG%aaJ0^s~qQJK_pvhhRMQVK~Vfe%gV86|- z#ZhMMB=>NzohHl$vqY`pu3w|(^6l+$9F+HDp(v_a3p zgfRWjZY=9N4C8tEw<7TBRL;;Ph09iR)nG)UUEPNS%Scsj8s~q-u+O{V|BPXS5h%bZ z9lmIOXaw>hVX^+H1kR79_KRsW^gwD)J!K7S1!si(_;^c?_x+NFuN1OQa8xmIL`uS6 zx&Vw{MWqV!n|Q4htXMOlOFV|<0;1J~)N|#S$M2_hSk^34O3$oNsdrqRw2lXNxmrqi zWfP#4G;2nRp|1)oTpiASH!cbYc5s8Gu%a<&10FKdqIsZ9tk*uqS6*1$aUJsuJok-%`<$aet zYD614pgsmAuGn`=kO%#h#1{S?iP;)A?`N2@WbKv9)HuYIV4Pw#!l<+Tv5bX5BX+<7;+It0xJnkrV1)jT3RXrI*uWUaj!7# zbgYU&EA?%sd$Py+E@nXLxe@aT1&@o2S0@)^L0QAxe#qTwMxpqZ8-k5Wl%Wu3UFX}u zbwm!%-^t>tv7i!i+AipLIT`=S z6nkr%c)hI_x|v*=ho}mm9#s6QlGoD9br$4S`ABK#DxWREzvVD^3@@g&5iKjQR90k7 z)2h|fVId#MY+M@_=PcI3fl6(ksxse@iR^*Vw%6Fe$I0?DT zSvHo(_o)|;?2(w0Pt8yeSqo-Y zR7`lREw_b_zu#Qr7<%Vr&8R>Bb*(TX8iPiIOfgEuH@^fnI?%;d5H~RZQ47 zQ`Z$>hdR`I&AY=kH>~HuAlx+dcJK==hTOq?MH8x(%-Vhf*!?5wO4)A*wyEUzU>(@% zdeF!bk+w%uDbi4(v`n@@j5X}f7n%q?pc(X!x#4=_pWM)9o$CJ^eT>Dgwc` z=NNDD6~;7-TrY&Pi`0c#C>}fP&uyGQUNEJVuc$O#0QkjKG^}k7$3nwiOE2oWTlNfa z>#;g}U%scL6j)<31lxR?N1oyenyH{>t1;BiYgar%u4aJg-By&j>iX}13>(Z{XT0!b5R!rb7XNb@NL{oRMsEXS@RyQEizak+uJ(n)~ZN-!_XEjM5+a5O(peDbw z%cBA5(Duo)tF5c5H)mi+a+7+^VSh^2+!jd{xDo$Jr0o|7NbZ;4MsBpqiKr{o&mX`0 z)=s`|&hi>G`}%*%X}*C(;s1%#-cSs--yOZZl3`WI*TM&5{FMh2|5cBr6fJbj91$v6 zl=SyZ{a9K%4O?r%X%4;$zUk8Cr|dc>{cKfoxfQ;o`Y8YirhyX-Z(2Of{|%p+=*VUO z3vzkJ6QBF_aa#?8D4E|k8>|CI>ym+ZzSLo+3hGxCFqf@h(Zmw7=Mf4^0s z8ctV43OJ^=FhpP<^xK0S7b|2xIzlbd#kJ7{oLi850;3RPv>TDsNp+*?^N=$h)C5p& zCVJrFcgVQ8vPo3_=Qb(a-v^HWhRFVwOYVn93W}sms)Comd|0RuHg*>eok^4kYQhF! z%gi{K^XGO_9Vf|y)hc&WZASj|LrlT_c}9!V5<%Z(0KkDp#KNxv>QN*q?wq&Y1`i&J z>5H1-0ReAiUh6Ue08YqiFx`o*Zk?d}5jotH`;d<ZQ}Q~la%b%w#qVr<+NbC;XgbRSVcn9Ff2lbp%o=0r_cda8v=jBo zlTPmty^!S(--Om1?6wZK{aj%Fv!wA-SL{!V?B~qOAIO=q1KT+(G3J3k3sBV*Xj?mt zp21mHuddsgId#D@n_2)^QrdF@<~WO__86goAV6NT$2tZ`6%UpWJuV{Rtx#$-fi|4S zk2NYu!jMbvI7qqodKOi7C0%gT5N&hLBHxV!tN62jaha)ZIQ9CvbpEpdjCg#xJ5KvC zTLrt{n&Lw^7mO3S#bHhROaibU{%9LCP`PFnt1kO!S-D!P`1d6;LQLqMv1W>zunTbs zZohb@2fnD8n1DZej9|Xaxic-N)02n;9LhK#LUkSldLYM`va`dvzJ!r20Gp^ z3RR%t>Ql|$X|wm#NB{B<*$(os`5zNhG4#xOYNGG0S0ujJogus^qoPv5vF527wEYMz zp(0p)RGW%{MjIxfL;y(YWv>q>HD~CPf|4%v{Ai-D2PMYEq66YIC9Br@o-wWnW=tZ& z6{7QWa$>BMtlyvqW$_==&PO)|gT~GHqC>+#>Tm+j384{zGwg>4KYUGO?%+QRw=b(y z;9Ogf+~92#;8ro?S}{9v!KY^UVyB!tExH# z>Yig}u7IDDlB5M%O+qfVDv_LA^xeQ2P!q#EkUjBCi0$X@&6Xz3EC_6>tWAYHqR*4b zJ#hWG;g{|J4H#i)47uGbpiKsk@VymilljVG)e~$G-}4nOt#5BcGra<;I0iepscg)PZN(gZOIwHn-S_$%%)isnh~~(_A8Zb5)GgWV9>?tXKyr#N2X!{6y!)!2 z%`#O<`QRD+wp9qRY8D`9rv_W;H$7pH;3?3b!&S>e5?kN(#kk8AQlc~6L z5ue#X@o}NscRc5Fll3f|E!@LwK8+1KpqF`UWh~rqadlQmpx3a2TK4ecelRP@*(_M* zqQl9)XRAVH&=3QA0dWXcq_LVcsck-P|P z9eQ6rmexDd#o-qd;uimf34Qawc41n({$j%Kk-p>uzjzR|tutuS@)VI{J2UHx;EI^? zB%E(;pJEWsSJFx=C9OrJwRGEVqq_&X=jPFG@nN3_(k?D->Y(S=8q`cO25Xf!jZddZ zJC>9L@Iptet;VcS?R#?jlfPGmkeycB7{9@^pqca)rzL#jT?(nD?@38^rt}71XScCm z%dw!f$PFm3Z7!m?H-~sy2v_%UtVv(c&L-V#9Dt8jsc8c0P(Mtxl-)Ya(YJu!k>@ho z+kEEr^oyVAKRm!y&a{x35Wgy~RuZL5_}a5H_m%2jPlxU#K*K3wboadR2NGZSXX}Uk zI@Jz&;#Dmlh$II?UhLYHYtjFhTpJN6lw!egaQ(_k>&XPyI2oVoWt6Q)&dkEPNi{dw zfmcF6R!Za0Wx+M)?0?tdY0-849dcIaPNHvP#V0A`;pPl8tjw+D&i`UF314y3vZ+Q-$y z?3*ahT;cWP0eXp?SMX;Jk8}j)Jn4yF=Maa9)~6Nl3|Vrv`_5riqRVnOS>GVeNmX^a zKcq9Hd}Z7b29=GNrzRg{s0KpEk+_h>grNfQMAj^RloPZ>r+AyE{5x=(dq7S{H*VB( zU*l%7T;oLNuQH*A;6;7JC3g|?y)jhV7wx-qQyUea6^rJS;UFUx;=~`(#xN)H;B=#_ zI!0M*xmZ0f19L$1V|HeqzzES})mwnMnkc1MMlDm;({pIUuIWWBBcg6Ca(&KHKb$58 zvqG8}8jUa>nztM3-fNGai)XC8-riqhEe*BVb|9i{pqr+K-9FD*F$tVugWaacyy`h# zh^Q#~^jT%rd3L9x@WUzMI*5w9jV@a1`Tz%8WmUPN;l$R}x#8ZRy}}A-*1*XSd`V)O z8+H+`M)#WCp`lXcS^P0lyZ2dCJN1P35tp@Ko1K|*1T84YxrS?KL7v5iFrUhiecHd686CI5GvXfdfM|OTK?eG&4ys} z3MzwUw(R4(4CU47%Xy^hJ>_d=&qHJUs3oJMSZEW+(Mp+_5%M4CIx>w;`k;tMH=WVv zeD&r1)mm53Q=UhNmv;11YT%BnrC`jC)Up~xL}52MZGj(#{eUF8r=u#6XX4;0aGAI0@3R0HDyJE|VJrupS8@{Gy>3gUevemgj;pITK&Mxn6k{ z9WuyM^_4GuXI>}f^9bUDtj&M{MYI^Q`2Rj!m7|_eg(%6zl5dGr2H|f~Dc%=+IA=uW z_2MCIDJ6_0SGgaxK9~_NTF}CLdfczw+vccacrMBz{HnRl-tBs+zVa*FkHk=+ECK53 z_?kcWM%K>DR=thS+tsFrV+>jiP~fO-F>$zutdm7lf^ zk5~M#$`G*QLFz_=_Aj0*a2!EntvJchkqiwJYB~H+Tv8<%HD3kZVhCn-x@_Ofqd7W+ zBOfwyvhhR!F>4!;Or$YDt!+KQRQs(f^-Rh2wJ*!d%W+7j*kJF)#yP>z7~gulDkno| zTWD-R=O^ccp8!z|b5ieL`9PCU(pWZs@9o-SZ+2yKrw3VG@^SY{h#OzI<#W?3egH(`&D9V1%v(>HZ5;=OpeFDZ(F+T4Vc)_<(c z>16yBC8v1*=P3D|W+n9(N~T08N~IR}p%5086Q?o z#J;k*v3+UENds>$!s7M%00(OIXPMjG#;JV#nyinIh%amHcPukT?eU0K!{DC0@mH2S zT;y(ZGoF_`+N+slR_$!yeT`qBI{lDr25{sM0l<-3W*^&loIXBR=`2AGoD4=ek?Fdv zwZ0LsatF5-#@|5%2GTC{V##KHy_i$qEL7#yMhB{&%+#;nXNE$2S$hCs7m)#bs!qM| zZR>6U%ePHgzV9vkfi_)j7e#tICu0z^r7TUd-{dt=sIw-s=MpnCH|V6h%uT}lmDVOt z`!TeP)q!0jFtua7Z062FKz5NCQtT#3QdCv@blKx^jO||4u!V!Nb|rs+#ZD9zcQRf} z{ql|9*ccXb*yWW;;GHU_X+={ScyJQGrTe>vXG2&KJtNP#bxREWKcmJ_b?n*RDz|Sm zfd1{A%5NCet!l4<494lMFDvx{)%;y2( zsc)?Hbb+cuGZTAr;8&pT@SxLHtMC2;+)|o2ET6Q2mHdCqJY;kpj;aB zRy1*}>;DcJ{ce`D)taD?dqqbl?2iL7eb4FVDfn(JvkWXAJIKdn6q4Bu@4EpCTe9!O zhWEMi9|F1vec;4)#4gJX*>6Q85sHs_hUb^AXp?5B87o-bEg>VDMoAH39x}^d4Q?aP z9?)ZLyv?s30=li;TBO00Ru-`2am{tnn{KEe`E;f_DL4%t81Tc@|xV zCLV2kTl1ybZ#V3Mfok6TJ?`jQ9Y)-%9ITo4`%RJ`In#(wxBBd;LIpigfirR)jTKNg z7dx=g@dCQ+t{>7NR_UDfAKfmCbmS`@JQ*%0&S|g?s0Xp1uv;#lP#0*MU0#Cj5IUUl zm~TrV>g#5#+jYx3Gfo^B7C`&tU286F9{Z-R_P)-MdUOsI&CtVc7ce7QJ~Fq;DgylQ z^6~C?t?TJ~Yj;~&|C4mr8AaXe0S9s$TAz1H2IvVBg7A%-d2nrCX@HDnCO1uXuBx`}RW7aPOX$5DHi3iVn|bhYCojzEfrcIgRY<_EhThGYGKiBL zXZb=L&je%v-Gcq$=TAKi5SV+)_PC>N)wL$|-9Sas%p2V%e^0o4T$D>Q%3m!#pk+o76F*!OY1<-z~WfP>J1t=Z(Y=CpqVUmZZcqH)D&;%8BhbuXig(feEYpi zG2tuE0XP+GX5?!8a_iJu#fVNJlLX(@ucBU%fD#5o3Vw#iTP6eoUE6}ncU~_(s`c;- zmLOmVqq6kcrn|J(iToudmfaY3JuL@@igyqMx&N6TU2&?}&JGMbV!n^+wTm_mq(u&cM2<3U}eAr)%7>x*_Sl}9nM(H*fK|1CPc zPjn3gWP&=Kg`-wFc9k-bB~XR`;zVO8jXEEHf*GXO09UB zzXw;V)J_oQe+fu9nkLuz-2Y@BQyXi(Jj=%?SEqdj2$>^uS!O%%DJ-jM^A6tPbwiaE zXE%YN)$hONEcEG;JsxGck`jKt^0@TsN-Q4D5v2J`kq`L+FJ;7&=tF%y=yt5ebu@;pP0$p5W%Bl@G&rKN`R zdrnAiMLO5VakOK1IJ1^)u%UkvkGT>VZBPdYy4ww11Ged>=ee!n+&kKEB4$)AR0Vk^n+_LeU+b1=K@mJM(P_(_iKmL7Mn|-+kM~8hU)z*PQZ$_y}n4{ zMLif@BlhIbVXZWitkj6OgZE@&o7j9*l4*3?ih~}omJ{_c^LLK+Y`zs$#|i(o7=aT^ zXJYw%9B)k&T8Ho^gu)hicnz2*k=TCC>Iq2}rU^%(?)##EoP5zh)<4`U!DDS+YOf=4 z*%U$a4BNmQWDP$yh)SjOxN7d~_hXhxTG|_Tl+^)98Fj4hsf`68(H# zfWKHr1Cwu$%fq%$#p{SpiOgU?sXAip#Z{ChB_`Xc5$fgtm>=Ow5m-1T>jvOB3{%Cp z%QBaTy;B4s4BtRV#V7cjUOgBqw@qalC9waE9QOkMo*XyUdBrkoqzySro1dLy;4HE? zic%z%UIHaTj7L@(tilLmnSB;eU(4A}jqWEm4e1=TaBPmMK+>!3)!&m+AnQh$%^_C@ z6Fl4ga42LU$E*Ylk8<`oZr}M^G!Xrz1}M%ApTdp*Tmf89cBA^0Jd=D#LHgwxu^q}# z0BfO(l}}z4=c9W}eY`Nk_38;37`9oBr~_sZWfBMVpC7ctF@Gc~?KWOOpIHxqJP!zb zOzZ1*>RvP&C~QiZ&2^*Q%+*&#ht^`6caSDTq6$odmoi?Ze~!9&Ezu<~KukmXI_YK@ zP>KzXJsuU_DzGhqvAXIUQ~f4*-?l~mlVoJ*M^_th;Ou97W=78sY1gyaz?t)5tNW;4 zN&VA4PzwAP$>@jwTQZ`mp3&n!OU94Sl2HXc5oxtFyZy82N`jD}JZv}6tOW15dayRx zMTotG&dCA>Uz?dIpimCLuH1lG!;?H%P=`*r1J5I2aPsWG@*=Qf#>YurEycI9e|JAV zwUS2WPfcFZ2-%Q0n@yVX;KxME2fZzcG;;M#=g3IyVv&h6>ol}qm`wFkZeN-F%^$nC ziYy0~J@|}?qn{pf&OfiLLfR+5M-Xdh$SJ1xJ#UlWU12zXR>UH05&&Z8bHbfF3i7o_ z3&R)!MmNMUf#&gw;TIjFy%%wVuoxLjmzjlz5$%s7TFzArL(9zy>; zn9-3O;T#b8K4J9>A?OzKys0k=(2R6DI{KcYZ2`g&eP;^nsXjNtiy9J!;U<&!NssN+ z-{a$&P5g;d#Z`j2rOwW@<*>KiUyRkNTQMgJgd$FOv#$iDN8O6zLYE%DY1l?A7q-J4 zLrCWKZ1T$hm+*^1H6w3e1;#V9149sAC-DdNIDTwy3)({L_Qgov@K;1*qLd>YccgD< zWF7*}$$wuLG)W;rErqdMSoKV~=;rRMg-5hJyz-qEV|6g;)cS*lPOMXv+-m>lXh`ta zqF_$;0CVt0-u``^2-8}<;i8-pXc5HG!mZ``R&SOK5!m5YdRvq2eTKA#n`gLB-CY24u?L~JQNmho4BxlMe$DfpTFq(2Z7hcOIuk(un>F(~$#tF@^XkG|rTeaq$nP{h}_;YcvEOleH^?6W()~G+{ z_)`BU=jktl8d;@(1~u4WOBmn(D+2!b^cw*;6m+UBHl;!iwvzNfZ4^}LYhN(WIRzB4 zU?(~uR}}?<%I;!%RutxB1ACfZ-OQ7nOENw<6bdmyY$OA90PeFW8hBc(Q$+e=uUmam z1~A<+Hh%XX>%wPgGmi*n=Zx0RL$mraKghe4%_nXC%76s|&mK_)?$ADLb^0^FWxqtB zbh)w|J9ldg*fr+c1;|-C5u1d?cPhWezmCo00tf-&HmQ;=be459Z?5-lm z8g@-^RHxtXZR7Ob2)$(dr%XCv!s*7Tl26?1Phn7_>bU81825=`jPTu+Op=4r>=9%v z2PKV=U84WV@vSsRv~ihYD#Xh2>JMNyU#9neLR!}drNLxppfX;>FXMr4JtlsPw);_vL1MJ(;s4=^zCi@%NKyE z&c2(WBs^RKa4Cbdn&F&ZVKjmJ!?NJTJyde2FMAbWYWV*OfjI-Cu@olO-3pRdQykyzQ_qAm$G zSD3StXalFe0j|{asFBR_>Tci|H}t(bu8j&wtGB@`#Zh`ApsTt3hX5PbfQyFcGrn_R zH+Wr_R4Fd}OBp(D{u^bOW&}r)mXc%}#!F?=!#~t&Yn6YoDtS~LkbU#)3@HF-7)I+N z6ULCo(L)_z7i>lC?OVt$g{%h(%*_#^nS(C?F9B3_S-C& z73p&v^bdu@vk@^P;L;`fTeVyqjQrm${!D&|7yE<2-P|+7J}eWAXn#O54+JJ&X?Ge% z-7{>Fu7sg^_#WmVSeeY;3p$u?K#@_(@i;ITS1&*H$~Rb8c0lvOj64x5)`xM@DoYBgL_6)-a& z9LFsS69b`#}cyLMJ4Hh+|(KpDCV1KSZFk0E}2V%;O^nQI@>{WKodM zzv{uDGMO(Z>HUq-VZf1)ipi(QvlE5R-XKfU~m$4}-CC)s&pY zAT^I29;gDeD+UP=`sXnZuYjq>4M~(^-xi%6AYgyVT*>d%YVeIs&P)+Ouzl(JQ7hdS+cribZ~wnVo|QeY_lTJ4#W(Ly8U*etJd%41cr4kryLT2w zsjr?Ft)?FGe)|?C9r1*jGh-KjT5iAL)imLK2V@s8xJ=#bFVjC)@wfX+>-`7WpXi86 zId9prV3|!nsJY$yF6^BZ$h%FuukLKJ2bc zJJX+*^qp51a3JpriMz4n&Cc{1dF>njrMn(*hx`ma3LI^ky=4a@yM0}=vGjW`*?yga z(bgZnXul}$m+uE|3qH5^(4RT=-0f2R&zI(zF@J8~v31HZiL)zy8vbnzU81d7d6vW3 zZ1Ng`@)^&b?_QvH=BL2C?9I2*^cdsXfT#EDs63ivKP{~3q|Hod!|%uKhou_8Eh37= z$MefS7&~NsFjP9rvfT|j8Ypx|{_rC!t9$nk7qKNdcAY6aq{+FGD@1m0nJDYCZN9+1 z;=&I|%MWK}cDZbj+K}7)JM)_Gdk)aZ>CXGyQOZ}(%;YSF&L-cu8gl$y0!g#U0)DQJ z!4F?-ZtZ&eo%gqmgsAU4M;ZOp=i5~$aqgFW+_vb@<70=x>k1hUZ%a(*zS+xKq8<5O zroj6`-NXB59v+K&30y*ZaK#7N^=EI18q2ls_!hV1?0nFMLC2SdS%ti3{PiZ;Wu5)7 zUcO9N@o?tF`eoTG9>hd6{rUB|`NS#3RErO7Vol%0KBi9FrN&ewX8QeG;+II)yxjG7 z8}`Sw+CP3Cx9#H%-!{w0gs|r_uS@RcO!{Xhy4K;)?VvleHr2io~;^{ZlDcC}}jnei9 zJ7^o*7KXobxt$7wLckozDJ&PpjVj?PAgd7!xA6oQ=|`3A&P+Q@E8Iz^l6n^+N^==- zqXU)blBh6c*haWjwUzK>I{g}1)+H37S^Xs=i{`lj62!bH| z!}-@sH$V^s;W-dzCkVn;AkIz@gstG;FWms)8K~LxE-MrOaOrCobYHkhg7DmkvrC|A z^)QbLxSusHI?q^fqlHs@p!v~axXE${7N-L|r&ru$$%;k`=cMHQXUgd66l*ZQ?B7pC zg0uCV@uZJ-p5F}{Z3lfX_?L{bA4jqK8g3U5`An?*CENFORI#s3ii6e1XQ*$>^lO2w z=Vd2dQ|+$otWfU;kTf<#75m!Zj62+yZpyDh&8By<%jil&(=?j5P`PYj_}3dP%%gky zn!4Vfl+dqjs@~K zgy}e#s%J~3oKc(Pk4z&g?h^GHx{AnrTMg|SJ~%q%2GFTu*Gf!po3paI{Soy`<#>kJ zoV~q4``E>3J1l$0qlD{L{W?ANt1$3JS-Aw0eo7zJ_oiRJtQBEr*(2Ll z>GlXkWG4>JiTY=7ZqCam9$hs)D2KCx0iRSfb|7~DU+ox;Z z^b-0ds?VN7|ImP8htR5M4N&dAY+(#8==y2q8fmN=-1jT($5pK}H32>@{Y~Dz0e8@y z{olS;i`ew{DzHy+XUg4Qv&4{==hTZOpyT!Xsi+-uxZ`rufnnnwvo@bt-LZ>)qT{ql znD|4!d_ALbWYV(;Igz|%+G7?~de<5)oRc25s~l67J-X)_-8Ir!qg-P87oPCjfcot`ulE(Tg@}F@>he{2C4eyR!*int1 zGi7w;8FTQ3yT^hW;EfMdc3f^|189iV88O`}htiKsCjI#U?2K{QHaHqo>f|^&eAeg(?#m`I+B&7j5ug0%>HQ&v$ynW!&KP$mkji#0W~r3p zI5?5?cW9rYU5((#RM!KkcaD~1*u$S&pXS#(7xY8plC|wIv`^8r_@3FjH&8e#GWJv0 z&n~5t9(JDjRH8O~zd0t|yvav399cbRLOx8BcWTfm9Z{Txead%?`TL<6SWA^CNCQ`*2$9=ZTzi z*duLjK@NMYNyrIzJ~679^ZB!YbX(^jnC*d@tK2hw%IH2oinII1!y}}g+qn-+DN(s} za4tbPlqF({ok-|fDpJV!_+q9!_ycROAT{cYaZlU~!X4*#bs?v{N-H-!XlD$* zbANfbRuL*a0=4%TN#8mbo}-E~piL8Z12n>qnXJJG8h zbGQSAz`hm$Z<6fhI%y?_(uQ7v+vfZx z_1P&*LRjxdYIvt&d+}msZE5S2LQ&)*x{N0UiY0^cn|aFf)O5!#g`>0VbisXKx)V7y z%vU<&Nr6gZnN%wcwb13RdF;ZTPRmcny={td2mEmq?040wFKMq8DHYY@Cc)Fxt5N#> zZImgI?u4uF4=HfZ_gwAHvWI_9J_Jszqgy*clI$_$`%fs9(-YmQ)x&Y(>8Tor@w&&s zdElp-k<>lg)(h~qvgY^1oA+xT0xiRDSwaBO6QfyV5=#{!lrApZXpfx6Mpx%x+BE6Y zM-QFGW<48~3$OhwO4t0JmaUV=S$f}|EYnFL)7hnwG?20e-X^J9J%1VMN%R(Pn` z+g}J_P~Ic|Mx`JK!ZWkN>tg<9ZTMvIxkJ+JAtlxGc{Q&v3Bv1Ur8HI$1mRah-i;Lm zVJi@4CkVn;AkIz@gsniFogfHXfjB!s5VitQD&7V}mR%6U*(D*e>`StaEPD=_?=(b~ zeTDIv^s46){R-Wa=sjIn_RGq$i?a*izdJd?U0XMIONfY)R;?bUFG>nAp-Q9epkLd3 z`)D!5pmoAb@+bD)JOn08)#_n7EeO7^>C3Vo)I*}JF#*j8b6NHcFFdb-Ro*8DXtX>z z_b#cTyBTHAWZ6G<@gJ7&S>K-RWdxCB7g=^*OqPAnOYzRrPX99swl(1?qU)@L0R^peY$4aT0-~xto3nsDtz$ea3Vie zqJ6%f|5(Yu;?(O4Az7kj9bNbbWb*c9CIh~7y`EI}I4;$_n<>jam+*R0JX!W}M+wdr z4vuG%MZR2-lQ`~t876b(AB4%YNA$;jB5J`|_UN8_bLLSw$k^O`t)$7a#}v+=4v}RS zS$4&X%d%Io8x;zZo0TIGk!6pxKPJoWu~WfxoWy?TreeX{S#UCL|OL8r@XC$ar|+e#MC|D z=oUuck+MaW-9u#AXKa-$d*V3CU%$w*FE7iUI;VrAJe!z2j?%|jyljzWUkZ_B7X)Dy zM3!9;gsnhi*(%Pt6;KxEkkLD&jJ;zf*@=K;_L)L b*b4p+)CG`z?f3U700000NkvXXu0mjfhQX!y literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152233304.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152233304.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bf29db30bc3d2c01a352f33d97a65b8cf3149ad GIT binary patch literal 2065 zcmV+s2=4cZP)Z!@9(|$_fG9U@87@wmyC>zj2FVI=bk`D zMn=XuWKJt1BjZJpIjxM0j2A`bv@$X>UKE+r%E-ugQDjal;~uIsg+P31U_AF!GBQGT zT*si&@Sl4g|9cF_#Xiyqu1(HcPdIR`i71V@_~h`n>{9hgVCB^(0iJnITYXe(B2IJ| zc$jCgH`BeCGVaFYGuQuuKAs1I#uuAh=OH>I+ZK1jKi6DSOeP6=K~kp4{n%{mZS#tw zQyQgb8~+7h(D))arBCqOQ+aaQoSP=*V>rx#hiRIarpd+K9+qfQRbE#MI>EI^kT1lZ zQ)^-$4e`RZW@3JZ<6^z;a-qKeUpTDIs9xC=|3otL2=W%LlQRFUHL-}=UeKk8eN~OU zS7quAbSx#i-e~McU}v~)izotyOztkGnc7?ggqc^4GKLnM){AKBJ3y8q7So<%(V$9G zlo?%Ca5~|yuLR}aa%{tKIps4qZ|rF_Nt+QFj*ETJk3}B!8O|xWj!C6er74PQ3ad&} z6zE-!C`W5fM!A?gCv>AVmKwNG8+2?Tu;t3;vyz95y<$INd$}mG#^$%=H!1NOH+&Qp zg&NS3b1&p4jJ!5K2SRx+of!jf$@&eB4>TsLPf;FUh^bK6<{Lm)J;J-U~(C^i*%sln+H(|6tgX(Xy5?-sG^Ic`i7 z^Rmk%UkE(~#6ZFDtC)>RM@)lyDZus1OpP(Jt51dQrbpFh;Kvmw!Ebiit z*?s|rbGo!``z+jpu?(nl_H!S44o$VwT2ls;-5mQ5SY@1ja=R1y-=@Vi&3X|Hjhz12 zV?T^n=~Ms6BY##Ri}LovVQg{jUa(+c6S|k-Ms{xLk3+%KK2qEbxS4LCkJIWhNtOop zG4N&z(CQJe$GbFTZ^z+gpmF$NnhaCOt8>{DWzDqd4PfuB9LxA{2&z0=U+Io@nOSUo z?9ia!>@R+=?#BuYr;I-C@^$LW+niqqXa~m+IHqO#D&C^c|}%+fs5 zORwXJK28(skjP^YAuPC-Nk^ooTN`^z>QLHnI|;Bxl#*~DSx{cV3opjw^l$O^f*sFPO>COUz+Z}(a`cXLfEnA zk9v0YIw}iTz8`7$^K-M(Aa6+nfw`lALViNu3w!U}(y!UE5>cMD$=$172`u6APA#W8 z4wVi>dt-|x`zdtXc)JJV{ylm)VRX;t_>BttR{~22EapqUjo2+>*8@D$lov` z)ImCiHO@G~tZX_9J%@JB&sU=;*i?y^(CQJKlsPWJenBVbrFU6t8+&q=+f?i{Z0c+x zROd%%@Ql*8Uv>soE1;vHPxUCIP=y6L9&Y1ez-RYxXEMrl9W z7<;?CI=m-)iX+R5WoJcIOM37{_54a&Jp!cjltiWISEY|x>0&r;;>tWRmn)04&gy8> z8))S8Duvf-+4H!xdjZ<2+uL9?cjopWqOzd3`AwQU2UO1H7L-m8#dy0HyIG9RD3_L9 zwF3G*8IbYe5RD-})96C0N3feX_nRV1d%ZL(H|NV_73mD(`274s?2K-1zK)9!Zd@nA z(!E%V#t!WxdEroN%942QyiajhbAci{2b}4lTvup6X~%v-c7|(wcjPxJ;JDaf`U|s6 zLEbndOP#bgU2V=yXbPo$EF!cyzb+u6TbF@{H?SzHT`Vm(($V(1xOEHeF6I?Mxh;)u zezx+xR_h#-CL)$qBxKfc`24}ej%BcE1A?YxzU$06S@MRmjg-FQP@#caPuzlS?Cj<3 zU(iXcuGJ$ru_)9G8l`wC9>2j$+&}~C$!mcgD(%~6CR~ZcO>U%T^T!0tWi_+RFw)g@ znYNGfiLlg_W3Q8;8%|luM70rS`Y^TYNLOO^v)R~>!9Uyj|FqOk5Y%TDkN+W>;keju zZvKkzakj_&XCfIHe*;_kXFLY)UMHVbDdb`D`?)ILjEs!Gk)7>y6CHTQ%fshRBmZ6& vl|c#v5A*CP=aZ4~bZo6W%*e>dcnbalEN-05H*$?%00000NkvXXu0mjf!?y+f literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152237975.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152237975.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bf29db30bc3d2c01a352f33d97a65b8cf3149ad GIT binary patch literal 2065 zcmV+s2=4cZP)Z!@9(|$_fG9U@87@wmyC>zj2FVI=bk`D zMn=XuWKJt1BjZJpIjxM0j2A`bv@$X>UKE+r%E-ugQDjal;~uIsg+P31U_AF!GBQGT zT*si&@Sl4g|9cF_#Xiyqu1(HcPdIR`i71V@_~h`n>{9hgVCB^(0iJnITYXe(B2IJ| zc$jCgH`BeCGVaFYGuQuuKAs1I#uuAh=OH>I+ZK1jKi6DSOeP6=K~kp4{n%{mZS#tw zQyQgb8~+7h(D))arBCqOQ+aaQoSP=*V>rx#hiRIarpd+K9+qfQRbE#MI>EI^kT1lZ zQ)^-$4e`RZW@3JZ<6^z;a-qKeUpTDIs9xC=|3otL2=W%LlQRFUHL-}=UeKk8eN~OU zS7quAbSx#i-e~McU}v~)izotyOztkGnc7?ggqc^4GKLnM){AKBJ3y8q7So<%(V$9G zlo?%Ca5~|yuLR}aa%{tKIps4qZ|rF_Nt+QFj*ETJk3}B!8O|xWj!C6er74PQ3ad&} z6zE-!C`W5fM!A?gCv>AVmKwNG8+2?Tu;t3;vyz95y<$INd$}mG#^$%=H!1NOH+&Qp zg&NS3b1&p4jJ!5K2SRx+of!jf$@&eB4>TsLPf;FUh^bK6<{Lm)J;J-U~(C^i*%sln+H(|6tgX(Xy5?-sG^Ic`i7 z^Rmk%UkE(~#6ZFDtC)>RM@)lyDZus1OpP(Jt51dQrbpFh;Kvmw!Ebiit z*?s|rbGo!``z+jpu?(nl_H!S44o$VwT2ls;-5mQ5SY@1ja=R1y-=@Vi&3X|Hjhz12 zV?T^n=~Ms6BY##Ri}LovVQg{jUa(+c6S|k-Ms{xLk3+%KK2qEbxS4LCkJIWhNtOop zG4N&z(CQJe$GbFTZ^z+gpmF$NnhaCOt8>{DWzDqd4PfuB9LxA{2&z0=U+Io@nOSUo z?9ia!>@R+=?#BuYr;I-C@^$LW+niqqXa~m+IHqO#D&C^c|}%+fs5 zORwXJK28(skjP^YAuPC-Nk^ooTN`^z>QLHnI|;Bxl#*~DSx{cV3opjw^l$O^f*sFPO>COUz+Z}(a`cXLfEnA zk9v0YIw}iTz8`7$^K-M(Aa6+nfw`lALViNu3w!U}(y!UE5>cMD$=$172`u6APA#W8 z4wVi>dt-|x`zdtXc)JJV{ylm)VRX;t_>BttR{~22EapqUjo2+>*8@D$lov` z)ImCiHO@G~tZX_9J%@JB&sU=;*i?y^(CQJKlsPWJenBVbrFU6t8+&q=+f?i{Z0c+x zROd%%@Ql*8Uv>soE1;vHPxUCIP=y6L9&Y1ez-RYxXEMrl9W z7<;?CI=m-)iX+R5WoJcIOM37{_54a&Jp!cjltiWISEY|x>0&r;;>tWRmn)04&gy8> z8))S8Duvf-+4H!xdjZ<2+uL9?cjopWqOzd3`AwQU2UO1H7L-m8#dy0HyIG9RD3_L9 zwF3G*8IbYe5RD-})96C0N3feX_nRV1d%ZL(H|NV_73mD(`274s?2K-1zK)9!Zd@nA z(!E%V#t!WxdEroN%942QyiajhbAci{2b}4lTvup6X~%v-c7|(wcjPxJ;JDaf`U|s6 zLEbndOP#bgU2V=yXbPo$EF!cyzb+u6TbF@{H?SzHT`Vm(($V(1xOEHeF6I?Mxh;)u zezx+xR_h#-CL)$qBxKfc`24}ej%BcE1A?YxzU$06S@MRmjg-FQP@#caPuzlS?Cj<3 zU(iXcuGJ$ru_)9G8l`wC9>2j$+&}~C$!mcgD(%~6CR~ZcO>U%T^T!0tWi_+RFw)g@ znYNGfiLlg_W3Q8;8%|luM70rS`Y^TYNLOO^v)R~>!9Uyj|FqOk5Y%TDkN+W>;keju zZvKkzakj_&XCfIHe*;_kXFLY)UMHVbDdb`D`?)ILjEs!Gk)7>y6CHTQ%fshRBmZ6& vl|c#v5A*CP=aZ4~bZo6W%*e>dcnbalEN-05H*$?%00000NkvXXu0mjf!?y+f literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152247856.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814152247856.png" new file mode 100644 index 0000000000000000000000000000000000000000..d6f5bf3b19554844ac1faf105619abb92c8e2242 GIT binary patch literal 2164 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814153132555.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814153132555.png" new file mode 100644 index 0000000000000000000000000000000000000000..813b6fcd458b482d6c0ea89b3b768d1ac6b2b8d0 GIT binary patch literal 9462 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814153748435.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814153748435.png" new file mode 100644 index 0000000000000000000000000000000000000000..8d448beedbf7cbea891d834daf3909ff6a2e6a2d GIT binary patch literal 20453 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814154750773.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814154750773.png" new file mode 100644 index 0000000000000000000000000000000000000000..fe8ad771e56430a8a3126d0d2a83aa0eb4d24aa9 GIT binary patch literal 5025 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 j#>Voi1!Cpr#g!heffdD{nCT}?%<6Rj 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155628208.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155628208.png" new file mode 100644 index 0000000000000000000000000000000000000000..6ea22b17d55f592e2755d8b555d1fa5e8c5192de GIT binary patch literal 18799 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 pQ-1OO0CSq2mAm literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155752495.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155752495.png" new file mode 100644 index 0000000000000000000000000000000000000000..bb1e4f6663ee98cfca690359f3206ff81cce61a7 GIT binary patch literal 5877 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 Q#^ebwy=G-pV}L;a2TjZ=<^TWy literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155933002.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814155933002.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c57f7716ce05602aac6f6f9c5bdc84ee61f9674 GIT binary patch literal 5092 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%0Dv`Ws4}-JEMS6}|xVl1}K%_ya zU`z?bh37AlhJ8>RS~CdnFEliN*d9K&M)K<5nkGI%d?#QOjg8bHQl*^|Hh4Tf$+HG0 z*A{vQAX#~AC6G3{<+eY3C?xUlK!A66t%UUgidga4f#CpUK7hVtfaao*0MofDVt?Uk z>qgMnyvP|1q^?UQL&R_Xr#g4Nh21jq-xtXm0=z0lYzKx)0g{61qVRcOIZZn%YTHK% zTA6|hAvIq;fGGeN?cXANtE|m2W1Pq>U1bP>#YEy92oP-15`+p733`1PZ z%X2p!&fBil(Ko=C0quO*N~{=EzyCkN(pe9)@kiIO9mz7XO9c&KQ@^5NtE_e3|C{cnjTx)h)SJmP2vQJR3%aS_!EkU$S7ia2b3oWjsi_(mo9HAIaHI6cI`Kx?kHbMpSP($_odk>^C!($;bZ1@F_IDZ%YdX}HoeQv4@ zo1aaCCfdHzJ^$4zMvrg zmK<4}>5zBN{};ID{czNI$Pl?Z8XD);w>Of2lphdx;;$R&_-#C&MQaEsKXcg#xkel| zRYz1iA`q{MVVmv%Sqr&}gACh6H(8m%F~P^4_R07kKGLG1?am`-$D&(&Y4 zLwz3xb^F{I`=#bzHDXW(L0va{Ng@V$GjagLjxAR|4jaOtt+_gCjbkZpe&vuFHSQl! zo_>%Av%I30&z4J*i5-otdrhX0n~KTpk1$geJaFC#{9%E~sZoWo z<%-vFnj=Vw(*eNBfQ?5EzL;(g$nDo#qf1fa6Z8rVCgArT0@FF|c}Kt0bDjn#l_mQ7 z0HKsKM_hvSoMK?|N<@yFl`=>C1o(>v=peL)L@$f(f5r@Z7Ry7lx1fL4=k`B)OY(`) zX%KLTegO2iz(>&RfU$G|Zp#e({azfsu80SY*Gw)BGQ=DP)ag`5A`WtkB2R}imFX8Z z;6q%a{+-Q}o5e(ld&M!nfD36z3i>W{o!ClU<8hD?^iK`AZAvn7=zQ|-y!AM-;RpSb zW}vnG5?$A1Xh$zl^8KOU@Yc;dc0VT|n-MH=}3_u9are1xmB z_@~F4{}I-0y@5gI_kf=kAl?QvCj+hae*y(~#QzgP#h85^0X5p#G%LVnkhIzYw#jCe zAh;A|KlzufZb#%TTKXjKXyLpn?r+AUk^X{&5x__qzG1eQdUrOIdY)7gFHfEq$T5y% zAL5s=s7|riazOEVw#1gsUvn@g1r!C~4qs^J<@?pq>EU}OgG?6tiryjK1Y0AOn9Oyh y%%%CR1A8!8cEY0Qg2#7pJUV=>m!Lhif3f}*5~EdA_8$2A3Z$oPq*VoTjQ%gB6zL5B literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814160924162.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814160924162.png" new file mode 100644 index 0000000000000000000000000000000000000000..611272cf17d00ede548d2e0a7ae39a4564418cf6 GIT binary patch literal 18952 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 z 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 H?ZW>HJ0%|p literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162257363.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162257363.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd28af97faf28ffa35da050ddcc5dcc6ab50d357 GIT binary patch literal 14781 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162307489.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162307489.png" new file mode 100644 index 0000000000000000000000000000000000000000..7ddc95bcf7e7bf23521ac767f85848b9f3f9a2ea GIT binary patch literal 12251 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162842038.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814162842038.png" new file mode 100644 index 0000000000000000000000000000000000000000..333896f612f80bb98a87e02c483224db8df38c90 GIT binary patch literal 18247 zcmd74RahMDx^@d8xVwem?iyTzyIXK~_uv*hxVuYmm*5a2xVr~;cm5*Z{AA6!*53cx zNBac&D*6JtyZWv1j{AN(L{3H&9tH;n1OxiBY3;>FqV#PaONT^G0f8krZt4nSOic8m}EN`tP_J6T8VK#u;wL z+^a9=_%CPpFNio1BDv%52wtvaG5K@HO<5j(wLe9^+!cnM8jty>z5WdA<>uw_gikBr zga7+27U2F4mAe8mulI!v`^SM;=!Z`Ko#+>lbn`=(l5}M5QNi}6ZZLDLaBjpE|MZHi zs<~bF_uoggdJ;V_OLo0h&a_x@hQD2`zBq!ea88dv$@KcX%ylfU$tG@(GJm(yg<_hU z_P*)1&2zP4wka1en<6h1%N{Mz%#iUDWx4p_xZ;zhSYapQ3h|W-(*_nnXR>p{vHH z^3Rijci)nnZ30FZP-79S$sTCnN0D6Mmnora@r>%2{Wh;a%O}gVF?`7}Yr;6o%{$_z zrE3rit0fNCzNI6VZeo9q7&&e`#fV;6^g7k`Jl=Q^4ZN|u*6S3`Wqf;}lLm>a=#>=; zO@?*t?|)8@84)QMRT>Z|zr$tS3~999n#8vka*N+mhZSD&uiEFu^mJhrPUP&J#4z!o-&PZ8i zeC~8dT*lr%%E1C5VQds6zU@QPX|I!ObB&~mvM&6Dc~t{%eA5|w_Ny3SX9GrA3XwW$ zj@jJ8ewg?Bf#T3Ht|?2ux3Az-v#BzY$2Oe+4$dl4Y%-TNJzfUdgH4;p zd$sH7o|Fwo-u*dT-cIgCyu$lZPx~g@{^~LloK3Wc1AB*DuRG1z#@^{(BtQ7d6R`#p zRmCb|m<@~pNlri)pY zBX0A%{9(gtCS*^3N5oU%d$N`_d24zO3@b=ycEO๬_PA{pHT)fx%b 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 Ge*XuX7zix@ literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181022711.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181022711.png" new file mode 100644 index 0000000000000000000000000000000000000000..84a39b1fcc295f139bd3420cc9db8f883f1de2ca GIT binary patch literal 14583 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 JLe?zgzW`l*ty};A literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181927733.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814181927733.png" new file mode 100644 index 0000000000000000000000000000000000000000..77278a2dc71ba9e316d61d2c02ba0d7a992d07e1 GIT binary patch literal 21473 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182034409.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182034409.png" new file mode 100644 index 0000000000000000000000000000000000000000..c72b18f742c0db8329b46f59ec466f4624d2ce11 GIT binary patch literal 2842 zcmV+#3+42QP) zJ80v~7RUeJ<#sL%4gs@}Eus{`jVqHXptv!J+eAx>?d{4*XVeO{CY_VY?o*gmn#+J2 z$M99bl^T;`{Kz_Y_x!3jvNZ4Wnz7DbA3uKl2LwS7M1+6s zy8;A35bqHZjs!sv36O9k2!cr9-}|n>?}TdhVVvc>PcCfj2ED!3h#-hfA>kb*Z29k5Hq`>??H_A1i$mCB-Oq2H$p~8AFP#A77KRtNc;$s!`m-lhKHNfjt$$K9Y z`>T!))8WsS=<}o37SC;5StINla;pLG!DVP-0(a9#CH;eu2zP1B$Wf>Aa5&=1CFi`Ut)s&#s~?zD#)l$+dHh1vLcdkOKyy&`+b&ru%Pp*B zT3PB(0I~(Q?Ad<*-lG|OCu^V9b#C$b<&3NWJ~18T27s;#tEyn}+z!g>*<;jNTu_Z* zp?Nrf_PK}p9m8fl9uh4Z090I@<}e%f@Przg=PEGtW?5MQrgloWgWtD!dBQe!i@Zj} zK3#S#HrB#;MXcFN26oB+l&viOe8eon`dtn4TMZ^G^v~oPk6?ZlTHJNuUMeUk05T~1 zk#!~XR}aoqhjMrV_$ynlV3szo8lO3{4Dl2EAMd_8gRoTaJwmm|ziTnih7x z;5u?^0DPf~nl)d6(JElzX@SLY&C@`VhS1s=qXOfu9;-qcxibT`A8kRqMXiN2Mt@JR z$VV-Rlf!TkjI67z+!V$bpYZt#48}i4G$$13j89HYv*G3|_~dIw$&zV57b6x{{mww; zrycg$fvA;xxDhOz_VWUZ=lgI`tavuS`_wob1otb|==Ee&9323z(+fUZ4_rtWKd1ms zP{=PZ`8#k_(P>qXL(W@pCa&Jn8mnHQly~8DfzkIFa;FzTn|h859P40-^KOKvmj!ZX zhBSWJ;le3unFe!9wpt|%O*NasSZmM(Mb^9a#{ZQI)Y#fwLGSu%PvM?A%Et@LKXkyn zwZQ}{U;R)7rcTgK)$DU6aB!4i9=Uu@LKleNqedCZ)WJ>Wa%6XB-GDW> zVtjhnnpZDwfhmHU#943$y?TTq6ex^A7calc?zWc2oif8+uL>F>s;!0dpQg}rU z2Pl_}dji*<`*deu@#8Ci6973>S_ZdrJXhCx0A|jP0`12-7rL=}ao5-#1|tt=s-q^j z*4*Omd39#cSszED8yfTjA9sUwaFXTZLG=hlEHGITxK3MJ02gd0cMQ5W-uu{?;Fg;U zTQk=WEmSS^FBQ0t@}{Jy;QbH_7k*y>K9&b#w6z;vW}^dR=dxmbB;oiK^H-pd_HB2L z1r$_T46Frk0knpD1|ITFMJ;`fQ|-)QIEr+ecGHklE={p9X`xOllR_J!a46)3*6g|fM;J>Pi8OCoIt zxq5+89>~c`;lNXj(${;}Hp)y-iLZ@db}!IxmAHqp${HJf!>moiecFywt=3xm1 z`m(reqXR>7r!zf!OZ?bfu&d~WO}K^Z$L^X!Jgv6ocx{MM;Kz5w-R9eIEan{0C__QI z&{oe&$YF+Wnd;5wSf!EViu--?N!ZbsLro&wP?4YU?I)m=(??V_`(P~lPP2Gl(ngMm zA778{BnyHuF37z;(Zf3P%{(FO0dbCdp$TWdn=t_JSJI0oB+J_tcj-fSD`~fS z#pwd!+2Uz{jfnJH+`^5N9Xpv2uXon-g!MZH9m(HKZWHgr(#wA_IsH$hFQdErN%dO) zFu#0GGJUsNEIU5VS5{?8x5DAcQBnW~?fP^DK5JUp>Ch#3XX%YzH z_ko0?0HsM-lWo!@thjd>lqO-bpVw`pyd!-Q>(f;~56qHA;r&5wH2_MJumM}8NvNZ9 z3E?HY(!E)rGzsgmB5lR0dvypeT$Wx^y(&#Y^o7j{X%yZmlqP}FB>eg`3Bw+4wD4J@ zzb9y(Wqd7I0+c3U)r%)qjmL@xb#D+3*9cE9O;k?#o4Wls>8GYis9LBUFEG9h->>=Q zxd!7j`4w{S2}+XyN|W%*(_eR`&mo3EQSgP+>JH z$V~?u$7(4}f>i(1GzmLMTT!*pJj=lyro1jtPLm+q*Js?~wKY5Y+TA0RCLt4)CV`i` z`!oslI|CI+-bWTFO~RV&B5eh?IAd@7_DM^VkgvdKxv({F-d8R3F@y8Yo?e$N&HU literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182050676.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182050676.png" new file mode 100644 index 0000000000000000000000000000000000000000..037f997f2acae7401257b71126a0e9a9b1df56ca GIT binary patch literal 20391 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182522372.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182522372.png" new file mode 100644 index 0000000000000000000000000000000000000000..cd4dfc87bfd16e3e864b993dbdbdb0f0d1cb3a81 GIT binary patch literal 17745 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182535354.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182535354.png" new file mode 100644 index 0000000000000000000000000000000000000000..19512ed995c33d6f551da977126be867a6ae28dc GIT binary patch literal 2859 zcmV+`3)J+9P) zKWN)p8;74;x_Jn=1j2=Oh%yu}o=m2KXKF25=g)iep7%ZH=$Aj<6 zyC{+KeKfsoa%v6NzV$N7jUMLi4f?0)hI)!RY|k0p>S( zXT|KSAjF*)^!if~<9I#CJn3gTpIK|$82kQD67Kypiu7x+UO?zOk^5(?-}6z%x-!WR zRv({%wqe4!aRJSudD0*iH31yQFbqv8$Ikg+)Y+2f6_%SWnSo5NAYqS-Q# zifWj)jj39eDJ>1#Bz?phnu#-%TQgLo=Gkg!-Ed+X6zf2zj8)N?-Zp3V>h?!eFO(A+ zVsW;6gZ{Bgt!s^3lTzpNE`C)p#} zR*UTsh}4d4>|^!M@S9WW{zTu_sh=q4vw{;(wlxf`Q(u2|8BYwf-2-3<6^rWrl+opE zB=GsRiuwMCGQ($oGw1b}w684HTiC95kGxJ)u{b+qcCFU7)$Hi+%$*YEg+pK0=~gUy z7gelEm&Txsb!D)3+eEj9ct$qcHHImTkvlZ0-Zs%c4c&USsCAYMiW!9+sn=RFXZqpLDuwq`I}D#`OCm zE!&<29_c2?Wwu_@M_QiT(;YMaQ*XJBKhMGPU$4!pbOm@b^*yC-Q6n@a)W|E`u z!3(cz6!-mgSr=cM=`xT<#uTORT(Qk12O6-fU={a?rLhY#W0Z!HLk4M>vJoj%^jee{$2vw#oGSSKt81 zQMxd3u61-b{j{#&VZ5QqX5UZ_HBv8?uFfMAm3mcu=`M6R*Sl_=Z4A4|TYqZkMdDso zVz)R*6H%wI$D(HoQrKfn0uH(JnNh`@KR-)YY-=ACi{7z@a~;YS{aK**JsueU1mTR= z)kc}_(oX!!;}b00|8pLhqEWiAu`fV5mkhDSPAI(9^5hb}zMLtK-XI$+NuN4noZ~7- z6*wqrIOFtgFW|sespWGi*bKh$a8X$67Al1TwN@EQ@jB+Yhy1J#UwaDm=&b z_yl|RP2c38(%;8T?H(=K8LS*p*nymH9Snds@oP%mPkoBEvA_WgX>^Y0T@+Mwvg|=k zVUN8)dZ_x0@BaEE*kfgsy$Wek(*?gxvNbRZJh*KJ0|MufDSO;q`kbzoC%5q+D4thI zGtHbKU+$-9$F10KyJo0{&31*dtSfcKIA~O7yE!qTzZb#b?yl`eZ!@b)+dvCMm&@of zp5(}DHHvTMY0-1j9XsR>&yrIL=aK17X!kMQ-5F1ElH9@xZrK^-i*f*C!{wo$v7S zkDoYu4Egp0wBq7qxZLPr+tCzOjl*c!WB+sDrK6$rKH1g;oLH8+sb zl1Y{-yz?}RSYq_}0x9LvMf%XLZg|%Ar&g0beT=}aZqnJSR4g)3IHmJimMWc1-i?mG ze{}bB>6y2r8idZBdG(InfuG$wn!aZ~UlnNAk~T$l@O|STWBIkVdn_a7yOF+EHNm17Nmn7 zzsze?g7E7i(({5KY#ky?B?!XSA&yTFgsnpypCAZZhd4e#5Vj6+e1afs9iqUzjfnKT zu;qy3OMytwXJj4e`6a(iLZs(c7@u*kn`UTNpig4@H2Jzn&;O!`^n7O4lAf>8I%ak) z^4m0s^n7;0;td)8-o{+AzR8FZW_#Y-;XdpC2woTId6Aw+q~~Ec=yI;l@8v0Er;>h( zL8Rx?i4?3%=bX8@T$SqgZ&4ywp7`o~yenHPLDlXHOV7VrMS9+w8D<^plb%@=MPTtx@`&0##xDx)4MM}8+Qz(NF4FUxM5O0`cj@_B+oVJ&Ye<7g&u1f~P+o5IFzps(+UZx3dst=J zQ?d5!;avA|_KQlqRYRobMS6b2{N~d0YTe4AudlG1EzrvgGkSd^nAjXworP0?({Z%wos(!W2NUq-*T51#?d1{vFW|f=`D-QD;B+r z0(TvEG85@}5b62Zowr+hK6V_XFJGkRvrEq}e5U;@IQtksjuwrxxc(C9`IQmrc|j1e zBGU7MAZ#5XJ^$Mw(({6_E+RcI2*TDOvQ&Z~Y#rkG1VPw3{tr3{;;mGb(f$Ac002ov JPDHLkV1lTE-rxWL literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182547603.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182547603.png" new file mode 100644 index 0000000000000000000000000000000000000000..73d2af5d1e48735116a1bd913e99689b6cf0aca4 GIT binary patch literal 2101 zcmV-52+H?~P)O000>X1^@s68?I^)000O4Nkl72;8F;McCa#pES^lJfa1lVEh-+m+f$m&XcbyRHoKF(cMw&!gDj4q zQ}E;^bf~-(N}$w`!Ck*^I7yadJCWl!Y5Uy|Iz;l_y?giW-Fxp`|FgTh`(G3ah2oL< z_t&pq&n<&Oq4*2=&vOf)P$>RRlygxi6dOS~7llHx5tMULETBn82*gJh;8q7wn{fKhA$Y=JH%YTAu*&HtA-;J+KmDlHK^*BY_A%dQ z-Xv?0a68QCXRiMReLN2a?nj%_;2}07+g7)tKUbVnMkhIaL0+f%^;mCg91mM`AZ5_aicWa$!%>AM%nZHN!QQ`_cSaG0<6*rRa%%oP z&KRKCwWR| zUfc#9TL^49v!xqrrLpf>kIY&wI;k@9E%{7A0{4Qq!lKdwdQ$dEdCJ7^^KC3r&!y90 z>@S(W!QrmP^vmTMjwN?W=k%S8ic;%!PuonpBY`-IdPwabi1kjk-D6g6$G$(L-rnP|1_5i1P0^Z5tAjY& zW_V^|n(|+wn3~J+KFK?Oj5Ox7!EIHs+a)ec6Z34yv|Punfm{@e?W@zM-&2NEvAfMe zVgYFTHuWD-`|}X}s6&y~!RKqHTT+oRJ1=Jj8n}%$(;yuyp0nu_ZdG~PieA-RytF>g zZ>Y8-xd#r7XfE6iIW=RQ7jZ0$#+Eugc2d=orRyQ*ZJH*hSJMUkHtDph+?>ZU`GjQ) z&v~TEOsj%^d(GtlzW$h^S7s~OAB9l15DRT1;PT59ZQp*NERl2g=_mG`*7qzbG9%qE zTQ9(Hj+eIWzmL}7RvvtF`{yq75?Z7Wsh^H?{97e<9x%%+JCwGjTz^iIN;>T-8X6`2 zamFs-Tw)LRA?2x4Zx8k|Li9)B0s*EB&mx5nF1fyqCeV6Ibt~i|QFMUQ8!|0d3ONV> z#{O)fdLu%%d0o4^2>=6!i?PPuL2QgoD&@2+>ynx?eMV#0ekI2;4)!3e&)z47x4Jy3 zAARg-4rWnj;C`52uT^Yz0n({A7Va@>E}oE4 zk8k?LZ9Lbkei*_h&!Oi!@n=bf%gS{VxQiCPoYuW=6 z;Jl0aY5}(sz7~_UAkjvdOEDlH>h?z=RxJwiS{3y1h?BzOTq#ev_M_ehmt42(Olp*_1vR?@OL)9arx62( z#sHG~g6ObQAmTG#ZNu&L9dwEXZiAh!z!CzB`IKiZwyN0e5Z^TAJZdf;H;fiJ zp{2;Egsan>eQH$Owv4EHAoT_}qX2lj_SglS%U341P+ImnoG?YF+7^g5$PK(g4jx50 z$x`Sgv^ze2KPf{Vbiz?_*Rt}a%uD&023Ul3okC37NfB*KCdJz? ztI@P7=xFGP9Ys_!W!;4Sd!LH1W(P@z0H=3|*WQz->^++y_U&B_yP zK$>)fjpwlb`i2vxY;%2E)V~vvDr1Byi?r)a< zC`8*oPU;*B2`6(kp$8F%!=v?Ye`K91RXbXcGCUOH)wXmz=BzGZo`=iRjaCKyj)=lI z*hAxnZ$)gOHzM51)uj?-N~_mqY1Vvtm_}~eECJtslBprh$?JFs;bmQO1jGUw3aI@Qb$<-DT(Q*`V*D0EvCxD9YT>?rJm*~u#_%=r+%=*>o- z6B9Zj)js24`<$Ft5OI}#?BkCu>gg_)hS|mF`$N381y`r@3zoVai!1$)@_m=y2__vx z=9JFqY~b+Wz{Ac&ghd^3!JZ_m*p-}u;toaSyxNw$Di=Mn#`G3Qr@IS@a$9(^k z@+cI`SvxIKC=`lCsQ(qMP$)KnaxMymVk0Q$qEIL{f^sejg<>Np=b}(3HiG)Gs6Uxy fzX_vI{096F?)Z;TPS@iH00000NkvXXu0mjfT1*v- literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182606386.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182606386.png" new file mode 100644 index 0000000000000000000000000000000000000000..deaf9d74249c818214bd3abebcf956d3641ed5f4 GIT binary patch literal 2557 zcmVKMh(2fk1H1{QUFJ zgBGDBABzsUFlYe;0)gOTU}(?+2>L`MjW*{sE~=E)=1CL=Dv?0&i(*LAG^*RH%qNS3 zmgS>IO5})7yQpl+EN2ESjUAQrocAM?>l7ksw9qlDw-a=;`pkK#(MM5jqlYtq!@kBllK z30-A`3R}M13M!IDi{(gSQ+lBwK1$@beS~jFP%xE;MDnr1$o497GlddK6Q4dJ zFE5k*Fg^J|OrhRemn)7FL-3_5sfT zZmzI+?U-Uzzn)!5A>C8?_uDgfs;>-D_@1Mfue(}~kPL@s*=V(agFNz=*_tPifu&dg zm;D~lV6hz*StYH7Iks7OyOop@IhI&w>v9~$I5_LnQ<4%n;uE_L>u)b3v4p1}GoMjO zYuzeCm9*xkymn03>~p=R(JsV2b<6;-hq@8(80UOdYDyrIMw`Q_6dKB$^W}&zB55># znbmh;t9|Q!C`r!j3tr-yM!f$0-H>@gDHO+NQ+m=3AFdy^$i9SdB#1;&AMa2QpS#NL z%jTYy>i5Dy{%ne{&HixqoyNIrQP(j~V{tSs-n_oiK6TOF)E$LS{}tu#(^*zhy(z<~ zI|`HRv9bRti(k~rXJ;lEJ}g?E;Lf9Mq?E+(ZURrIP`?=E{i_XKF#^wC>@mIYIq;vJ z9;~ja`y4uJR%UQle@*3Nr@bqrWu>Zi=t`zb*E!yc|rQSSGPw{ z9w(6iGG!`w@keTpOIJqVplm3L`uWOpG#w{xd!8|c_~k8YK3vnc^nMi*%o}B#lvtI` zwbUepqEgO6;d_qkb6a@M?um;)EN84cC)siZ#+1&-u%34N1C?|vz|p2`jag+( zA!n`yRMIW#7L)VVo~l}7E;|)r8+IPu?JX=exvrvIgS~&+LSq1?`0YhF+<#_WtM?>E z0ncxyfKfhmz2{BYtToHZ!X(2C^RaP3A&=Z~K13oJ@>1PiZyHidH+;BkiZxrVfZM~k z~$I&kTp z1pq4kF}o~h#nxwvJbzuqby*)3>4p#NBOmoT8){xLFCN}x>wcR22uT9Dw{P0 zR7`GBu@py^C)-uLeslCCf)h~68&4Zy=(;sV_0Qupgx${v=h_Jc@wqFMGrC-5 z$J`c4+?HA0hCoa=9yMhIWR@)@rD+{XPSjotcDJc}E_w;hB{bsnjB$zu92p)q937j@s@{q25c8N=fh{O7XC-;`N20 z(j^5=^LH4YjN@^`(c9(&U3_~)d|Ka3#X^ga!{LP%N!&KWD&XXp{WEl?5kt`yXbey4 zLb7bRf)X;qsfZu%L7C-_-(x20YbB?K=$Eb{p?jb%d)Q-1XQS1aoe7Dnm%uxxq0QOL zs~nqedb!I|OgBc^P!J!xtebLpJ-FQV5ZB`6fxn_?UWdYa!>X&0We8;RqOfON$Nuh*R$d61{9E#Iw&$hZ|WO|g}aSVr1G zA;J2M9PtU=IMuh8{W6bVQ)))FEvM`cu#BLUo4zsvmifW4PNhVSxR!MeaT_m8Bj!AMfke|E+@O&4w*Z*F)#(2kph_T+l;`Q>>YV z9^$pi#i@#(xRra!0U0@}uobeHA;%M28-}NczEG4lzcA`L7ixr49WM~2d^cYFOiEWu)XT6S9ijPAw%cm=CXOqb@ejK$fVJ1 z_dis4)NC&6$E}#$;+CcmILMQ5)NV3gbTcN@yfQ~5amIc}{CH1xdEzjFMV`N2A}|p| zirgY@pG&Zv$Tp@sy8VE?-Tt7EV4ftoSS>YC-Ckwh9IyIyX1qJ=Xn&pH<9IDaP=A`- z3deVVz)XtN484DEXy@qzqO6cI+BCl-G>=qv9^HjI_gP#>ky=1kq+e$V{P~Y(d~tvI z)StSX!b#<`cOlm!wEYBQX;3HT%PlLx~K7zAc5dRGdbDow}t1&pA2RA*S~x< zU`cfP_}gSXA@4-RKL*uz{XG^D2n2$D)5qT?7fED-wv#X&@l(G6(Qtb1M9hmo;N%nW z{|p6!Uq9mi8J>>#7hVE^KtP`lPy_;j;FpT<32mts$Z`kY3 TB;(-~00000NkvXXu0mjfw9o$Y literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182618283.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814182618283.png" new file mode 100644 index 0000000000000000000000000000000000000000..b1f7ea21bec391d14e252df27ec86428e88287e4 GIT binary patch literal 3209 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 R0DLh(mS#4lwU<%R{{~SO3fTYv literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814183418474.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814183418474.png" new file mode 100644 index 0000000000000000000000000000000000000000..475e203e4966a58e277221907db2f93c21e6e06b GIT binary patch literal 19872 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Ë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%0AtA)f0rswF&Ku$v zv{lPIYkv$CSu`Js43esj8(tZE4Wz3Cj1=DUJaTydAz%HnOP&#VFTOkK>=^BNU!$7o!8nfF2eewUuEbkn!&j!7p2dhykj*~A8Gr&0OtZ6 zUx9&*pYW|=pbScWc8^9fQrYKYUFZg+6y>JPntagP0>UpYLPpC!e}QJVmUE+N#_9sUO<@5qT5m)atk@iZdNPTk|U2wgY*`~S-3{R;tJ zD9DxwOqji zcrQs}TYjG|=OXWw%-=L#aFNQ_dL7u7@a6F`bofm()T8n!H!MWK*2r$KqMvOQFmmuI zjg;FmLs3?(o==s(^~ zcN^DRjF#<2VB(htS$%~j^dX3m>b?rs)33Jyj%};hVgiT zfllRws!Sd6MLXc+o!~d4%Zs8`5qpl)`9Gcyuqf5l`wX57-opf~w^9L93*RbgdEfh; z@%^BPNfV`as>=AA+xyf!yvahOtN0P|CVR@nr=a~GZ60FL2v95Qln=*aDp8pe!g_sB z#_NY;niC9o_2HQWR$|a~wtDJniw^x0!WFTCx(-q_<7F z<5vcOt*oRzyPSJt8H^i_Y>fS$IcORr2dZ=5!Ca_-1)I;O7-`10qg45yiadFv|GQ9? zc}@L;+CG_bM_g&5i4Uz^#pv+Le4~4l7PvNR28-~xR7sF(I-4h1lyF0{qz6smJ4q+^+G<~67=!QaE~g=WIL}_S5U<0?z-)gsCWa9zMun zpt{yV{2i}$5IEx1-(6S`bVmrZ@?>kgCngRg-#z=37Ns879CC0x`+nlt!Fr#my(}5cx2WTI zi-WO(6i=ABsbUZQ0qpWD{xp2-EBwmOvFkM1vpQ9f@njad3sOoNhQ&IB*LSn$1ioYU z=Lf-p`SqogwzV&21?qKaZa6WPp7r|wS@b)}D+~^Q|FmB`{sUuK99eC;Ql6u4zpS5? zd-eF|OGegCzZDaim)bh2ud6*%mn{2wmH&I=MH5a|#YL>S_#b&(&$Ut-xFzQCEzxe< z^=ne5rwC4o{dAK1d(GD@xz4}8OQZvW!nzV_$@&Rn5H) zALkRgtMgL=Y0JX24B(apJ(<`;SuA-X-_JEwA1iu#U`}oCi-~NN#R+xHzwCQ1tcfZ) zy5XkYZ_sYgSIXespjF%RtuEfZtEZE=x<05Dve`4?h8a)AjQB{0^%K9JZMr>u8u$Lq zb5>^qM`7PRy~=#H!t8XoQ*F-Un^R9@*)L|jW6b*dd*R&v6?3JhM8?b)w6TBH#=reH z4{&Gb!B!5ZZ_-=%leG1h_pdP*srY}l?R4fh;nR7-U-kd<|9$tL_qpYk;;w{HHvN&M5c zyWVL(|7LcW<_x{c%tiClJXI#8fY#3?2`2(KlQ}Z~pY+HjSzPDaq%9A>RXLwJv$Oy0%~#A9VZAM@3_N*_!PC{xWt~$(69AM$|F8f6 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184416348.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184416348.png" new file mode 100644 index 0000000000000000000000000000000000000000..dd5ff89dcbb27cb5f30106c20d1dec6bb2decab7 GIT binary patch literal 16430 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�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

bMz>nN5KS{HFL?Fm zQ7U4Fv=^MdBNY3Q8z>I|Hh&YEUN-5fCT|}OJ4j6tE>odsTL;|!4-?-%aIXkOcs?Nt z$pwZ61FxXCvJlVTriQz6-A2$|Qx+v8NH3KD%P3b*P#n7*f5E3kB&_92MdIePxfVeA z-L%|#9bA+5Xg$YJ(D~aSji%|ZW^PkeAkh$_ZnlF@eLMP9l(~C2C^U9G?C7!ywz%O; zBtgtiH#i|$nK*bp4=7yTBwD{ta`q>);c@OY*o8PF*(}7e*VI|c%?C0drurHTOzyC$ z)O%J{0JmDH5zrlQYLl>1%pQ`SeFA?Q)VYibNcXJ>39XzbWcKe<1Y{v8UEp3xrX$Gx z@W8TaKv()TZnIdfSHe{w{ZEv%F70kEPs<-f>LH%L5ajgKlX&=M42nc71@prV#1*Pj z7qYQN0pTe1VInz>&y4C|FO%pnEudShR%h7eGk61IbJ?W82|p~9F+4#tKRoISNqVuj zUujq+>{Em4%AWP&YyrG2X8fP;p;y>5LjG<-K~YG+gd>q;70cUn7EzemSqCC`g?Avb zxKmr<1V3&G8fD!Y%R?LJf>L5CV8cbFwuP4%l}#H6-ZwlRO4 z=cPXzto@fm-u>f{x~Y6f{cdN?1YkOB!Vl>Ih52sW-Tv&fAczl!;J)~FXijF4lSHef z@7Vif6g}_W?J+OpVM9Wea}vk`(bAkXAz7WscZ&`5Qgk z_VBRw7|eY~{V&O+Sd5`y{UO9~*LqZ#~9AY8eECUz{Z4Gc<3xPi1!ylNs(Y0PNK@+%6h|!%|5!)V zz|H@scoJRZ$&Pu?ASf3`#Hl5j5)AtBS~V@ebImd_gqVOxyQ?t9t$(mgt%jkLd&A1R zx(@}P?1#3cZ{Fo)vEtt7U|9jCVpbAwj_!aSj~~au#&@NBYt(MGm)zh@iiSTE4j88u zgvVu)WV8_PW|u~Q0fA0jjG-lS4~+?8e>mF`Q>sQz>Y9uJA$Drd?fBsV-ly%c#$&`07hKu>53c_W$v`&UBZ z!-n7q8G|l)O#yZ0H|2io-EYqD##bNluY9BumHNmYh3qBr2kgftIo!0`3LQS=)k>93 zjWwYTD~l_3)f`!8qU^UZUx1F$KikqCcMqV-6r2I40jNqd{DU&IW~Lm>S?dT`_(kt=<|ni4mC>GuZn#t^ zfVZ_O5ik#Fwsn5prqr+Ibq_?#V!tHin?LnGd_H3llF(OOPD2R^pLveiVEvim?4gRC z7o$ft7ugM4a?EZ~74|857C*wom)DbF0AcCKe3yGn-Kxti7wT;F%a1gCl6H~%h9g?q zqI&VGI@QUsWpR^jYu91kE)!(Bk1F`1C7;pd*Q0EA`uX55WAb1aiu$zND#vk36~lKL zv=go3j<_t=iz~-d7C?T%EbjBxX!G=T_GI963-dFdXf5*KTUJRR3EBO(AS6_B<_Q)& z{2&_by*#)z2>h6hpNReYSN-P^c@%aY*zlj*)GzQaa-A;;P#^Yy{{sLaEv_I|Dx&ZE F{{a3eEu#Pc literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184809027.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814184809027.png" new file mode 100644 index 0000000000000000000000000000000000000000..bf45da8d726bc352f0567fe06b9bd7e84e8d3130 GIT binary patch literal 15157 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 WA~_#=VgF_Trzoo?Qz>N{`u_kcRS@a` literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185220725.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185220725.png" new file mode 100644 index 0000000000000000000000000000000000000000..821fec04e3e88356da339ab4629b00f549e9044b GIT binary patch literal 50570 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185236668.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185236668.png" new file mode 100644 index 0000000000000000000000000000000000000000..40f442f2dd778d821cb8a7ed18ab52e08b191f5a GIT binary patch literal 11179 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 KmadXC4gD_%dP4{R literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185448434.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185448434.png" new file mode 100644 index 0000000000000000000000000000000000000000..2bd9a21a67de898f71e13eb328c549838783589a GIT binary patch literal 7143 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 V6FnZKqXzH*N^+{QWv|VH{|gsjzf1rC literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185502940.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814185502940.png" new file mode 100644 index 0000000000000000000000000000000000000000..432e56a7ac98fda5c20ab330ae78d4c84cd8e622 GIT binary patch literal 21389 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 bVVVC6gw8BeKsN*CP9Bqk76%FpPX_!0F`@ep literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" new file mode 100644 index 0000000..e2f31db --- /dev/null +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" @@ -0,0 +1,1549 @@ +目录: + +[TOC] + +# 测试环境 + +**OpenCloudOS 8:** + +腾讯云:2cpu 2G,NUMA节点为1,x86架构 + +本地qemu:8cpu 8G NUMA节点为2, 镜像是OpencloudOS8.8的qcow2格式镜像,x86架构 + +**OpenCloudOS 9:** + +腾讯云:2cpu 2G,NUMA节点为1,x86架构 + +本地qemu:8cpu 8G NUMA节点为2,镜像是OpencloudOS9.2的Minimal格式镜像,x86架构 + +**OpenCloudOS Stream 23:** + +本地qemu:8cpu 8G NUMA节点为2,镜像是OpencloudOS Stream 23的Minimal格式镜像,x86架构 + +# cgroup version1 + +## blkio + +主要是限制cgroup对IO的使用,两种控制策略,weight和throttling。 + +### weight策略 + +**需要开启的内核配置:** + +- CONFIG_BLK_CGROUP + +**接口文件:** + +- **blkio.bfq.weight:** 读写文件。指定每个cgroup组的权重。这是组在所有设备上的默认权重,除非被blkio.bfq.weight_device覆盖。目前允许的范围是1到1000 + +- **blkio.bfq.weight_device:** 读写文件。指定每个cgroup中每个设备的权重,覆盖blkio.bfq.weight + +- **blkio.bfq.io_service_bytes:** 只读文件。cgroup传输到磁盘/从磁盘传输的字节数 + +- **blkio.bfq.io_serviced:** 只读文件。cgroup向磁盘发出的 IO(bio)数量。 + +**测试用例:** + +- **cgroup-v1-blkio-bfq-weight:** 测试接口文件blkio.bfq.weight。 +- **cgroup-v1-blkio-bfq-weight_device:** 测试接口文件blkio.bfq.weight_device。 + +### throttling策略 + +**需要开启内核配置:** + +- CONFIG_BLK_CGROUP +- CONFIG_BLK_DEV_THROTTLING + +**接口文件:** + +- **blkio.throttle.read_bps_device:** 读写文件。设置从设备读取速率的上限。单位是`byets/s` +- **blkio.throttle.write_bps_device:** 读写文件。设置对设备的写速率上限。单位是`byets/s` +- **blkio.throttle.read_iops_device:** 读写文件。设置从设备读取速率的上限。单位是`IO/s` +- **blkio.throttle.write_iops_device:** 读写文件。设置对设备的写速率上限。单位是`IO/s` +- **bklio.throttle.io_service_bytes:** 只读文件。记录自从cgroup创建以来,对于每种操作的已完成的向磁盘传输/从磁盘传输的字节数。 +- **blkio.throttle.io_serviced:** 只读文件。记录自从cgroup创建以来,对于每种操作的已完成的I/O操作数。 + +**测试用例:** + +- **cgroup-v1-blkio-throttle-read_bps_device:** 测试接口文件blkio.throttle.read_bps_device +- **cgroup-v1-blkio-throttle-write_bps_device:** 测试接口文件blkio.throttle.write_bps_device +- **cgroup-v1-blkio-throttle-read_iops_device:** 测试接口文件blkio.throttle.read_iops_device +- **cgroup-v1-blkio-throttle-write_iops_device:** 测试接口文件blkio.throttle.write_iops_device + +### 层次结构 + +throttling实现了层次结构支持,但只有root cgroup启用了sane_behavior选项才启用了throttling层次结构。如果没有启用,则实际上会将所有cgroup视为同一级别。目前这是一个开发选项,尚未公开 + +### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813154623977](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813154623977.png) + +本地qemu: + +![image-20240813233107878](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813233107878.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814131958155](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814131958155.png) + +本地qemu: + +![image-20240814151255325](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151255325.png) + +cgroup-v1-blkio-throttle-write_bps_device和cgroup-v1-blkio-throttle-write_iops_device测试用例测试失败,原因不明,不能正常地限制硬盘写速度 + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814181022711](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814181022711.png) + +cgroup-v1-blkio-throttle-write_bps_device和cgroup-v1-blkio-throttle-write_iops_device测试用例测试失败,不能正常地限制硬盘写速度 + +## cpu + +主要是限制cgroup对CPU的使用,两种控制策略,权重比例设置和周期使用时间上限。 + +### CPU使用周期使用时间上限 + +**接口文件:** + +- **cpu.cfs_period_us:** 读写文件。规定CPU的时间周期(微秒),最大值是1s,最小值是1000微妙。 +- **cpu.cfs_quota_us:** 读写文件。在单位时间内(即cpu.cfs_period_us设定值)可用的CPU最大时间(单位是微秒)。cpu.cfs_quota_us值可以大于cpu.cfs_period_us的值,例如在一个双CPU的系统内,想要一个cgroup内的进程充分地利用2个CPU,可以设定cpu.cfs_quota_us为200000及cpu.cfs_period_us为100000 +- **cpu.stat: ** 只读文件。统计信息,包含: + - nr_periods:经历了几个cfs_period_us周期 + - nr_throttled:task被限制的次数 + - throtled_time:表示task被限制的总时长 + +**测试用例:** + +- **cgroup-v1-cpu-cfs-001:** 测试cpu.cfs_period_us和cpu.cfs_quota_us接口文件,cfs_quota_us小于cfs_period_us的情况 +- **cgroup-v1-cpu-cfs-002:** 测试cpu.cfs_period_us和cpu.cfs_quota_us接口文件,cfs_quota_us是cfs_period_us两倍的情况 + +### 权重比例设定CPU的分配 + +**接口文件:** + +- **cpu.shares:** 读写文件。CPU比重分配,通过一个整数的数值调节cgroup所占用的CPU时间。 + +**测试用例: ** + +- **cgroup-v1-cpu-shares:** 测试cpu.shares接口文件 + +### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813154844123](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813154844123.png) +![image-20240813155220037](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813155220037.png) + +本地qemu: + +![image-20240813233120405](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813233120405.png) +![image-20240813233137341](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813233137341.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814132028781](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132028781.png) +![image-20240814132044757](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132044757.png) + +本地qemu: + +![image-20240814151409352](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151409352.png) +![image-20240814151416375](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151416375.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814181059810](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814181059810.png) +![image-20240814181112081](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814181112081.png) + +## cpuacct + +显示cgroup中任务所使用的CPU资源 + +**需要开启的内核配置:** + +- CONFIG_CGROUP_CPUACCT + +**接口文件:** + +- **cpuacct.stat:** 只读文件。报告cgroup的所有任务使用的用户和内核CPU时间,单位为USER_HZ +- **cpuacct.usage:** 只读文件。记录该cgroup中所有进程的CPU使用总时间,以纳秒为单位 +- **cpuacct.usage_percpu:** 只读文件。记录该cgroup中所有进程在每个CPU上的使用时间,以纳秒为单位 +- **cpuacct.usage_user:** 只读文件。报告一个cgroup中所有任务使用用户态CPU的总时间,以纳秒为单位 +- **cpuacct.usage_percpu_user:** 只读文件。报告一个cgroup中所有任务在每个CPU上使用用户态CPU的时间,以纳秒为单位 +- **cpuacct.usage_sys:** 只读文件。报告一个cgroup中所有任务在CPU上使用内核态CPU的时间,以纳秒为单位 +- **cpuacct.usage_percpu_sys:** 只读文件。报告一个cgroup中所有任务在每个CPU上使用内核态CPU的时间 +- **cpuacct.usage_all:** 只读文件。详细输出文件cpuacct.usage_percpu_user和cpuacct.usage_percpu_sys的内容 + +**测试用例:** + +- **cgroup-v1-cpuacct-stat:** 测试cpuacct.stat接口文件 +- **cgroup-v1-cpuacct-usage:** 测试cpuacct.usage接口文件 +- **cgroup-v1-cpuacct-usage_percpu:** 测试cpuacct.usage_percpu接口文件 +- **cgroup-v1-cpuacct-usage_user:** 测试cpuacct.usage_user接口文件 +- **cgroup-v1-cpuacct-usage_percpu_user:** 测试cpuacct.usage_percpu_user接口文件 +- **cgroup-v1-cpuacct-usage_sys:** 测试cpuacct.usage_sys接口文件 +- **cgroup-v1-cpuacct-usage_percpu_sys:** 测试cpuacct.usage_percpu_sys接口文件 +- **cgroup-v1-cpuacct-usage_all:** 测试cpuacct.usage_all接口文 + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813154921611](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813154921611.png) + +cgroup-v1-cpuacct-usage_all、cgroup-v1-cpuacct-usage_percpu_sys和cgroup-v1-cpuacct-usage_sys测试用例失败,原因是这些接口文件不能正确统计cpu内核态使用时间 + +本地qemu: + +![image-20240813233232772](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813233232772.png) + +cgroup-v1-cpuacct-usage_all、cgroup-v1-cpuacct-usage_percpu_sys和cgroup-v1-cpuacct-usage_sys测试用例失败,原因是这些接口文件不能正确统计cpu内核态使用时间 + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814132114591](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132114591.png) + +本地qemu: + +![image-20240814151440881](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151440881.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814181155186](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814181155186.png) + +## cpuset + +为cgroup分配指定的CPU和内存节点 + +以下规则使用每个cgroup: + +- 它的 CPU 和内存节点必须是其父级的子集。 +- 除非其父级被标记为exclusive,否则它不能被标记为exclusive。 +- 如果其 CPU 或内存是独占的,则它们可能不会与任何兄弟cgroup重叠 +- 必须指定当前cgroup的cpuset.mems和cpuset.cpus,才能将进程移入当前cgroup + +### cpu相关 + +**接口文件:** + +- **cpuset.cpus:** 读写文件。允许cgroup中的进程使用的CPU列表。 +- **cpuset.effective_cpus:** 只读文件。显示了当前cgroup中实际可用于分配给进程的CPU核心列表,它考虑了上级cgroup的限制和当前cgroup的cpuset.cpus配置,从而提供了一个最终的、实际可用的CPU核心集合 +- **cpuset.cpu_exclusive:** 读写文件。cgroup是否独占cpuset.cpus中分配的cpu。默认值为0,表示共享;1表示独占。如果设置为1,其他cgroup内的cpuset.cpus值不能包含有该cpuset.cpus内的值 +- **cpuset.sched_load_balance:** 读写文件。cgroup的cpu压力是否会被平均到cpuset中的多个cpu上。默认值1,启用负载均衡;0表示禁用。注意:如果任意上级cgroup中启用负载均衡,则在cgroup中设定这个标签没有任何效果,因为已经在较高一级cgroup中处理了负载均衡。因此,要在cgroup中禁用负载平衡,还要在每个上级cgroup中禁用负载平衡。 + +**测试用例:** + +- **cgroup-v1-cpuset-cpus:** 测试cpuset.cpus接口文件 +- **cgroup-v1-cpuset-cpu_exclusive:** 测试cpu_exclusive接口文件 +- **cgroup-v1-cpuset-sched_load_balance:** 测试cpuset.sched_load_balance接口文件 + +### memory相关 + +**接口文件:** + +- **cpuset.mems:** 读写文件。允许cgroup中的进程使用的内存节点列表。 +- **cpuset.effective_mems:** 只读文件。显示当前cgroup中实际可用于分配给进程的内存节点列表,同样考虑了上级cgroup的限制和当前cgrouop的cpuset.mems配置 +- **cpuset.mem_exclusive:** 读写文件。是否独占memory。默认值0表示共享,1表示独占。如果设置为1,其他cgroup内的cpuset.mems值不能包含有该cpuset.mems内的值 +- **cpuset.memory_migrate: * 读写文件。用来指定当cpuset.mems中的值更改时是否应该讲内存中的页迁移到新节点。默认情况下是0表示禁止内存迁移,且页就保留在原来分配的节点中,即使在cpuset.mems中现已不再指定这个节点。如果设置为1,则该系统会将页迁移到由cpuset.mems指定的新参数中的内存节点中。 +- **cpuset.memory_spread_page:** 读写文件。如果被设置了,将该cpuset中进程上下文是申请的page cache平均分布到cpuset中的各个节点中。默认值是0表示不启用。设置为1表示启用 + +**测试用例:** + +- **cgroup-v1-cpuset-mems:** 测试cpuset.mems接口文件 +- **cgroup-v1-cpuset-mem_exclusive:** 测试cpuset.mem_exclusive接口文件 +- **cgroup-v1-cpuset-memory_migrate-001:** 测试memory_migrate接口文件, 测试启用内存迁移 +- **cgroup-v1-cpuset-memory_migrate-002:** 测试memory_migrate接口文件, 测试不启用内存迁移 +- **cgroup-v1-cpuset-memory_spread_page-001:** 测试cpuset.memory_spread_page接口文件,测试不将page cache平均分布道各个节点中 +- **cgroup-v1-cpuset-memory_spread_page-002:** 测试cpuset.memory_spread_page接口文件,测试将page cache平均分布道各个节点中 + +### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813155138963](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813155138963.png) + +部分测试用例需要系统有两个numa节点及以上,所以跳过测试 + +本地qemu: + +![image-20240814102516235](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102516235.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814132156950](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132156950.png) + +部分测试用例需要系统有两个numa节点及以上,所以跳过测试 + +本地qemu: + +![image-20240814151456351](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151456351.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814181927733](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814181927733.png) + +cgroup-v1-cpuset-cpu_exclusive测试失败,cpuset.cpu_exclusive无法发挥正常作用,无法独占cpu + +## devices + +来跟踪和执行对设备文件的打开和关闭限制。设备cgroup为每个cgroup关联一个设备接入白名单,白名单有四个字段: + +- type:a(all), c(char), b(block) +- 主设备号 +- 副设备号 +- 访问权限(r ,w, m(mknod)) + +**需要开启的内核配置:** + +- CONFIG_CGROUP_DEVICE + +**层次结构:** devices控制器通过确保子cgroup永远不会拥有比其父cgroup更多的访问权限来维护层次结构。每次将条目写入cgroup的devices.deny文件时,它的所有子cgroup都会从白名单中删除该条目,并且所有本地设置的白名单条目都会被重新评估。如果某个本地设置的白名单条目提供了比父cgroup更多的访问权限,它将从白名单中删除 + +**接口文件:** + +- **devices.allow:** 读写文件。允许访问的设备。文件包含4个字段:type(设备类型),major(主设备号),minor(次设备号),access(访问方式) +- **devices.deny:** 读写文件。禁止访问的设备,格式如devices.allow +- **devices.list:** 只读文件。显示目前允许被访问的设备列表 + +**测试用例:** + +- **cgroup-v1-devices-001:** 测试devices.allow接口文件和devices.deny接口文件 +- **cgroup-v1-devices-002:** 测试deivces的层级结构 + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813155239339](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813155239339.png) + +本地qemu: + +![image-20240814102535908](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102535908.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814132225566](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132225566.png) + +本地qemu: + +![image-20240814151522526](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151522526.png) + +**OpenCloudOS Stream 23: ** + +本地qemu: + +![image-20240814182020730](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182020730.png) + +## freezer + +可以启动和停止cgroup中的task + +**需要开启的内核配置:** + +- CONFIG_CGROUP_FREEZER + +**注意事项:** + +- 挂起进程时,会连同子进程一同挂起 +- 不能将进程移动到处于FROZEN状态的cgroup中 +- 只有FROZEN状态和THAWED状态可以被写进freezer.state中,FREEZING状态则不能,只能读取它 +- root cgroup是不可冻结的 + +**接口文件:** + +- **freezer.state: ** 读写文件 + - cgroup的三种状态 + - FROZEN:挂起该cgroup中的任务 + - FREEZING:该系统正在挂起该cgroup中的任务 + - THAWED:已经恢复该cgroup中的任务 + - 当被读取时,返回该group的有效状态(也就是上面三种状态)。这是自己和父cgroup状态的结合。如果有FREEZING,则cgroup的状态为FREEZING + - 当属于cgroup及其子cgroup所有任务被冻结时,cgroup转换为FROZEN。注意,当一个新任务被添加到cgroup或它的子cgroup中,cgroup会从FROZEN状态恢复到FREZING状态,直到新任务被冻结 + - 写入时,设置cgroup的self-state。允许两个值:FROZEN和THAWED。如果写了FROZEN,则cgroup和它的所有子cgroup一起进入FROZEN状态 + - 如果写入THAWED,则cgroup的self-state更改为THAWED。注意,如果父cgroup状态仍处于FROZEN,则有效状态可能不会被更改为THAWED。如果cgroup的有效状态变为THAWED,则由于cgroup而冻结的所有子cgroup将离开FROZEN状态 +- **freezer.self_freezing: ** 只读文件。显示self-state。如果是0,则为THAWED状态;否则为1。如果最后一次写入了FORZEN,这个值为1 +- **freezer.parent_freezing: ** 只读文件。显示parent-state。如果cgroup的父cgroup不是FROZEN,则为0;否则为1 + +**测试用例: ** + +- **cgroup-v1-freezer-001:** 测试freezer的正常使用,即停止task和再次启动task +- **cgroup-v1-freezer-002:** 测试freezer的层次结构 + +**测试结果:** + +**OpenCloud 8:** + +腾讯云: + +![image-20240813155303515](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813155303515.png) + +本地qemu: + +![image-20240814102549259](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102549259.png) + +**OpenCloud 9:** + +腾讯云: + +![image-20240814132303942](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132303942.png) + +本地qemu: + +![image-20240814151819447](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151819447.png) + +**OpenCloud Stream 23:** + +本地qemu: + +![image-20240814182034409](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182034409.png) + +## hugetlb + +允许限制cgroup的hugepage使用量和hugepage预留。 + +**需要的内核配置:** + +- CONFIG_CGROUP_HUGETLB +- CONFIG_HUGETLB_PAGE +- CONFIG_HUGETLBFS + +### hugepage使用量 + +**接口文件:** + +- **hugetlb.2MB.limit_in_bytes:** 读写文件。设置hugepage大小为2MB的hugepage使用量限制 +- **hugetlb.1GB.limit_in_bytes:** 读写文件。设置hugepage大小为1GB的hugepage使用量限制 +- **hugetlb.2MB.max_usage_in_bytes:** 只读文件。显示hugepage大小为2MB最大hugepages使用记录 +- **hugetlb.1GB.max_usage_in_bytes:** 只读文件。显示hugepage大小为1GB最大hugepages使用记录 +- **hugetlb.2MB.usage_in_bytes:** 只读文件。显示hugepages大小为2MB的hugepage的当前使用量 +- **hugetlb.1GB.usage_in_bytes:** 只读文件。显示hugepages大小为1GB的hugepage的当前使用量 +- **hugetlb.2MB.failcnt:** 只读文件。显示hugepage大小为2MB由于hugepage使用限制导致的分配失败 +- **hugetlb.1GB.failcnt:** 只读文件。显示hugepage大小为1GB由于hugepage使用限制导致的分配失败 + +**测试用例:** + +- **cgropu-v1-hugetlb-limit_in_bytes-001:** 测试hugetlb.2MB.limit_in_bytes接口文件,超过限制 +- **cgroup-v1-hugetlb-limit_in_bytes-002:** 测试hugetlb.2MB.limit_in_bytes接口文件, 不超过限制 +- **cgroup-v1-hugetlb-limit_in_bytes-003:** 测试hugetlb.1GB.limit_in_bytes接口文件,超过限制 +- **cgroup-v1-hugetlb-limit_in_bytes-004:** 测试hugetlb.1GB.limit_in_bytes接口文件, 不超过限制 + +### hugepage预留 + +**接口文件:** + +- **hugetlb.2MB.rsvd.limit_in_bytes:** 读写文件。设置hugepage大小为2MB的hugepage预留限制 +- **hugetlb.1GB.rsvd.limit_in_bytes:** 读写文件。设置hugepage大小为1GB的hugepage预留限制 +- **hugetlb.2MB.rsvd.max_usage_in_bytes:** 只读文件。显示hugepage大小为2MB最大hugepages预留记录 +- **hugetlb.1GB.rsvd.max_usage_in_bytes:** 只读文件。显示hugepage大小为1GB最大hugepages预留记录 +- **hugetlb.2MB.rsvd.usage_in_bytes:** 只读文件。显示hugepages大小为2MB的hugepage的当前预留量 +- **hugetlb.1GB.rsvd.usage_in_bytes:** 只读文件。显示hugepages大小为1GB的hugepage的当前预留量 +- **hugetlb.2MB.rsvd.failcnt:** 只读文件。显示hugepage大小为2MB由于hugepage预留限制导致的分配失败 +- **hugetlb.1GB.rsvd.failcnt:** 只读文件。显示hugepage大小为1GB由于hugepage预留限制导致的分配失败 + +**测试用例:** + +- **cgropu-v1-hugetlb-rsvd-limit_in_bytes-001:** 测试hugetlb.2MB.rsvd.limit_in_bytes接口文件,超过限制 +- **cgroup-v1-hugetlb-rsvd-limit_in_bytes-002:** 测试hugetlb.2MB.rsvd.limit_in_bytes接口文件, 不超过限制 +- **cgroup-v1-hugetlb-rsvd-limit_in_bytes-003:** 测试hugetlb.1GB.rsvd.limit_in_bytes接口文件,超过限制 +- **cgroup-v1-hugetlb-rsvd-limit_in_bytes-004:** 测试hugetlb.1GB.rsvd.limit_in_bytes接口文件, 不超过限制 + +### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813161618198](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813161618198.png) + +跳过的测试是需要在hugepage大小为1G的情况下测试,而rsvd测试失败是因为系统hugetlb.\.rsvd.limit_in_bytes接口文件。 + +本地qemu: + +![image-20240814102626444](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102626444.png) + +rsvd测试失败是因为系统hugetlb.\.rsvd.limit_in_bytes接口文件。 + +修改hugepage大小为1G后测试:(系统内存至少有8G) + +![image-20240814105728307](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814105728307.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814132333013](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814132333013.png) + +本地qemu: + +![image-20240814151841682](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814151841682.png) + +修改hugepage大小为1G后测试: + +![image-20240814153748435](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814153748435.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814182050676](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182050676.png) + +修改hugepage大小为1G后测试: + +![image-20240814183418474](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814183418474.png) + +## memory + +主要是限制cgroup所能使用的内存上限 + +**需要的内核配置:** + +- CONFIG_MEMCG +- CONFIG_SWAP + +**接口文件:** + +- **memory.usage_in_bytes:** 只读文件。显示当前内存使用情况,单位为字节 +- **memory.memsw.usage_in_bytes:** 只读文件。显示当前内存+交换的使用情况,单位为字节 +- **memory.max_uasge_in_bytes:** 只读文件。显示记录的最大内存使用量,单位为字节 +- **memory.memsw.max_usage_in_bytes:** 只读文件。显示记录的最大内存+交换使用量,单位为字节 +- **memory.failcnt:** 只读文件。显示内存达到memory.limit_in_bytes设定的限制值的次数 +- **memory.memsw.failcnt:** 只读文件。显示内存+swap空间限制达到在memory.memsw.limit_in_bytes设定的值的次数 +- **memory.limit_in_bytes:** 读写文件。设定最大的内存使用量(包括文件缓存),可以加单位(k/K, m/M, g/G)不加单位默认为bytes。不能限制root cgroup。写入-1删除现有的限制 +- **memory.soft_limit_in_bytes:** 读写文件。和memory.limit_in_bytes的差异是,这个限制并不会阻止进程使用超过限额的内存,只是在系统内存不足时,会优先回收超过限额的进程占用的内存,使之向限定值靠拢。该值应小于memory.limit_in_bytes设定值 +- **memory.memsw.limit_in_bytes:** 读写文件。设定最大的内存+swap的用量之和。可以加单位(k/K, m/M, g/G)不加单位默认为bytes。不能限制根cgroup。写入-1删除现有的限制 +- **memory.force_empty:** 只写文件。当写入0时,清空该group的所有内存页。该选项只有在当前group没有tasks才可以使用。删除cgroup前请使用memory.force_empty以避免将不再使用的页面缓存移动到它的上级cgroup中 +- **memory.swappiness:** 读写文件。将内核倾向设定为换出这个cgroup中任务所使用的进程内存,而不是从页缓冲中再生页面。这也是在/proc/sys/vm/swappiness中设定的使用同一方法为整个系统设定的内核倾向。默认值为60,低于这个值会降低内核换出进程内存的倾向,将其设定为0则完成不会为cgroup中的任务换出进程内存。高于这个值将提高内核换出进程内存的倾向,等于100时内核将开始换出作为这个cgroup中进程的地址空间的一部分页面。不能更改一下群组的swappniess:根cgroup,它使用在/proc/sys/vm/swappiness中设定的swappiness。 +- **cgroup.event_control:** 只写文件。event_fd()的接口 +- **memory.pressure_level:** 读写文件。设置内存压力通知。压力级别通知用于监控内存分配成本;基于压力,应用程序可以实现不同的内存资源管理策略。 +- **memory.oom_control:** 读写文件。当进程出现Out of Memory时,是否进行kill操作。默认值0,表示kill;设置为1时,进程将进入睡眠状态,等待内存充足时被唤醒 + - oom_kill_disable:当设置为0时,表示在这个cgroup内存不足时,OOM killer是启用的,可以杀死大量占用内存的进程来释放内存;当值为1时,表示禁用OOM killer,即使内存不足也不会自动杀死进程 + - under_oom:当值为0时,表示当前没有OOM条件发生在这个cgroup中;当值为1时,表示这个cgroup目前正处于oom状态,即系统已经检测到内存不足的情况,并可能正在尝试杀死一些进程来释放内存 + - oom_kill:这个字段显示了由于OOM条件而被杀死的进程数量。每次OOM killer杀死cgroup中的一个进程时,这个计数器就会增加 + +**测试用例:** + +- **cgroup-v1-memory-limit_in_bytes:** 测试memory.limit_in_bytes接口文件,使用了memory.max_uasge_in_bytes和memory.failcnt接口文件 +- **cgroup-v1-memory-soft_limit_in_bytes:** 测试memory.soft_limit_in_bytes控制文件 +- **cgroup-v1-memory-memsw-limit_in_byte:** 测试memory.memsw.limit_in_bytes接口文件,使用了memory.memsw.max_uasge_in_bytes和memory.memsw.failcnt接口文件 +- **cgroup-v1-memory-swappiness-001:** 测试memory.swappiness控制文件,当swappiness为0时,内存不会被交换到swap空间 +- **cgroup-v1-memory-swappiness-002:** 测试memory.swappiness控制文件,当swappiness为100时,内存会被交换到swap空间 +- **cgroup-v1-memory-pressure_level:** 测试memory.pressure_level控制文件,设置内存压力通知 +- **cgroup-v1-memory-oom_control-001:** 测试memory.oom_control接口文件,默认是启用状态 +- **cgroup-v1-memory-oom_control-002:** 测试memory.oom_control接口文件,禁用oom_control + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240814160924162](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814160924162.png) + +cgroup-v1-memory-swappiness-001/002测试跳过的原因是系统没有设置swapfile + +本地qemu: + +![image-20240814103735716](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814103735716.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814162842038](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814162842038.png) + +cgroup-v1-memory-swappiness-001/002测试跳过的原因是系统没有设置swapfile + +本地qemu: + +![image-20240814153132555](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814153132555.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814182522372](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182522372.png) + +## net_cls + +使用等级标识符(classid)标记网络数据包,可允许linux流量控制程 + +序(traffic controller, tc)识别从具体cgroup中生成的数据包,为来自不同cgroup的报文分配不同的优先级 + +**需要开启的内核配置:** + +- CONFIG_CGROUP_NET_CLASSID + +**接口文件:** + +- **net_cls.classid:** 读写文件。包含一个说明流量控制句柄的十六进制的值,初始值为0。。这些句柄的格式为0xAAAABBBB,其中AAAA是十六进制主设备号,BBBB是十六进制副设备号。 + +**测试用例:** + +- **cgroup-v1-net_cls-001:** 测试设置带宽限制的情况 +- **cgroup-v1-net_cls-002:** 测试不设置带宽限制的情况 + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813164446290](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813164446290.png) + +本地qemu: + +![image-20240814102723332](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102723332.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814133153525](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814133153525.png) + +本地qemu: + +![image-20240814152225938](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814152225938.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814182535354](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182535354.png) + +## net_prio + +允许设置各种应用程序产生的网络流量的优先级 + +**需要开启的内核配置:** + +- CONFIG_CGROUP_NET_PRIO + +**接口文件:** + +- **net_prio.ifpriomap:** 读写文件。该文件包含分配给来自该组进程的流量的优先级映射。这些流量从不同的接口流出系统。 + +**测试用例:** + +- **cgroup-v1-net_prio:** 测试net_prio.ifpriomap是否能成功设置 + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813164459881](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813164459881.png) + +本地qemu: + +![image-20240814102741707](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102741707.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814133210805](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814133210805.png) + +本地qemu: + +![image-20240814152237975](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814152237975.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814182547603](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182547603.png) + +## perf_event + +该层级中的所有cgroup可以使用perf工具对这些进程和线程监控,没有可供调节的参数 + +**测试用例:** + +- **cgroup-v1-perf_event:** 测试使用perf监控cgroup + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813164512233](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813164512233.png) + +本地qemu: + +![image-20240814102757182](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814102757182.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814133229822](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814133229822.png) + +本地qemu: + +![image-20240814152247856](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814152247856.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814182606386](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182606386.png) + +## pids + +允许cgroup在达到一定限制后阻止任何新任务被fork()或clone() + +**需要开启的内核配置:** + +- CONFIG_CGROUP_PIDS + +**接口文件:** + +- **pids.max:** 读写文件。设置最大任务数,不能在root cgroup中使用。默认值是max +- **pids.current:** 只读文件。目前cgroup运行的任务数,pids.current有可鞥大于pids.max,通过设置pids.max小于pids.current实现,但是不可能通过fork和clone实现 +- **pids.events:** 只读文件。包含事件计数器: + - max: 由于自身或父cgroup达到限制,cgroup 中 fork 失败的次数 + +**测试用例: ** + +- **cgroup-v1-pids-001:** 测试pids.max控制文件, 进程数超过限制 +- **cgroup-v1-pids-002:** 测试pids.max控制文件, 进程数不超过限制 +- **cgroup-v1-pids-003:** 测试层次结构 + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813164526945](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813164526945.png) + +本地qemu: + +![image-20240814141530725](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814141530725.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814133341911](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814133341911.png) + +本地qemu: + +![image-20240814152259054](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814152259054.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814182618283](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814182618283.png) + +# cgroup version2 + +## 核心接口文件 + +### cgroup.type + +存在于非root cgroup上的读写单值文件 + +读取时,表示该cgroup当前的类型,可以是下列值之一: + +- domain:正常有效的域cgroup +- domain threaded:作为线程子树根的线程域cgroup +- domain invalid:处于无效状态的cgroup,无法填充或启用控制器,可能允许其成为线程cgroup +- threaded:线程cgroup,是线程子树的成员 + +通过将threaded写入此文件,可以将cgroup转变为线程cgroup + +### cgroup.controllers + +所有cgroup上都存在的只读空格分隔值文件 + +它显示了cgroup可用的所有控制器的空格分隔值列表。控制器没有排序 + +### cgroup.subtree_control + +所有cgroup上都存在的可读写空格分隔值文件。初始为空 + +读取时,它会显示以空格分割的控制器列表,这些控制器被启用来控制从cgroup到其子组的资源分配 + +可以写入以空格分隔的带有+或-前缀的控制器列表来启用或禁用控制器。带有+前缀的控制器名称将启用该控制器,带有-前缀的控制器名称将禁用该控制器。如果控制器在列表中出现多次,则最后一个有效。当指定多个启用和禁用操作时,要么全部成功,要么全部失败 + +### cgroup.event + +存在于非root cgroup上的只读平键文件。定义了以下条目。除非另有说明,否则此文件中的值更改会生成文件修改事件 + +- populated:如果cgroup或其他后代包含任何活动进程,则为1;否则为0 +- frozen:如果cgroup被冻结,则为1;否则为0 + +### cgroup.max.descendants + +读写单值文件。默认值为"max" + +允许的最大后代cgroup数量。如果实际后代数量相等或更大,则在层次结构中创建新cgroup的尝试将失败 + +### cgroup.max.deep + +读写单值文件。默认值为max + +当前cgroup下允许的最大下降深度。如果实际下降深度等于或大于该值,则尝试创建新的子cgroup将失败 + +### cgroup.freeze + +存在于非root cgroup中的读写单值文件。允许的值为0和1。默认值为0 + +将1写入文件会导致cgroup及其所有后代cgroup被冻结。这意味着所有附属进程都将停止,直到cgroup明确解冻后才会运行。cgroup的冻结可能需要一些时间;此操作完成后,cgroup.events控制文件中的frozen值将更新为1,并发出相应的通知 + +cgroup可以通过其自身设置或任何祖先cgroup的设置进行解冻。如果任何父cgroup被解冻,则cgroup将保持冻结状态 + +冻结cgroup中的进程可以通过致命信号终止。它们还可以进入和离开冻结cgroup;要么通过用户的明确移动,要么冻结cgroup与fork()竞争。如果将进程移动到冻结cgroup,它将停止,如果将进程移出冻结cgroup,它将变为运行状态 + +cgroup的冻结状态不会影响任何cgroup树操作;可以删除冻结的cgroup,也可以创建新的子cgroup + +### cgroup.kill + +存在于非root cgroup中的只写单值文件。唯一允许的值是1 + +将1写入文件会导致cgroup及其所有后代cgroup被终止。这意味着受影响的cgroup树种的所有进程都将通过SIGKILL终止 + +### cgroup.pressure + +允许值为0和1的读写单值文件。默认值为1 + +向文件写入0将禁用cgroup PSI记。向文件写入1将重新启用cgroup PSI。 + +此控制属性不是分层的,因此在cgroup中禁用或启用PSI不会影响后代中的PSI,并且不需要通过来自root cgroup传递启用 + +### 测试用例 + +- **cgroup-v2-type-001:** 测试cgroup.type接口文件,当子cgroup设置为threaded时,父cgroup自动设置为domain threaded +- **cgroup-v2-type-002:** 测试cgroup.type接口文件, 测试层次结构约束 +- **cgroup-v2-subtree_control-001:** 测试cgroup.subtree_control接口文件,在启用了subtree_control的cgroup中,不能够在domain cgroup中加入进程, +- **cgroup-v2-subtree_control-002:** 测试cgroup.subtree_control接口文件,子cgroup的subtree_control只能包含父cgroup的subtree_control +- **cgroup-v2-subtree_control-003:** 测试cgroup.subtree_control接口文件, 不能禁用父cgroup的subtree_control因为子cgroup的subtree_control包含父cgroup的subtree_control +- **cgroup-v2-subtree_control-004:** 测试cgroup.subtree_control接口文件, 在threaded cgroup能够加入线程在启用了subtree_control的cgroup中 +- **cgroup-v2-populated:** 测试cgroup.events中的populated字段 +- **cgroup-v2-max-descendants:** 测试cgroup.max.descendants接口文件 +- **cgroup-v2-max-deep:** 测试cgroup.max.deep接口文件 +- **cgroup-v2-freeze-001:** 测试cgroup.freeze接口文件 +- **cgroup-v2-freeze-002:** 测试cgroup.freeze接口文件, 测试层次结构 +- **cgroup-v2-freeze-003:** 测试cgroup.freeze接口文件, 测试层次结构,测试如果将进程移动到冻结cgroup,它将停止 +- **cgroup-v2-freeze-004:** 测试cgroup.freeze接口文件, 测试层次结构,测试cgroup的冻结状态不会影响任何cgroup树操作 +- **cgroup-v2-freeze-005:** 测试cgroup.freeze接口文件, 测试迁移的情况 +- **cgroup-v2-kill-001:** 测试cgroup.kill接口文件 +- **cgroup-v2-kill-002:** 测试cgroup.kill接口文件, 测试层次结构 + +### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813175902750](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813175902750.png) +![image-20240813180012630](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813180012630.png) +![image-20240813180113229](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813180113229.png) + +cgroup-v2-kill-001/002测试用例失败原因是不存在cgroup.kill这个接口文件 + +本地qemu: + +![image-20240814111432108](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814111432108.png) +![image-20240814111439428](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814111439428.png) +![image-20240814111452398](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814111452398.png) +![image-20240814111510069](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814111510069.png) + +cgroup-v2-kill-001/002测试用例失败原因是不存在cgroup.kill这个接口文件 + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814134324218](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814134324218.png) +![image-20240814134339407](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814134339407.png) +![image-20240814134349799](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814134349799.png) + +本地qemu: + +![image-20240814154750773](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814154750773.png) + + + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814184416348](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814184416348.png) + +## 控制器接口文件 + +### CPU + +CPU控制器调节CPU周期的分配,为普通调度策略实现权重和绝对带宽限制模型。 + +所有接口文件的时间长度均以微妙为单位 + +#### cpu.stat + +只读平键文件。无论控制器是否启用,此文件都存在 + +它始终报告以下三个统计数据: + +- usage_usec:CPU使用时间 +- user_usec:CPU用户态时间 +- system_usec:CPU内核态时间 + +当控制器启用时,还有以下五个统计数据: + +- nr_periods:调度周期的总数 +- nr_throttled:进程被限制(throttled)的次数 +- throttled_usec:进程被限制的总时间 +- nr_bursts:发生的burst事件的次数。burst事件是指在短时间内CPU使用率突然增加的情况 +- burst_usec:burst事件的总时间 + +#### cpu.weight + +存在于非root cgroup上的读写单值文件。默认值为100 + +对于非空闲组(cpu.idle = 0),权重在范围内[1, 10000] + +如果cgroup已配置为SCHED_IDLE(cpu.idle = 1),则权重将显示为0 + +#### cpu.weight.nice + +存在于非root cgroup上的读写单值文件。默认值为0 + +nice值的范围是[-20, 19] + +此接口文件是cpu.weight的替代接口,允许使用 nice(2)使用的相同值读取和设置权重。由于nice值的范围较小,粒度较粗,因此读取的值是当前权重的最接近近似值 + +nice(2)是一个系统调用,用于设置进程的优先级,优先级决定了进程在系统资源(特别是CPU时间)分配中的优先顺序。nice值的范围通常是从-20到19,值越小表示越高优先级 + +#### cpu.max + +存在于非root cgroup上的读写双值文件。默认值为" max 100000" + +最大带宽限制。其格式如下: + +```bash +$MAX $PERIOD +``` + +表示该组在每个\$PERIOD期间最多可以消费\$MAX。\$MAX中的max表示没有限制,如果只写一个数字,则更新\$MAX + +#### cpu.max.burst + +存在于非root cgroup上的读写单值文件。默认值为0 + +burst范围在[0, $MAX]内,这里的MAS是cpu.max中定义的 + +#### cpu.pressure + +读写嵌套键文件。显示CPU的压力失速信息 + +#### cpu.idle + +存在于非root cgroup上的读写单值文件。默认值为0 + +这是cgroup中每个任务的SCHD_IDLE调度策略的模拟。将此值设置为1将使cgroup的调度策略成为SCHED_IDLE。cgroup中的线程将保留其自己的相对优先级,但cgroup本身将被视为相对于其他同类而言优先级非常低 + +#### 测试用例 + +- **cgroup-v2-cpu-stat:** 测试cpu.stat接口文件 +- **cgroup-v2-cpu-weight-001:** 测试cpu.weight接口文件 +- **cgroup-v2-cpu-weight-002:** 测试cpu.weight接口文件,测试层次结构 +- **cgroup-v2-cpu-weight-nice-001:** 测试cpu.weight.nice接口文件 +- **cgroup-v2-cpu-weight-nice-002:** 测试cpu.weight.nice接口文件, 测试层次结构 +- **cgroup-v2-cpu-max:** 测试cpu.max接口文件 +- **cgroup-v2-cpu-max-burst-001:** 测试cpu.max.burst接口文件,设置限制,并设置burst时间 +- **cgroup-v2-cpu-max-burst-002:** 测试cpu.max.burst接口文件,设置限制,不设置burst时间 +- **cgroup-v2-cpu-pressure:** 测试cpu.pressure接口文件,设置CPU压力通知 +- **cgroup-v2-cpu-idle-001:** 测试cpu.idle接口文件,设置SCHD_IDLE调度策略 +- **cgroup-v2-cpu-idle-002:** 测试cpu.idle接口文件,不设置SCHD_IDLE调度策略 + +#### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813193042254](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813193042254.png) +![image-20240813192641081](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813192641081.png) + +cgroup-v2-cpu-idle-001和cgroup-v2-cpu-max-burst-001测试失败的原因是不存在cpu.idle和cpu.burst.max这两个接口文件 +cgroup-v2-cpu-pressure测试失败的原因是没有cpu.pressure这个接口文件。 + +本地qemu: + +![image-20240814143203487](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814143203487.png) +![image-20240814143213079](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814143213079.png) + +cgroup-v2-cpu-idle-001和cgroup-v2-cpu-max-burst-001测试失败的原因是不存在cpu.idle和cpu.burst.max这两个接口文件 +cgroup-v2-cpu-pressure测试失败的原因是没有cpu.pressure这个接口文件。 + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814162257363](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814162257363.png) +![image-20240814162307489](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814162307489.png) + +本地qemu: + +![image-20240814155032448](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155032448.png) +![image-20240814155051387](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155051387.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814184809027](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814184809027.png) +![image-20240814184815898](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814184815898.png) + +### memory + +memory控制器调节内存的分配。内存是有效状态的,并实现限制和保护模型。 + +所有内存量均以字节为单位。如果写入的值为与PAGE_SIZE对齐,则读回该值可能会向上舍入为最接近的PAGE_SIZE倍数 + +#### memory.current + +存在于非root cgroup上的只读单值文件 + +该cgroup及其后代当前正在使用的内存总量 + +#### memory.min + +存在于非root cgroup上的读写单值文件。默认值为0 + +硬内存保护。如果cgroup的内存使用量在其有效最小边界内,则在任何情况下都不会回收该cgroup的内存。如果没有可用的不受保护的可回收内存,则会调用OOM终止程序。如果超过出有效最小边界(或有效低边界,如果有效低边界更高),则会按超额比例回收页面,从而减少超额较小的回收压力 + +如果memory cgroup中没有进程, 则会忽略其memory.min + +#### memory.low + +存在于非root cgroup上的读写单值文件。默认值为0 + +尽力保护内存,如果cgroup的内存使用量在其有效低边界内,则除非未受保护的cgroup中没有可回收内存,否则不会回收该cgroup的内存。如果超出有效低边界(或有效最小边界,如果有效最小边界更高),则会根据超额部分按比例回收页面,从而减少超额部分的回收压力 + +#### memory.high + +存在于非root cgroup上的读写单值文件。默认值为max + +内存使用限制,如果cgroup的使用量超出上限,则cgroup的进程将受到限制,并承受巨大的回收压力 + +超过上限不会调用OOM终止程序,在极端情况下可能会突破限制。在外部进程监控受限cgroup以缓解沉重的回收压力的情况下,应使用上限 + +#### memory.max + +存在于非root cgroup上的读写单值文件。默认值为max + +内存使用硬限制。这是限制cgroup内存使用的主要机制。如果cgroup的内存使用量达到此限制且无法降低,则会在cgroup中调用OOM killer。在某些情况下, 使用量可能会暂时超过限制 + +#### memory.peak + +存在于非root cgroup上的只读单值文件。自cgroup创建以来,记录的cgroup及其后代的最大内存使用量 + +#### memory.reclaim + +所有cgroup都存在的只写文件 + +这是一个在目标cgroup中触发内存回收的简单接口 + +#### memory.oom.group + +存在于非root cgroup上的读写单值文件。默认值为0 + +确定OOM终止程序是否应将cgroup视为不可分割的工作负载。如果设置,则属于该cgroup或其后代(如果内存cgroup不是叶cgroup)的所有任务都会一起终止或根本不终止。这可用于避免部分终止以保证工作负载的完整性 + +具有OOM保护(oom_score_adj设置为-1000)的任务被视为异常,并且永远不会被终止 + +如果在cgroup中调用OOM终止程序,它将不会终止该cgroup之外的任何任务,无论父cgroup的memory.oom,group值如何 + +#### memory.events + +存在于非root cgroup上的只读平键文件。定义了以下条目: + +- low:尽管cgroup的使用率低于低限,但由于内存压力过大而被回收的次数。 +- high:由于超出高内存边界,cgroup的进程被限制以执行直接内存回收的次数。 +- max:cgroup的内存使用量即将超过最大边界的次数。如果直接回收无法降低内存使用量,则cgroup会进入oom状态 +- oom:cgroup内存使用量达到限制且分配即将失败的次数。如果不将oom killer视为一个选项,则不会引发此事件 +- oom_kill:属于此cgroup的被任何类型的OOM终止程序终止的进程数 +- oom_group_kill:发生组oom的次数(OpenCloud8没有此字段) + +memory.events.local:与memory.events类似,但文件中的字段是cgroup本地的,即不是分层的。在此文件上生成的文件修改仅反映本地事件 + +#### memory.swap.current + +存在于非root cgroup上的只读单值文件 + +该cgroup及其后代当前正在使用的交换总量 + +#### memory.swap.high + +存在于非root cgroup上的读写单值文件。默认值为max + +此限制标志着cgroup的不可逆转点。它并非设置用于管理工作负载在正常运行期间进行的交换量。与memory.swap.max相比,后者进制交换量超过设定值,但只要其他内存可以回收,cgroup就可以不受阻碍地继续运行 + +#### memory.swap.peak + +存在于非root cgroup上的只读单值文件 + +自cgroup创建以来,记录的cgroup及其后代的最大交换使用情况 + +#### memory.swap.max + +存在于非root cgroup上的读写单值文件,默认值为max + +交换使用硬限制。如果cgroup的交换使用量达到此限制,则不会将cgroup的匿名内存换出 + +#### memory.swap.events + +存在于非root cgroup上的只读平键文件。定义了以下条目。除非另有说明,否则此文件中的值更改会生成文件修改事件 + +- high:cgroup的交换使用量超出高阈值的次数 +- max:cgroup的交换使用量即将超出最大边界且交换分配失败的次数 +- fail:由于系统范围内的交换空间用尽或最大限制而导致交换分配失败的次数 + +当在当前使用率下减少时,现有的交换条目将逐渐被回收,并且交换使用率可能在较长时间内保持高于限制,着减少了对工作负载和内存管理的影响 + +#### memory.zswap.current + +存在于非root cgroup上只读单值文件 + +zswap压缩后端消耗的内存总量 + +#### memory.zswap.max + +存在于非root cgroup上的读写单值文件。默认值为max + +zswap使用硬限制。如果cgroup的zswap池达到此限制,它将拒绝在现有条目故障恢复或写入磁盘之前接受任何存储 + +#### memory.pressure + +只读的嵌套键文件。显示内存的压力失速信息。 + +#### 测试用例 + +- **cgroup-v2-memory-current:** 测试memory.current接口文件,分配一些匿名内存和页缓存,查看memory.current的值 +- **cgroup-v2-memory-min-001:** 测试memoruy.min接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为146MB, 不会占用parent1的memory.min保护的内存50MB +- **cgroup-v2-memory-min-002:** 测试memoruy.min接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为170MB, 会占用parent1的memory.min保护的内存50MB,因此会被kill +- **cgroup-v2-memory-low-001:** 测试memoruy.low接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为146MB, 不会占用parent1的memory.low保护的内存50MB +- **cgroup-v2-memory-low-002:** 测试memoruy.low接口文件,parent1/2的父cgroup设置的内存上限是200MB, parent2分配的内存为170MB, 会占用parent1的memory.low保护的内存50MB, 但是不会被kill,依然能分配 +- **cgroup-v2-memory-high-001:** 测试memory.high接口文件,测试是否能有效控制匿名内存和页缓存所消耗的内存量 +- **cgroup-v2-memory-high-002:** 测试memory.high接口文件,测试是否能有效对内存的大量单次分配进行限制 +- **cgroup-v2-memory-max:** 测试memory.max接口文件 +- **cgroup-v2-memory-reclaim-001:** 测试memory.reclaim接口文件,回收page cache +- **cgroup-v2-memory-reclaim-002:** 测试memory.reclaim接口文件,回收匿名内存 +- **cgroup-v2-memory-oom-group-001:** 测试memory.oom.group接口文件,分配匿名内存达到oom限制,检查子cgroup进程是否被kill +- **cgroup-v2-memory-oom-group-002:** 测试memory.oom.group接口文件,分配匿名内存达到oom限制,检查父cgroup和子cgroup进程是否被kill +- **cgroup-v2-memory-oom-group-003:** 测试memory.oom.group接口文件,分配匿名内存达到oom限制,检查除了设置OOM_SCORE_ADJ_MIN的进程外,其他进程是否被kill +- **cgroup-v2-memory-oom-events:** 测试memory.events中的oom和oom_kill事件 +- **cgroup-v2-memory-swap-high:** 测试memory.swap.high和memory.swap.current接口文件 +- **cgroup-v2-memory-swap-max:** 测试memory.swap.max接口文件 +- **cgroup-v2-memory-zswap:** 测试memory.zswap.max和memory.zswap.current接口文件, 达到限制不会触发写回操作 +- **cgroup-v2-memory-pressure:** 测试memory.pressure接口文件,设置内存压力通知 + +#### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813215939420](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813215939420.png) + +cgroup-v2-memory-pressure测试用例失败的原因是没有cgroup.preesure接口文件 + +cgroup-v2-memory-reclaim-001/2测试用例失败的原因是没有memory.reclaim接口文件 + +cgroup-v2-memory-swap-high/max测试用例跳过的原因是没有swapfile + +cgroup-v2-memory-zswap测试用例失败的原因是没有memory.zswap.max接口文件 + +本地qemu: + +![image-20240814142044608](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814142044608.png) + +cgroup-v2-memory-pressure测试用例失败的原因是没有cgroup.preesure接口文件 + +cgroup-v2-memory-reclaim-001/2测试用例失败的原因是没有memory.reclaim接口文件 + +cgroup-v2-memory-swap-high/max测试用例失败的原因是没有memory.swap.high接口文件 + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814141912888](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814141912888.png) + +cgroup-v2-memory-reclaim-002测试用例失败的原因是没有不能正常回收匿名内存,当分配匿名内存时,无法写入memory.reclaim接口文件 +cgroup-v2-memory-zswap测试用例失败的原因,推测是无法正常使用zswap,尽管设定了zswap.max的值,但是分配的内存还是会被kill掉,无法利用到zswap + +本地qemu: + +![image-20240814155628208](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155628208.png) + +仍然是cgroup-v2-memory-zswap测试用例测试失败 + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814185220725](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814185220725.png) + +### IO + +io控制器控制io资源的分配,此控制器可实现基于权重和绝对带宽或IOPS限制的分配 + +#### io.stat + +只读的嵌套键文件 + +行由\$MAJ:\$MIN设备编号键控,且无序。定义了以下嵌套键: + +| 字段 | 含义 | +| ------ | ------------ | +| rbytes | 读取的字节数 | +| wbytes | 写入的字节数 | +| rios | 读取IO数量 | +| wios | 写IO次数 | +| dbytes | 丢弃的字节数 | +| dios | 丢弃IO数 | + +#### io.weight + +存在于非 root cgroup 上的读写平键文件。默认值为“default 100”。 + +第一行是应用于设备的默认权重,没有特定的覆盖。其余的覆盖由 \$MAJ:\$MIN 设备编号键入且无序。权重在 [1, 10000] 范围内,指定 cgroup 相对于其同级可以使用的相对 IO 时间量。 + +可以通过写入“default \$WEIGHT”或简单的“​\$WEIGHT”来更新默认权重。可以通过写入“\$MAJ:\$MIN ​\$WEIGHT”来设置覆盖,并通过写入“​\$MAJ:\$MIN default”来取消设置。 + +注意:需要先在root cgroup启用特定设备的io.cost.qos,才能将设备填充到io.weight,例如: + + ```bash +ehco "8:0 enabled=1 ctrl=auto" > io.cost.qos + ``` + +#### io.max + +存在于非 root cgroup 上的读写嵌套键文件。 + +基于 BPS 和 IOPS 的 IO 限制。行由 \$MAJ:\$MIN 设备编号键控且无序。定义了以下嵌套键: + +| 字段 | 含义 | +| ----- | ---------------------- | +| rbps | 每秒最大读取字节数 | +| wbps | 每秒最大写入字节数 | +| riops | 每秒最大读取 IO 操作数 | +| wiops | 每秒最大写入 IO 操作数 | + +写入时,可以以任意顺序指定任意数量的嵌套键值对。可以指定“max”作为值来删除特定限制。如果多次指定相同的键,则结果不确定。 + +#### io.pressure + +只读的嵌套键文件,显示 IO 的压力失速信息。 + +#### 测试用例 + +- **cgroup-v2-io-weight:** 测试io.weight接口文件 +- **cgroup-v2-io-max-001:** 测试io.max接口文件的rbps +- **cgroup-v2-io-max-002:** 测试io.max接口文件的wbps +- **cgroup-v2-io-max-003:** 测试io.max接口文件的riops +- **cgroup-v2-io-max-004:** 测试io.max接口文件的wiops、 +- **cgroup-v2-io-pressure:** 测试io.pressure接口文件,设置io压力通知 + +#### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813220144401](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813220144401.png) + +cgroup-v2-io-pressure测试用例失败的原因是没有cgroup.preesure接口文件 + +本地qemu: + +![image-20240814121312911](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814121312911.png) + +cgroup-v2-io-pressure测试用例失败的原因是没有cgroup.preesure接口文件 + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814142222974](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814142222974.png) + +本地qemu: + +![image-20240814155752495](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155752495.png) + +同样是跟上面的cgroup v1中的cgroup-v1-blkio-throttle-write_bps_device和cgroup-v1-blkio-throttle-write_iops_device测试用例一样,不能正常限制写硬盘速率。 + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814185236668](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814185236668.png) + +同上,不能正常限制写硬盘速率。 + +### PID + +允许cgroup在达到一定限制后阻止任何新任务被fork()或clone() + +**接口文件:** + +- pids.max:存在于非 root cgroup 上的读写单值文件。默认值为“max”。进程数量的硬性限制。 +- pids.current:存在于非 root cgroup 上的只读单值文件。cgroup 及其后代中当前的进程数。 +- pids.peak:存在于非 root cgroup 上的只读单值文件。该 cgroup 及其后代进程数曾达到的最大值。 +- pids.events:存在于非 root cgroup 上的只读平键文件。除非另有说明,否则此文件中的值更改会生成文件修改事件。定义了以下条目: + - max:cgroup 的总进程数达到 pids.max 限制的次数 +- pids.events.local:与 pids.events 类似,但文件中的字段是 cgroup 本地的,即不是分层的。在此文件上生成的文件修改事件仅反映本地事件。 + +pids.current > pids.max 是可能的,这可以通过将限制设置为小于 pids.current 或将足够多的进程附加到 cgroup 以使 pids.current 大于 pids.max 来实现。但是,不可能通过 fork() 或 clone() 违反 cgroup PID 策略。 + +**测试用例:** + +- **cgroup-v2-pids-max-001:** 测试pids.max接口文件, 进程数超过限制 +- **cgroup-v2-pids-max-002:** 测试pids.max控制文件, 进程数不超过限制 +- **cgroup-v2-pids-max-003:** 测试pids的层次结构 + +**测试结果:** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813222209839](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813222209839.png) + +本地qemu: + +![image-20240814121333373](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814121333373.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814142241006](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814142241006.png) + +本地qemu: + +![image-20240814155915955](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155915955.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814185415242](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814185415242.png) + +### cpuset + +“cpuset”控制器提供了一种机制,用于将任务的 CPU 和内存节点放置限制为仅任务当前 cgroup 中的 cpuset 接口文件中指定的资源。这在大型 NUMA 系统中尤其有用,在这些系统中,将作业放置在适当大小的系统子集上,并仔细放置处理器和内存以减少跨节点内存访问和争用,可以提高整体系统性能。 + +“cpuset” 控制器是分层的。这意味着控制器不能使用其父级中不允许的 CPU 或内存节点。 + +#### cpuset.cpus + +存在于非 root cpuset 启用的 cgroup 上的读写多值文件。 + +它列出了此 cgroup 内的任务所请求的 CPU。但实际授予的 CPU 列表受其父级施加的限制,可能与请求的 CPU 不同。 + +CPU 编号是用逗号分隔的数字或范围,例如:0,3-4 + +空值表示 cgroup 使用与具有非空“cpuset.cpus”的最近的 cgroup 祖先相同的设置,如果未找到任何可用 CPU,则使用所有可用的 CPU。 + +“cpuset.cpus” 的值保持不变直到下次更新,不会受到任何 CPU 热插拔事件的影响。 + +#### cpuset.cpus.effective + +所有启用 cpuset 的 cgroup 上都存在的只读多值文件。 + +它列出了此 cgroup 的父级实际授予其的在线 CPU。这些 CPU 允许由当前 cgroup 中的任务使用。 + +如果“cpuset.cpus”为空,“cpuset.cpus.effective”文件将显示父 cgroup 中可供此 cgroup 使用的所有 CPU。否则,它应该是“cpuset.cpus”的子集,除非“cpuset.cpus”中列出的 CPU 均无法授予。在这种情况下,它将被视为空的“cpuset.cpus”。 + +其值会受到CPU热插拔事件的影响。 + +#### cpuset.cpus.partition + +这个文件可以被设置为root或member,主要功能是用来设置当前的cgroup是不是作为一个独立的scheduling domain进行调度。这个功能其实就是可以理解为,在root模式下,所有分配给当前cgroup的cpu都是独占这些cpu的,而member模式则可以在多个cgroup之间共享这些cpu。设置为root将使当前cgroup使用的cpu从上级cgroup的cpuset.cpus.effective列表中拿走,即上一级不能使用这个被独占的CPU了。设置为root后,如果这个cgroup有下一级的cgroup,这个cgroup也将不能再切换回member状态。在这种模式下,上一级的cgroup不可以把自己所有的cpu都分配给其下一级的cgroup,其自身至少给自己留一个cpu + +设置为root需要当前cgroup符合以下条件: + +- cpuset.cpus中设置不为空且设置的cpu list中的cpu都是独立的。就是说这些cpu不会共享给其他平级cgroup +- 上一级cgroup是partion root配置 +- 当前cgroup的cpuset.cpus作为集合是上一级cgroup的cpuset.cpus.effective集合的子集 +- 下一级cgroup没有启用cpuset资源隔离 + +#### cpuset.mems + +存在于非 root cpuset 启用的 cgroup 上的读写多值文件。 + +它列出了此 cgroup 内的任务所请求的内存节点。但实际授予的内存节点列表受其父级施加的限制,可能与请求的内存节点不同。 + +内存节点号是用逗号分隔的数字或范围。例如:0-1,3 + +空值表示 cgroup 使用与最近的 cgroup 祖先相同的设置 + +“cpuset.mems” 的值保持不变直到下次更新,不会受到任何内存节点热插拔事件的影响。 + +如果“cpuset.mems”当前正在使用指定节点之外的内存,则将 cgroup 内的任务的内存迁移到指定节点。 + +这种内存迁移是有代价的。迁移可能不完整,可能会遗留一些内存页。因此,建议在将新任务生成到 cpuset 之前正确设置“cpuset.mems”。即使需要使用活动任务更改“cpuset.mems”,也不应该频繁进行。 + +#### cpuset.mems.effective + +所有启用 cpuset 的 cgroup 上都存在的只读多值文件。 + +它列出了此 cgroup 的父级实际授予其的在线内存节点。这些内存节点允许由当前 cgroup 内的任务使用。 + +如果“cpuset.mems”为空,则显示父 cgroup 中可供此 cgroup 使用的所有内存节点。否则,它应该是“cpuset.mems”的子集,除非“cpuset.mems”中列出的任何内存节点都无法授予。在这种情况下,它将被视为空的“cpuset.mems”。 + +其值会受到内存节点热插拔事件的影响。 + +#### 测试用例 + +- **cgroup-v2-cpuset-cpus:** 测试cpuset.cpus和cpuset.cpus.effetive接口文件 +- **cgroup-v2-cpuset-cpus-partition:** 测试cpuset.cpus.patition接口文件 +- **cgroup-v2-cpuset-mems:** 测试cpuset.mems和cpuset.mems.effetive接口文件 + +#### 测试结果 + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813222250409](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813222250409.png) + +cgroup-v2-cpuset-cpus-partition测试用例要在2个以上cpu才能测试,因为root cgroup始终要占有一个cpu + +cgroup-v2-cpuset-mems测试用例需要在2个及以上NUMA节点才能测试 + +本地qemu: + +![image-20240814121353069](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814121353069.png) + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814142314782](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814142314782.png) + +cgroup-v2-cpuset-cpus-partition测试用例要在2个以上cpu才能测试,因为root cgroup始终要占有一个cpu + +cgroup-v2-cpuset-mems测试用例需要在2个及以上NUMA节点才能测试 + +本地qemu: + +![image-20240814155933002](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155933002.png) + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814185448434](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814185448434.png) + +### hugetlb + +HugeTLB 控制器允许限制每个控制组的 HugeTLB 使用情况,并在页面错误期间强制执行控制器限制。 + +**接口文件:** + +- **hugetlb.2MB.max:** 读写文件。设置hugepage大小为2MB的hugepage使用量限制 +- **hugetlb.1GB.max:** 读写文件。设置hugepage大小为1GB的hugepage使用量限制 +- **hugetlb.2MB.current:** 只读文件。显示hugepages大小为2MB的hugepage的当前使用量 +- **hugetlb.1GB.current:** 只读文件。显示hugepages大小为1GB的hugepage的当前使用量 +- **hugetlb.2MB.rsvd.max:** 读写文件。设置hugepage大小为2MB的hugepage预留限制 +- **hugetlb.1GB.rsvd.max:** 读写文件。设置hugepage大小为1GB的hugepage预留限制 +- **hugetlb.2MB.rsvd.current:** 只读文件。显示hugepages大小为2MB的hugepage的当前预留量 +- **hugetlb.1GB.rsvd.current:** 只读文件。显示hugepages大小为1GB的hugepage的当前预留量 +- **hugetlb..2MB.events:** 存在于非 root cgroup 上的只读平键文件,包含以下字段: + - max:由于 HugeTLB 限制导致分配失败的次数 +- **hugetlb.1GB.events:** 存在于非 root cgroup 上的只读平键文件,包含以下字段: + - max:由于 HugeTLB 限制导致分配失败的次数 + +**测试用例:** + +- **cgroup-v2-hugetlb-max-001:** 测试hugetlb.2MB.max接口文件,超过限制 +- **cgroup-v2-hugetlb-max-002:** 测试hugetlb.2MB.max接口文件, 不超过限制 +- **cgroup-v2-hugetlb-max-003:** 测试hugetlb.1GB.max接口文件, 超过限制 +- **cgroup-v2-hugetlb-max-004:** 测试hugetlb.1GB.max接口文件, 不超过限制 +- **cgroup-v2-hugetlb-rsvd-max-001:** 测试hugetlb.2MB.rsvd.max接口文件,超过限制 +- **cgroup-v2-hugetlb-rsvd-max-002:** 测试hugetlb.2MB.rsvd.max接口文件,不超过限制 +- **cgroup-v2-hugetlb-rsvd-max-003:** 测试hugetlb.1GB.rsvd.max接口文件, 超过限制 +- **cgroup-v2-hugetlb-rsvd-max-004:** 测试hugetlb.1GB.rsvd.max接口文件, 不超过限制 + +**测试结果: ** + +**OpenCloudOS 8:** + +腾讯云: + +![image-20240813222437274](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240813222437274.png) + +都跳过测试的原因:不能启用hugetlb控制器,即root cgroup 的cgroup.control没有包含该控制器 + +本地qemu: + +![image-20240814121500396](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814121500396.png) + +都跳过测试的原因:不能启用hugetlb控制器,即root cgroup 的cgroup.control没有包含该控制器 + +**OpenCloudOS 9:** + +腾讯云: + +![image-20240814142348511](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814142348511.png) + +本地qemu: + +![image-20240814155949999](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814155949999.png) + +修改hugepage大小为1G后测试: + +![image-20240814161512867](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814161512867.png) + +cgroup-v2-hugetlb-max-003/004测试失败,即hugetlb.1GB.max没有正常发挥效果 + +**OpenCloudOS Stream 23:** + +本地qemu: + +![image-20240814185505769](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814185505769.png) + +修改hugepage大小为1G后测试: + +![image-20240814190419664](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814190419664.png) + +cgroup-v2-hugetlb-max-003/004测试失败,即hugetlb.1GB.max没有正常发挥效果 + -- Gitee From aec64f5511642daaaf7ae81740c533c5c239e71a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 19:49:56 +0800 Subject: [PATCH 24/37] Update --- .../tst-cgroup/tst_common/.gitignore" | 33 - .../tst-cgroup/tst_common/LICENSE" | 824 ------------------ .../tst-cgroup/tst_common/Makefile" | 27 - .../tst-cgroup/tst_common/Makefile.common" | 2 - .../tst-cgroup/tst_common/README.md" | 21 - .../tst-cgroup/tst_common/cmd/Makefile" | 20 - .../tst-cgroup/tst_common/cmd/tsuite.c" | 6 - .../tst-cgroup/tst_common/docs/API-C.md" | 24 - .../tst-cgroup/tst_common/docs/API-Python.md" | 62 -- .../tst-cgroup/tst_common/docs/API-Shell.md" | 68 -- .../tst-cgroup/tst_common/kmod/Makefile" | 28 - .../tst-cgroup/tst_common/kmod/kmod_common.c" | 14 - .../tst-cgroup/tst_common/lib/Makefile" | 20 - .../tst-cgroup/tst_common/lib/benchmark.c" | 389 --------- .../tst-cgroup/tst_common/lib/benchmark.h" | 81 -- .../tst-cgroup/tst_common/lib/benchmark.py" | 304 ------- .../tst-cgroup/tst_common/lib/common.c" | 597 ------------- .../tst-cgroup/tst_common/lib/common.h" | 139 --- .../tst-cgroup/tst_common/lib/common.py" | 755 ---------------- .../tst-cgroup/tst_common/lib/common.sh" | 735 ---------------- .../tst-cgroup/tst_common/lib/common_func.sh" | 88 -- .../tst-cgroup/tst_common/lib/main.h" | 12 - .../tst-cgroup/tst_common/lib/sched.py" | 129 --- .../tst-cgroup/tst_common/lib/tst_ts_setup" | 55 -- .../tst_common/lib/tst_ts_teardown" | 47 - .../tst_common/lib/tsuite-completion.bash" | 51 -- .../tst-cgroup/tst_common/lib/tsuite_func.sh" | 499 ----------- .../tst-cgroup/tst_common/testcase/Makefile" | 20 - .../tst_common/testcase/test_c_testcase.c" | 35 - .../tst_common/testcase/test_perf_tools.py" | 51 -- .../testcase/test_python_testcase.py" | 38 - .../testcase/test_shell_testcase.sh" | 47 - .../tst-cgroup/tst_common/tsuite" | 17 - 33 files changed, 5238 deletions(-) delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" deleted file mode 100644 index 8e67438..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.gitignore" +++ /dev/null @@ -1,33 +0,0 @@ -# Build and Release Folders -bin-debug/ -bin-release/ -[Oo]bj/ -[Bb]in/ - -# Other files and folders -.settings/ - -# Executables -*.swf -*.air -*.ipa -*.apk - -# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` -# should NOT be excluded as they contain compiler settings and other important -# information for Eclipse / Flash Builder. -.idea/ -logs/ -__pycache__/ -*.o -*.a -*.d -*.cmd -*.test -*.log -*.ko -*.mod -*.mod.c -Module.symvers -modules.order -compile_commands.json diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" deleted file mode 100644 index d06cc9f..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/LICENSE" +++ /dev/null @@ -1,824 +0,0 @@ -Tencent is pleased to support the open source community by making OpenCloudOS Kernel Stream available. - -Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications"). All Tencent Modifications are Copyright (C) THL A29 Limited. - -OpenCloudOS Kernel Stream is licensed under the the Mulan Permissive Software License 2.0 except for the third-party components listed below. - - -Terms of the Mulan Permissive Software License 2.0: --------------------------------------------------------------------- - 木兰宽松许可证, 第2版 - -2020年1月 http://license.coscl.org.cn/MulanPSL2 - -您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: - -0. 定义 - -“软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 - -“贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 - -“贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 - -“法人实体”是指提交贡献的机构及其“关联实体”。 - -“关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 - -1. 授予版权许可 - -每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 - -2. 授予专利许可 - -每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 - -3. 无商标许可 - -“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 - -4. 分发限制 - -您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 - -5. 免责声明与责任限制 - -“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 - -6. 语言 - -“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 - -条款结束 - -如何将木兰宽松许可证,第2版,应用到您的软件 - -如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: - -1,请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; - -2,请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; - -3,请将如下声明文本放入每个源文件的头部注释中。 - -Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. - -January 2020 http://license.coscl.org.cn/MulanPSL2 - -Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: - -0. Definition - -Software means the program and related documents which are licensed under this License and comprise all Contribution(s). - -Contribution means the copyrightable work licensed by a particular Contributor under this License. - -Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. - -Legal Entity means the entity making a Contribution and all its Affiliates. - -Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. - -1. Grant of Copyright License - -Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. - -2. Grant of Patent License - -Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. - -3. No Trademark License - -No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. - -4. Distribution Restriction - -You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. - -5. Disclaimer of Warranty and Limitation of Liability - -THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -6. Language - -THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. - -END OF THE TERMS AND CONDITIONS - - - -Other dependencies and licenses: - - -Open Source Software Licensed under the GPL v2.0 with Linux-syscall-note, and Other Licenses of the Third-Party Components therein: -The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications"). All Tencent Modifications are Copyright (C) 2021 THL A29 Limited. --------------------------------------------------------------------- -1. kernel -Copyright © kernel original author and authors - - -The Linux Kernel is provided under: - - SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note - -Being under the terms of the GNU General Public License version 2 only, -according with: - - LICENSES/preferred/GPL-2.0 - -With an explicit syscall exception, as stated at: - - LICENSES/exceptions/Linux-syscall-note - -In addition, other licenses may also apply. Please see: - - Documentation/process/license-rules.rst - -for more details. - -All contributions to the Linux Kernel are subject to this COPYING file. - -Valid-License-Identifier: GPL-2.0 -Valid-License-Identifier: GPL-2.0-only -Valid-License-Identifier: GPL-2.0+ -Valid-License-Identifier: GPL-2.0-or-later -SPDX-URL: https://spdx.org/licenses/GPL-2.0.html -Usage-Guide: - To use this license in source code, put one of the following SPDX - tag/value pairs into a comment according to the placement - guidelines in the licensing rules documentation. - For 'GNU General Public License (GPL) version 2 only' use: - SPDX-License-Identifier: GPL-2.0 - or - SPDX-License-Identifier: GPL-2.0-only - For 'GNU General Public License (GPL) version 2 or any later version' use: - SPDX-License-Identifier: GPL-2.0+ - or - SPDX-License-Identifier: GPL-2.0-or-later -License-Text: - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - -SPDX-Exception-Identifier: Linux-syscall-note -SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html -SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+, GPL-2.0-only, GPL-2.0-or-later -Usage-Guide: - This exception is used together with one of the above SPDX-Licenses - to mark user space API (uapi) header files so they can be included - into non GPL compliant user space application code. - To use this exception add it with the keyword WITH to one of the - identifiers in the SPDX-Licenses tag: - SPDX-License-Identifier: WITH Linux-syscall-note -License-Text: - - NOTE! This copyright does *not* cover user programs that use kernel - services by normal system calls - this is merely considered normal use - of the kernel, and does *not* fall under the heading of "derived work". - Also note that the GPL below is copyrighted by the Free Software - Foundation, but the instance of code that it refers to (the Linux - kernel) is copyrighted by me and others who actually wrote it. - - Also note that the only valid version of the GPL as far as the kernel - is concerned is _this_ particular version of the license (ie v2, not - v2.2 or v3.x or whatever), unless explicitly otherwise stated. - - Linus Torvalds - -For the licenses of other third parties, please refer to the following URL: -https://github.com/torvalds/linux/tree/v5.18-rc5/LICENSES - -Linux kernel licensing rules -The Linux Kernel is provided under the terms of the GNU General Public License version 2 only (GPL-2.0), as provided in LICENSES/preferred/GPL-2.0, with an explicit syscall exception described in LICENSES/exceptions/Linux-syscall-note, as described in the COPYING file. - -This documentation file provides a description of how each source file should be annotated to make its license clear and unambiguous. It doesn't replace the Kernel's license. - -The license described in the COPYING file applies to the kernel source as a whole, though individual source files can have a different license which is required to be compatible with the GPL-2.0: - -GPL-1.0+ : GNU General Public License v1.0 or later -GPL-2.0+ : GNU General Public License v2.0 or later -LGPL-2.0 : GNU Library General Public License v2 only -LGPL-2.0+ : GNU Library General Public License v2 or later -LGPL-2.1 : GNU Lesser General Public License v2.1 only -LGPL-2.1+ : GNU Lesser General Public License v2.1 or later -Aside from that, individual files can be provided under a dual license, e.g. one of the compatible GPL variants and alternatively under a permissive license like BSD, MIT etc. - -The User-space API (UAPI) header files, which describe the interface of user-space programs to the kernel are a special case. According to the note in the kernel COPYING file, the syscall interface is a clear boundary, which does not extend the GPL requirements to any software which uses it to communicate with the kernel. Because the UAPI headers must be includable into any source files which create an executable running on the Linux kernel, the exception must be documented by a special license expression. - -The common way of expressing the license of a source file is to add the matching boilerplate text into the top comment of the file. Due to formatting, typos etc. these "boilerplates" are hard to validate for tools which are used in the context of license compliance. - -An alternative to boilerplate text is the use of Software Package Data Exchange (SPDX) license identifiers in each source file. SPDX license identifiers are machine parsable and precise shorthands for the license under which the content of the file is contributed. SPDX license identifiers are managed by the SPDX Workgroup at the Linux Foundation and have been agreed on by partners throughout the industry, tool vendors, and legal teams. For further information see https://spdx.org/ - -The Linux kernel requires the precise SPDX identifier in all source files. The valid identifiers used in the kernel are explained in the section License identifiers and have been retrieved from the official SPDX license list at https://spdx.org/licenses/ along with the license texts. - -License identifier syntax -Placement: - -The SPDX license identifier in kernel files shall be added at the first possible line in a file which can contain a comment. For the majority of files this is the first line, except for scripts which require the '#!PATH_TO_INTERPRETER' in the first line. For those scripts the SPDX identifier goes into the second line. - - -Style: - -The SPDX license identifier is added in form of a comment. The comment style depends on the file type: - -C source: // SPDX-License-Identifier: -C header: /* SPDX-License-Identifier: */ -ASM: /* SPDX-License-Identifier: */ -scripts: # SPDX-License-Identifier: -.rst: .. SPDX-License-Identifier: -.dts{i}: // SPDX-License-Identifier: -If a specific tool cannot handle the standard comment style, then the appropriate comment mechanism which the tool accepts shall be used. This is the reason for having the "/* */" style comment in C header files. There was build breakage observed with generated .lds files where 'ld' failed to parse the C++ comment. This has been fixed by now, but there are still older assembler tools which cannot handle C++ style comments. - - -Syntax: - -A is either an SPDX short form license identifier found on the SPDX License List, or the combination of two SPDX short form license identifiers separated by "WITH" when a license exception applies. When multiple licenses apply, an expression consists of keywords "AND", "OR" separating sub-expressions and surrounded by "(", ")" . - -License identifiers for licenses like [L]GPL with the 'or later' option are constructed by using a "+" for indicating the 'or later' option.: - -// SPDX-License-Identifier: GPL-2.0+ -// SPDX-License-Identifier: LGPL-2.1+ -WITH should be used when there is a modifier to a license needed. For example, the linux kernel UAPI files use the expression: - -// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note -// SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note -Other examples using WITH exceptions found in the kernel are: - -// SPDX-License-Identifier: GPL-2.0 WITH mif-exception -// SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 -Exceptions can only be used with particular License identifiers. The valid License identifiers are listed in the tags of the exception text file. For details see the point Exceptions in the chapter License identifiers. - -OR should be used if the file is dual licensed and only one license is to be selected. For example, some dtsi files are available under dual licenses: - -// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause -Examples from the kernel for license expressions in dual licensed files: - -// SPDX-License-Identifier: GPL-2.0 OR MIT -// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause -// SPDX-License-Identifier: GPL-2.0 OR Apache-2.0 -// SPDX-License-Identifier: GPL-2.0 OR MPL-1.1 -// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT -// SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause OR OpenSSL -AND should be used if the file has multiple licenses whose terms all apply to use the file. For example, if code is inherited from another project and permission has been given to put it in the kernel, but the original license terms need to remain in effect: - -// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT -Another other example where both sets of license terms need to be adhered to is: - -// SPDX-License-Identifier: GPL-1.0+ AND LGPL-2.1+ -License identifiers -The licenses currently used, as well as the licenses for code added to the kernel, can be broken down into: - -Preferred licenses: - -Whenever possible these licenses should be used as they are known to be fully compatible and widely used. These licenses are available from the directory: - -LICENSES/preferred/ -in the kernel source tree. - -The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. - -Examples: - -LICENSES/preferred/GPL-2.0 -Contains the GPL version 2 license text and the required metatags: - -LICENSES/preferred/MIT -Contains the MIT license text and the required metatags - -Metatags: - -The following meta tags must be available in a license file: - -Valid-License-Identifier: - -One or more lines which declare which License Identifiers are valid inside the project to reference this particular license text. Usually this is a single valid identifier, but e.g. for licenses with the 'or later' options two identifiers are valid. - -SPDX-URL: - -The URL of the SPDX page which contains additional information related to the license. - -Usage-Guidance: - -Freeform text for usage advice. The text must include correct examples for the SPDX license identifiers as they should be put into source files according to the License identifier syntax guidelines. - -License-Text: - -All text after this tag is treated as the original license text - -File format examples: - -Valid-License-Identifier: GPL-2.0 -Valid-License-Identifier: GPL-2.0+ -SPDX-URL: https://spdx.org/licenses/GPL-2.0.html -Usage-Guide: - To use this license in source code, put one of the following SPDX - tag/value pairs into a comment according to the placement - guidelines in the licensing rules documentation. - For 'GNU General Public License (GPL) version 2 only' use: - SPDX-License-Identifier: GPL-2.0 - For 'GNU General Public License (GPL) version 2 or any later version' use: - SPDX-License-Identifier: GPL-2.0+ -License-Text: - Full license text -SPDX-License-Identifier: MIT -SPDX-URL: https://spdx.org/licenses/MIT.html -Usage-Guide: - To use this license in source code, put the following SPDX - tag/value pair into a comment according to the placement - guidelines in the licensing rules documentation. - SPDX-License-Identifier: MIT -License-Text: - Full license text - -Deprecated licenses: - -These licenses should only be used for existing code or for importing code from a different project. These licenses are available from the directory: - -LICENSES/deprecated/ -in the kernel source tree. - -The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. - -Examples: - -LICENSES/deprecated/ISC -Contains the Internet Systems Consortium license text and the required metatags: - -LICENSES/deprecated/GPL-1.0 -Contains the GPL version 1 license text and the required metatags. - -Metatags: - -The metatag requirements for 'other' licenses are identical to the requirements of the Preferred licenses. - -File format example: - -Valid-License-Identifier: ISC -SPDX-URL: https://spdx.org/licenses/ISC.html -Usage-Guide: - Usage of this license in the kernel for new code is discouraged - and it should solely be used for importing code from an already - existing project. - To use this license in source code, put the following SPDX - tag/value pair into a comment according to the placement - guidelines in the licensing rules documentation. - SPDX-License-Identifier: ISC -License-Text: - Full license text - -Dual Licensing Only - -These licenses should only be used to dual license code with another license in addition to a preferred license. These licenses are available from the directory: - -LICENSES/dual/ -in the kernel source tree. - -The files in this directory contain the full license text and Metatags. The file names are identical to the SPDX license identifier which shall be used for the license in source files. - -Examples: - -LICENSES/dual/MPL-1.1 -Contains the Mozilla Public License version 1.1 license text and the required metatags: - -LICENSES/dual/Apache-2.0 -Contains the Apache License version 2.0 license text and the required metatags. - -Metatags: - -The metatag requirements for 'other' licenses are identical to the requirements of the Preferred licenses. - -File format example: - -Valid-License-Identifier: MPL-1.1 -SPDX-URL: https://spdx.org/licenses/MPL-1.1.html -Usage-Guide: - Do NOT use. The MPL-1.1 is not GPL2 compatible. It may only be used for - dual-licensed files where the other license is GPL2 compatible. - If you end up using this it MUST be used together with a GPL2 compatible - license using "OR". - To use the Mozilla Public License version 1.1 put the following SPDX - tag/value pair into a comment according to the placement guidelines in - the licensing rules documentation: -SPDX-License-Identifier: MPL-1.1 -License-Text: - Full license text - -Exceptions: - -Some licenses can be amended with exceptions which grant certain rights which the original license does not. These exceptions are available from the directory: - -LICENSES/exceptions/ -in the kernel source tree. The files in this directory contain the full exception text and the required Exception Metatags. - -Examples: - -LICENSES/exceptions/Linux-syscall-note -Contains the Linux syscall exception as documented in the COPYING file of the Linux kernel, which is used for UAPI header files. e.g. /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */: - -LICENSES/exceptions/GCC-exception-2.0 -Contains the GCC 'linking exception' which allows to link any binary independent of its license against the compiled version of a file marked with this exception. This is required for creating runnable executables from source code which is not compatible with the GPL. - -Exception Metatags: - -The following meta tags must be available in an exception file: - -SPDX-Exception-Identifier: - -One exception identifier which can be used with SPDX license identifiers. - -SPDX-URL: - -The URL of the SPDX page which contains additional information related to the exception. - -SPDX-Licenses: - -A comma separated list of SPDX license identifiers for which the exception can be used. - -Usage-Guidance: - -Freeform text for usage advice. The text must be followed by correct examples for the SPDX license identifiers as they should be put into source files according to the License identifier syntax guidelines. - -Exception-Text: - -All text after this tag is treated as the original exception text - -File format examples: - -SPDX-Exception-Identifier: Linux-syscall-note -SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html -SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+ -Usage-Guidance: - This exception is used together with one of the above SPDX-Licenses - to mark user-space API (uapi) header files so they can be included - into non GPL compliant user-space application code. - To use this exception add it with the keyword WITH to one of the - identifiers in the SPDX-Licenses tag: - SPDX-License-Identifier: WITH Linux-syscall-note -Exception-Text: - Full exception text -SPDX-Exception-Identifier: GCC-exception-2.0 -SPDX-URL: https://spdx.org/licenses/GCC-exception-2.0.html -SPDX-Licenses: GPL-2.0, GPL-2.0+ -Usage-Guidance: - The "GCC Runtime Library exception 2.0" is used together with one - of the above SPDX-Licenses for code imported from the GCC runtime - library. - To use this exception add it with the keyword WITH to one of the - identifiers in the SPDX-Licenses tag: - SPDX-License-Identifier: WITH GCC-exception-2.0 -Exception-Text: - Full exception text -All SPDX license identifiers and exceptions must have a corresponding file in the LICENSES subdirectories. This is required to allow tool verification (e.g. checkpatch.pl) and to have the licenses ready to read and extract right from the source, which is recommended by various FOSS organizations, e.g. the FSFE REUSE initiative. - -MODULE_LICENSE -Loadable kernel modules also require a MODULE_LICENSE() tag. This tag is neither a replacement for proper source code license information (SPDX-License-Identifier) nor in any way relevant for expressing or determining the exact license under which the source code of the module is provided. - -The sole purpose of this tag is to provide sufficient information whether the module is free software or proprietary for the kernel module loader and for user space tools. - -The valid license strings for MODULE_LICENSE() are: - -"GPL" Module is licensed under GPL version 2. This does not express any distinction between GPL-2.0-only or GPL-2.0-or-later. The exact license information can only be determined via the license information in the corresponding source files. -"GPL v2" Same as "GPL". It exists for historic reasons. -"GPL and additional rights" Historical variant of expressing that the module source is dual licensed under a GPL v2 variant and MIT license. Please do not use in new code. -"Dual MIT/GPL" The correct way of expressing that the module is dual licensed under a GPL v2 variant or MIT license choice. -"Dual BSD/GPL" The module is dual licensed under a GPL v2 variant or BSD license choice. The exact variant of the BSD license can only be determined via the license information in the corresponding source files. -"Dual MPL/GPL" The module is dual licensed under a GPL v2 variant or Mozilla Public License (MPL) choice. The exact variant of the MPL license can only be determined via the license information in the corresponding source files. -"Proprietary" The module is under a proprietary license. This string is solely for proprietary third party modules and cannot be used for modules which have their source code in the kernel tree. Modules tagged that way are tainting the kernel with the 'P' flag when loaded and the kernel module loader refuses to link such modules against symbols which are exported with EXPORT_SYMBOL_GPL(). \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" deleted file mode 100644 index 617a017..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile" +++ /dev/null @@ -1,27 +0,0 @@ -export TST_COMMON_TOPDIR := $(shell pwd) -DIRS := cmd testcase kmod -LIBS := lib - -all: libs - @for d in $(DIRS); do \ - echo try make common $$d; \ - make -C $$d all; \ - done - -libs: - @for d in $(LIBS); do \ - echo try make common $$d; \ - make -C $$d all; \ - done - -clean: - @for d in $(DIRS) $(LIBS); do \ - echo try clean common $$d; \ - make -C $$d clean; \ - done - -cleanall: - @for d in $(DIRS) $(LIBS); do \ - echo try cleanall common $$d; \ - make -C $$d cleanall; \ - done diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" deleted file mode 100644 index 80b47be..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/Makefile.common" +++ /dev/null @@ -1,2 +0,0 @@ -CFLAGS += -Wall -g -I$(TST_COMMON_TOPDIR)/lib -LDFLAGS += -lm -lrt -lpthread -lcommon -L$(TST_COMMON_TOPDIR)/lib diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" deleted file mode 100644 index 315b9f9..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/README.md" +++ /dev/null @@ -1,21 +0,0 @@ -# 概述 -本项目为自动化测试用例的公共代码库和框架代码,公共库接口函数见`docs/API-*.md`部分内容 -测试套应用请参考:https://gitee.com/opencloudos-stream/test-suite-example - -# 用法 -```shell -tsuite options sub_command sub_options - help: 显示帮助信息 - new case sh|c|py case_name [template]: 新增测试用例 - sh|c|py: 【必选】三选一,sh表示Shell脚本用例,c表示C用例,py表示Python脚本用例 - case_name: 【必选】要创建的用例名,同时用作文件名 - template: 【可选】不使用默认用例模板时,可以指定一个文件用作新用例模板 - list: 列出本测试套的测试用例 - compile: 编译测试套 - setup: 执行测试套setup - run [case_path|case_name]: 执行测试用例 - case_path|case_name: 【可选】不指定此参数时执行测试套所有用例,指定时执行指定用例 - teardown: 执行测试套teardown - clean: 执行make clean - cleanall: 执行make cleanall,在clean基础上删除所有临时文件等 -``` \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" deleted file mode 100644 index 7eec895..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/Makefile" +++ /dev/null @@ -1,20 +0,0 @@ -export TST_COMMON_TOPDIR ?= $(shell pwd)/.. -include $(TST_COMMON_TOPDIR)/Makefile.common -ALL_SRC := $(wildcard *.c) -ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) -ALL_BIN := $(patsubst %.o,%.cmd,$(ALL_OBJ)) -CFLAGS += -LDFLAGS += - -all: $(ALL_BIN) - -$(ALL_BIN):%.cmd:%.o - $(CC) $^ -o $@ $(LDFLAGS) - -$(ALL_OBJ):%.o:%.c - $(CC) $(CFLAGS) -c $^ -o $@ - -clean: - rm -rfv $(ALL_OBJ) $(ALL_BIN) - -cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" deleted file mode 100644 index 006dcf3..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/cmd/tsuite.c" +++ /dev/null @@ -1,6 +0,0 @@ -#include "common.h" - -int main(void) { - dbg("hello world"); - return 0; -} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" deleted file mode 100644 index 988a482..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-C.md" +++ /dev/null @@ -1,24 +0,0 @@ -# 断言 -## assert_true -```C -// 原型:assert_true(expr) -// 功能:断言表达式返回真 -// 参数: -// expr -- 表达式 -// 返回值:无 -// 示例: -assert_true(1 == 2); -assert_true(a >= b); -``` - -## assert_false -```C -// 原型:assert_false(expr) -// 功能:断言表达式返回假 -// 参数: -// expr -- 表达式 -// 返回值:无 -// 示例: -assert_false(1 == 2); -assert_false(a >= b); -``` diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" deleted file mode 100644 index 033c9f5..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Python.md" +++ /dev/null @@ -1,62 +0,0 @@ -# 断言 -## assert_true -```Python -def assert_true(self, expr, message=None): - """ - 断言表达式返回真 - :param expr: 要断言的表达式 - :param message: 断言要输出的信息 - :return: None - 示例: - assert_true(1 == 2) - assert_true(a >= b) - """ - pass -``` - -## assert_false -```Python -def assert_false(self, expr, message=None): - """ - 断言表达式返回假 - :param expr: 要断言的表达式 - :param message: 断言要输出的信息 - :return: None - 示例: - assert_false(1 == 2) - assert_false(a >= b) - """ - pass -``` - -## skip_test、skip_if_true和skip_if_false -```Python -def skip_test(self, message=None): - """ - 标记用例为SKIP状态(当用例不需要测试时) - :param message: 要输出的信息 - :return: None - 示例: - skip_test(message='内核CONFIG_XXX未开,系统不支持此测试') - """ - -def skip_if_true(self, expr, message=None): - """ - 当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 - :param expr: 要判断的表达式 - :param message: 要输出的信息 - :return: None - 示例: - skip_if_true(1 == 2) - """ - -def skip_if_false(self, expr, message=None): - """ - 当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 - :param expr: 要判断的表达式 - :param message: 要输出的信息 - :return: None - 示例: - skip_if_false(1 == 2) - """ -``` diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" deleted file mode 100644 index 3aa1ab0..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/docs/API-Shell.md" +++ /dev/null @@ -1,68 +0,0 @@ -# 断言 -## assert_true和assert_true_cont -```Shell -# 功能:断言表达式返回真或命令执行成功,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 -# 参数: -# $* -- 需要断言的表达式 -# 返回值: -# 0 -- 断言成功 -# 1 -- 断言失败 -# 示例: -assert_true [ $? -eq 0 ] -assert_true_cont grep "abc" /tmp/file -``` - -## assert_false和assert_false_cont -```Shell -# 功能:断言表达式返回假或命令执行失败,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 -# 参数: -# $* -- 需要断言的表达式 -# 返回值: -# 0 -- 断言成功 -# 1 -- 断言失败 -# 示例: -assert_false test -d /tmp/dir -assert_false_cont rmmod mykmod -``` - -## skip_test、skip_if_true和skip_if_false -```Shell -# skip_test -# 功能:标记用例为SKIP状态(当用例不需要测试时) -# 参数: -# $1 -- 对SKIP状态标记的描述 -# 返回值:无 -# 示例: -skip_test "内核CONFIG_XXXX未打开,系统不支持xxx功能" - -# skip_if_true -# 功能:当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 -# 参数: -# $* -- 需要断言的表达式 -# 返回值:无 -# 示例: -skip_if_true test -f /etc/xxx.conf - -# skip_if_false -# 功能:当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 -# 参数: -# $* -- 需要断言的表达式 -# 返回值:无 -# 示例: -skip_if_false which ps -``` -# 工具 -## conv_unit -```Shell -# 功能:将K/M/G/T等单位互相转换 -# 参数:conv_unit [-i k|m|g|t] [-o k|m|g|t] value[_with_unit] -# -i k|m|g|t 【可选参数】输入数据的单位,可选参数,若不指定单位,则默认为1,或者输入的值后面带参数 -# -o k|m|g|t 【可选参数】输出数据的单位,若不指定单位,则默认为1 -# value[_with_unit] 【必选参数】需要转换的数据值,可以跟单位(只取单位第一个字母用于判断k|m|g|t) -# 返回值:标准输出转换后的结果 -# 0 -- 转换成功 -# 1 -- 转换失败 -# 示例: -conv_unit -o M 3G -conv_unit -o M -i G 3 -``` diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" deleted file mode 100644 index 01632ef..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/Makefile" +++ /dev/null @@ -1,28 +0,0 @@ -# General Purpose Makefile for Linux Kernel module -# 以下编译适合于在内核代码树之外编译内核模块。 -# 整个过程会导致本Makefile文件被加载执行两遍。 -# 第一遍执行时,由于`KERNELRELEASE`没有被定义,所以先执行`else`下的逻辑。 -# `-C $(KERNEL_DIR)`指明跳转到内核源码目录下读取那里的Makefile; -# `M=$(CURDIR)`表明然后返回到当前目录继续读入当前的Makefile并执行之。此为第二遍执行。 -# 第二遍执行时,此时从内核源码目录返回时,KERNELRELEASE已被被定义, -# kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。 -# else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。 - -CURDIR ?= $(shell pwd) -KERNEL_VER := $(shell uname -r) -KERNEL_DIR ?= /lib/modules/$(KERNEL_VER)/build -export ALL_SRC ?= $(filter-out %.mod.c, $(wildcard *.c)) -export ALL_OBJ ?= $(patsubst %.c,%.o,$(ALL_SRC)) -export ALL_MOD ?= $(patsubst %.o,%.ko,$(ALL_OBJ)) - -ifneq ($(KERNELRELEASE),) - obj-m += $(ALL_OBJ) -else -all: - $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules -endif - -clean: - $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean - -cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" deleted file mode 100644 index 41a779a..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/kmod/kmod_common.c" +++ /dev/null @@ -1,14 +0,0 @@ -#include - -static int __init kmod_common_init(void) { - printk("Hello, World!\n"); - return 0; -} -static void __exit kmod_common_exit(void) { - printk("Goodbye, World!\n"); -} - -module_init(kmod_common_init); -module_exit(kmod_common_exit); - -MODULE_LICENSE("GPL"); diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" deleted file mode 100644 index ac2cdd6..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/Makefile" +++ /dev/null @@ -1,20 +0,0 @@ -export TST_COMMON_TOPDIR ?= $(shell pwd)/.. -include $(TST_COMMON_TOPDIR)/Makefile.common -ALL_SRC := $(wildcard *.c) -ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) -LIB_STATIC := libcommon.a -CFLAGS += - -all: $(LIB_STATIC) - -$(LIB_STATIC): $(ALL_OBJ) - ar -rc $(LIB_STATIC) $(ALL_OBJ) - -$(ALL_OBJ):%.o:%.c - $(CC) $(CFLAGS) -c $^ -o $@ - -clean: - rm -rfv $(LIB_STATIC) $(ALL_OBJ) - -cleanall: clean - rm -rfv __pycache__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" deleted file mode 100644 index 5ff07e0..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.c" +++ /dev/null @@ -1,389 +0,0 @@ -// Time: 2022-06-30 11:10:49 -// Desc: 性能测试框架 - -#include -#include -#include -#include -#include - -#include "benchmark.h" - -long long tst_time_diff(struct tst_time *s, struct tst_time *e) { - return (long long) (e->ts.tv_sec - s->ts.tv_sec) * NS_PER_SEC + (e->ts.tv_nsec - s->ts.tv_nsec); -} - -int tst_get_time(struct tst_time *t) { - if (clock_gettime(CLOCK_MONOTONIC, &(t->ts)) != 0) { - return 1; - } - return 0; -} - -long long tst_time_since_now(struct tst_time *t) { - struct tst_time now; - (void) tst_get_time(&now); - return tst_time_diff(t, &now); -} - -struct tst_perf_ctrl *tst_alloc_ctrl(const char *name, tst_perf_func_t setup, tst_perf_func_t do_test, - tst_perf_func_t teardown, void *args, int warmup, int loop, enum value_type type, - enum key_item key) { - struct tst_perf_ctrl *c = NULL; - - if (name == NULL) { - printf("the name can't be NULL\n"); - return NULL; - } - if (do_test == NULL) { - printf("the do_test function can't be NULL\n"); - return NULL; - } - if (warmup < 0) { - printf("the warmup can't less then 0"); - return NULL; - } - if (loop <= 0) { - printf("the loop must greater then 0"); - return NULL; - } - if (type < LIB || type > HIB) { - printf("the type must in enum value_type"); - return NULL; - } - if (key < key_max || key > key_standard_deviation) { - printf("the key must in enum key_item"); - return NULL; - } - - c = (struct tst_perf_ctrl *) malloc(sizeof(struct tst_perf_ctrl)); - if (c == NULL) { - printf("malloc tst_perf_ctrl fail\n"); - return NULL; - } - (void) memset(c, 0, sizeof(struct tst_perf_ctrl)); - c->name = name; - c->perf_setup = setup; - c->perf_do_test = do_test; - c->perf_teardown = teardown; - c->args = args; - c->nr_warmup = warmup; - c->nr_loop = loop; - c->value_type = type; - c->key_item = key; - c->data = (long long *) calloc(c->nr_loop, sizeof(long long)); - if (c->data == NULL) { - printf("alloc memory for time data fail\n"); - free(c); - return NULL; - } - - return c; -} - -void tst_destroy_ctrl(struct tst_perf_ctrl **c) { - if (c == NULL || *c == NULL) { - return; - } - if ((*c)->data != NULL) { - free((*c)->data); - (*c)->data = NULL; - } - free(*c); - *c = NULL; -} - -int tst_perf_run(struct tst_perf_ctrl *c) { - int ret = 0; - int i; - struct tst_time t; - - if (c == NULL) { - return 1; - } - // 预热 - fprintf(stderr, "%s : start warmup %d\n", c->name, c->nr_warmup); - while (c->nr_warmup > 0) { - c->nr_warmup--; - - if (c->perf_setup) { - ret = c->perf_setup(c->args); - if (ret != 0) { - printf("the perf_setup return %d\n", ret); - return 1; - } - } - - ret = c->perf_do_test(c->args); - if (ret != 0) { - printf("the perf_do_test return %d\n", ret); - return 1; - } - - if (c->perf_teardown) { - ret = c->perf_teardown(c->args); - if (ret != 0) { - printf("the perf_teardown return %d\n", ret); - return 1; - } - } - } - - // 执行性能测试 - fprintf(stderr, "%s : start perf test loop %d\n", c->name, c->nr_loop); - for (i = 0; i < c->nr_loop; i++) { - if (c->perf_setup) { - ret = c->perf_setup(c->args); - if (ret != 0) { - printf("the perf_setup return %d\n", ret); - return 1; - } - } - - (void) tst_get_time(&t); - ret = c->perf_do_test(c->args); - if (ret != 0) { - printf("the perf_do_test return %d\n", ret); - return 1; - } - c->data[i] = tst_time_since_now(&t); - - if (c->perf_teardown) { - ret = c->perf_teardown(c->args); - if (ret != 0) { - printf("the perf_teardown return %d\n", ret); - return 1; - } - } - } - - return 0; -} - -int compare_time(const void *a, const void *b) { - return (int) (*(long long *) a - *(long long *) b); -} - -int statistic_data_base(long long *data, int len, struct tst_statistics_base *result) { - long double sum = 0; - long double step_20, step_100; - long double variance = 0; - int i; - - if (data == NULL || result == NULL || len <= 0) { - return 1; - } - - result->max = data[len - 1]; - result->min = data[0]; - result->median = data[(int) (len / 2)]; - step_20 = (long double) (result->max - result->min) / 20; - step_100 = (long double) (result->max - result->min) / 100; - - for (i = 0; i < len; i++) { - sum += data[i]; - if (step_20 > 0) { - result->dist_20[(int) ((data[i] - result->min) / step_20)]++; - } - if (step_100 > 0) { - result->dist_100[(int) ((data[i] - result->min) / step_100)]++; - } - } - - result->mean = sum / len; - - // 计算方差和 - for (i = 0; i < len; i++) { - variance += powl(data[i] - result->mean, 2); - } - // 计算标准差 - result->standard_deviation = sqrtl(variance / len); - - return 0; -} - -int statistic_data(struct tst_perf_ctrl *c) { - if (c == NULL) { - return 1; - } - int percent_5_start = (int) (c->nr_loop * 0.05); - int percent_5_len = (int) (c->nr_loop * 0.9); - - if (c->data == NULL) { - printf("the data is NULL\n"); - return 1; - } - - // 将时间数据排序 - qsort(c->data, c->nr_loop, sizeof(long long), compare_time); - (void) statistic_data_base(c->data, c->nr_loop, &(c->result.all)); - (void) statistic_data_base(&(c->data[percent_5_start]), percent_5_len, &(c->result.mid_90)); - - return 0; -} - -int show_result_json(struct tst_perf_ctrl *c) { - int i; - - if (statistic_data(c) != 0) { - return 1; - } - - printf("{"); - - printf("'name': '%s',", c->name); - printf("'type': '%s',", "LIB"); - printf("'unit': '%s',", "ns"); - printf("'key': '%s',", "mean"); - - printf("'data': {"); - - printf("100: {"); - printf("'max': %lld,", c->result.all.max); - printf("'min': %lld,", c->result.all.min); - printf("'mean': %Lf,", c->result.all.mean); - printf("'median': %lld,", c->result.all.median); - printf("'standard_deviation': %Lf,", c->result.all.standard_deviation); - printf("'dist_20': ["); - for (i = 0; i < NUM_20; i++) { - printf("%d,", c->result.all.dist_20[i]); - } - printf("],"); - printf("'dist_100': ["); - for (i = 0; i < NUM_100; i++) { - printf("%d,", c->result.all.dist_100[i]); - } - printf("],"); - printf("},"); - - printf("90: {"); - printf("'max': %lld,", c->result.mid_90.max); - printf("'min': %lld,", c->result.mid_90.min); - printf("'mean': %Lf,", c->result.mid_90.mean); - printf("'median': %lld,", c->result.mid_90.median); - printf("'standard_deviation': %Lf,", c->result.mid_90.standard_deviation); - printf("'dist_20': ["); - for (i = 0; i < NUM_20; i++) { - printf("%d,", c->result.mid_90.dist_20[i]); - } - printf("],"); - printf("'dist_100': ["); - for (i = 0; i < NUM_100; i++) { - printf("%d,", c->result.mid_90.dist_100[i]); - } - printf("],"); - printf("},"); - - // end of data - printf("},"); - - printf("}"); - - return 0; -} - - -int tst_test(const char *name, tst_perf_func_t setup, tst_perf_func_t do_test, tst_perf_func_t teardown, - void *args, int warmup, int loop, enum value_type type, enum key_item key) { - - struct tst_perf_ctrl *c = tst_alloc_ctrl(name, setup, do_test, teardown, args, warmup, loop, type, key); - if (c == NULL) { - return 1; - } - tst_perf_run(c); - show_result_json(c); - tst_destroy_ctrl(&c); - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -/* 下面的代码是示例 */ -#if 0 - -#define NR_LOOP_OPEN 100 -#define OPEN_PATH_LEN 128 -struct open_args { - int nr_opened; - char path[NR_LOOP_OPEN][OPEN_PATH_LEN]; - int fds[NR_LOOP_OPEN]; -}; - -int open_setup(void *args) { - int i; - struct rlimit r; - struct open_args *a = (struct open_args *) (args); - - r.rlim_cur = NR_LOOP_OPEN + 1024; - r.rlim_max = r.rlim_cur; - setrlimit(RLIMIT_NOFILE, &r); - memset(a, 0, sizeof(struct open_args)); - - system("rm -rf ./file.ops"); - system("mkdir ./file.ops"); - - for (i = 0; i < NR_LOOP_OPEN; ++i) { - snprintf(a->path[i], OPEN_PATH_LEN, "./file.ops/open.%08d.test", i); - } - return 0; -} - -int open_do_test(void *args) { - int i; - struct open_args *a = (struct open_args *) (args); - for (i = 0; i < NR_LOOP_OPEN; ++i) { - a->fds[i] = open(a->path[i], O_RDWR | O_CREAT | O_EXCL, 0600); - if (a->fds[i] < 0) { - printf("open the %s file fail\n", a->path[i]); - a->nr_opened = i; - return 1; - } - } - a->nr_opened = i; - return 0; -} - -int open_teardown(void *args) { - int i; - struct open_args *a = (struct open_args *) (args); - for (i = 0; i < a->nr_opened; ++i) { - if (a->fds[i] > 0) { - close(a->fds[i]); - a->fds[i] = 0; - } - } - system("rm -rf ./file.ops"); - return 0; -} - -int exec_do_test(void *args) { - pid_t pid = fork(); - pid_t wait; - if (pid == 0) { - execl("./simple.test", "./simple.test", NULL); - } else if (pid > 0) { - wait = waitpid(pid, NULL, 0); - if (wait == pid) { - return 0; - } - printf("waitpid(%d) return %d not as expect\n", pid, wait); - } else { - printf("fork fail\n"); - } - return 1; -} - - -int main(int argc, char **argv) { - struct open_args a; - printf("{"); - printf("'open': "); - tst_test("open.100", open_setup, open_do_test, open_teardown, &a, 100, 2000, LIB, key_mean); - printf(","); - printf("'exec': "); - tst_test("exec", NULL, exec_do_test, NULL, NULL, 100, 5000, LIB, key_mean); - printf(","); - printf("}\n"); - return 0; -} - -#endif \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" deleted file mode 100644 index 738eddb..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.h" +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef TST_SUITE_COMMON_BENCHMARK_H -#define TST_SUITE_COMMON_BENCHMARK_H - - -#define NS_PER_SEC 1000000000 -#define NUM_20 20 -#define NUM_100 100 - -typedef int (*tst_perf_func_t)(void *); - -enum value_type { - // 越小越好(value_type.LIB) - LIB, - // 越大越好(value_type.HIB) - HIB -}; - -enum key_item { - // 最大值 - key_max, - // 最小值 - key_min, - // 平均值 - key_mean, - // 中位数 - key_median, - // 标准差 - key_standard_deviation -}; - -struct tst_time { - struct timespec ts; -}; - -struct tst_statistics_base { - // 时间单位都是ns - long long max; - long long min; - long double mean; - long long median; - long double standard_deviation; - int dist_20[NUM_20]; - int dist_100[NUM_100]; -}; - -struct tst_statistics_result { - struct tst_statistics_base all; - struct tst_statistics_base mid_90; -}; - -struct tst_perf_ctrl { - // 测试项名称 - const char *name; - // 初始化函数 - tst_perf_func_t perf_setup; - // 性能测试的对象函数 - tst_perf_func_t perf_do_test; - // 清理函数 - tst_perf_func_t perf_teardown; - // 性能测试函数的参数 - void *args; - // 预热循环次数 - int nr_warmup; - // 性能测试循环次数 - int nr_loop; - // 性能数据类型, - int value_type; - // 本性能指标最重要的统计数据项,例如最大值(key_item.max)、平均值(key_item.mean) - int key_item; - - // 性能测试数据 - long long *data; - // 性能数据统计结果 - struct tst_statistics_result result; -}; - -extern int tst_get_time(struct tst_time *t); - -extern long long tst_time_since_now(struct tst_time *t); - -#endif //TST_SUITE_COMMON_BENCHMARK_H diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" deleted file mode 100644 index 22f9abb..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/benchmark.py" +++ /dev/null @@ -1,304 +0,0 @@ -#!/usr/bin/env python3 -# coding: utf-8 -import abc -import json -import re -import subprocess -from _ctypes import PyObj_FromPtr -from enum import Enum - - -class ValueType(Enum): - # 越小越好(value_type.LIB) - LIB = 'LIB' - # 越大越好(value_type.HIB) - HIB = 'HIB' - - -class KeyItem(Enum): - # 最大值 - key_max = 'max' - # 最小值 - key_min = 'min' - # 平均值 - key_mean = 'mean' - # 中位数 - key_median = 'median' - # 标准差 - key_standard_deviation = 'standard_deviation' - - -class PerfResult: - def __init__(self, name: str, value_type: ValueType, key_item: KeyItem, unit: str): - self._result = { - "name": f'{name}', - "type": f'{value_type}', - "key": f'{key_item}', - "unit": f'{unit}', - "data": { - "100": { - "max": 0, - "min": 0, - "mean": 0, - "median": 0, - "standard_deviation": 0, - "dist_20": [0] * 20, - "dist_100": [0] * 100 - } - } - } - - @property - def result(self): - return self._result - - -class TSTPerf: - def __init__(self): - self._result = dict() - - @abc.abstractmethod - def run(self): - pass - - def add_result(self, result: PerfResult): - if result.result['name'] in self._result: - raise KeyError(f'the result with name {result.result["name"]} has existed') - self._result[result.result['name']] = result.result - - @property - def results(self): - return self._result - - def report(self): - print(json.dumps(self.results, indent=4, ensure_ascii=False)) - - -class PerfSysBench(TSTPerf): - def __init__(self, name: str, sysbench: str, testname: str, general_opt: str = None, test_opt: str = None): - super(PerfSysBench, self).__init__() - self.name = name - self.sysbench = sysbench - self.prepare = None - self.cleanup = None - self.testname = testname - self.general_opt = general_opt - self.test_opt = test_opt - self.command = f'{sysbench} {self.general_opt if self.general_opt else ""} {testname} ' \ - f'{self.test_opt if self.test_opt else ""} run' - self.outs = None - self.errs = None - - def run(self, timeout=None): - if self.prepare is not None and callable(self.prepare): - self.prepare() - proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self.outs, self.errs = proc.communicate(timeout=timeout) - if self.cleanup is not None and callable(self.cleanup): - self.cleanup() - print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') - print(self.outs) - if self.errs: - print('errors:') - print(self.errs) - self.parse_add_result() - - def get_cpu_result(self): - result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, - unit='ms') - for line in self.outs.splitlines(): - if 'avg:' in line: - mean = float(line.split(':')[1].strip()) - result.result['data']['100']['mean'] = mean - return result - - def get_fileio_result(self, data_type): - result = PerfResult(name=f'{self.name}-{data_type}', value_type=ValueType.HIB, key_item=KeyItem.key_mean, - unit='MiB/s') - for line in self.outs.splitlines(): - if f'{data_type}:' in line: - mean = float((line.split('IOPS')[1]).split(' ')[1].strip()) - result.result['data']['100']['mean'] = mean - return result - - def get_memory_result(self): - result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, - unit='MiB/s') - for line in self.outs.splitlines(): - if 'MiB/sec' in line: - mean = float((line.split('(')[1]).split('MiB')[0].strip()) - result.result['data']['100']['mean'] = mean - return result - def get_threads_result(self): - result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, - unit='ms') - for line in self.outs.splitlines(): - if 'avg:' in line: - mean = float(line.split(':')[1].strip()) - result.result['data']['100']['mean'] = mean - return result - def get_mutex_result(self): - result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, - unit='ms') - for line in self.outs.splitlines(): - if 'avg:' in line: - mean = float(line.split(':')[1].strip()) - result.result['data']['100']['mean'] = mean - return result - def parse_add_result(self): - if self.outs is None: - raise Exception('test output is None') - if self.testname == 'cpu': - self.add_result(self.get_cpu_result()) - elif self.testname == 'fileio': - if re.match(r'read:\s+IOPS=0.0', self.outs): - self.add_result(self.get_fileio_result('write')) - elif re.match(r'write:\s+IOPS=0.0', self.outs): - self.add_result(self.get_fileio_result('read')) - else: - self.add_result(self.get_fileio_result('read')) - self.add_result(self.get_fileio_result('write')) - elif self.testname == 'memory': - self.add_result(self.get_memory_result()) - elif self.testname == 'threads': - self.add_result(self.get_threads_result()) - elif self.testname == 'mutex': - self.add_result(self.get_mutex_result()) - else: - raise Exception(f'unknown test name {self.testname}') - -class PerfStream(TSTPerf): - def __init__(self, name: str, stream: str, general_opt: str = None): - super(PerfStream, self).__init__() - self.name = name - self.stream = stream - self.general_opt = general_opt - self.prepare = None - self.cleanup = None - self.command = f'{stream} {self.general_opt if self.general_opt else ""}' - self.outs = None - self.errs = None - - def run(self, timeout=None): - if self.prepare is not None and callable(self.prepare): - self.prepare() - proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self.outs, self.errs = proc.communicate(timeout=timeout) - if self.cleanup is not None and callable(self.cleanup): - self.cleanup() - print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') - print(self.outs) - if self.errs: - print('errors:') - print(self.errs) - self.parse_add_result() - - def get_stream_result(self, data_type): - result = PerfResult(name=f'{self.name}-{data_type}', value_type=ValueType.HIB, key_item=KeyItem.key_mean, - unit='MiB/s') - for line in self.outs.splitlines(): - if f'{data_type}:' in line: - mean = float((line.split(':')[1].strip()).split(' ')[0].strip()) - result.result['data']['100']['mean'] = mean - return result - def parse_add_result(self): - if self.outs is None: - raise Exception('test output is None') - if self.stream is not None: - self.add_result(self.get_stream_result('Copy')) - self.add_result(self.get_stream_result('Scale')) - self.add_result(self.get_stream_result('Add')) - self.add_result(self.get_stream_result('Triad')) - else: - raise Exception(f'unknown test item {self.stream}') - -class PerfHackbench(TSTPerf): - def __init__(self, name: str, hackbench: str, general_opt: str = None): - super(PerfHackbench, self).__init__() - self.name = name - self.hackbench = hackbench - self.general_opt = general_opt - self.prepare = None - self.cleanup = None - self.command = f'{hackbench} {self.general_opt if self.general_opt else ""}' - self.outs = None - self.errs = None - - def run(self, timeout=None): - if self.prepare is not None and callable(self.prepare): - self.prepare() - proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self.outs, self.errs = proc.communicate(timeout=timeout) - if self.cleanup is not None and callable(self.cleanup): - self.cleanup() - print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') - print(self.outs) - if self.errs: - print('errors:') - print(self.errs) - self.parse_add_result() - - def get_hackbench_result(self): - result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, - unit='s') - for line in self.outs.splitlines(): - if 'Time:' in line: - mean = float(line.split(':')[1].strip()) - result.result['data']['100']['mean'] = mean - return result - def parse_add_result(self): - if self.outs is None: - raise Exception('test output is None') - if self.hackbench is not None: - self.add_result(self.get_hackbench_result()) - else: - raise Exception(f'unknown test item {self.hackbench}') - -class PerfLibMicro(TSTPerf): - def __init__(self, name: str, libmicro: str, general_opt: str = None, test_opt: str = None): - super(PerfLibMicro, self).__init__() - self.name = name - self.libmicro = libmicro - self.prepare = None - self.cleanup = None - self.general_opt = general_opt - self.test_opt = test_opt - self.command = f'{libmicro} {self.general_opt if self.general_opt else ""} ' \ - f'{self.test_opt if self.test_opt else ""}' - self.outs = None - self.errs = None - - def run(self, timeout=None): - if self.prepare is not None and callable(self.prepare): - self.prepare() - proc = subprocess.Popen(self.command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self.outs, self.errs = proc.communicate(timeout=timeout) - if self.cleanup is not None and callable(self.cleanup): - self.cleanup() - print(f'execute command [{self.command}] get exit code {proc.returncode}, output:') - print(self.outs) - if self.errs: - print('errors:') - print(self.errs) - self.parse_add_result() - - def get_libmicro_result(self): - result = PerfResult(name=self.name, value_type=ValueType.LIB, key_item=KeyItem.key_mean, - unit='us') - for line in self.outs.splitlines(): - if 'mean' in line: - mean = float((line.split('mean')[1].strip()).split(' ')[0].strip()) - result.result['data']['100']['mean'] = mean - return result - def parse_add_result(self): - if self.outs is None: - raise Exception('test output is None') - if self.libmicro is not None: - self.add_result(self.get_libmicro_result()) - else: - raise Exception(f'unknown test item {self.libmicro} ') - diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" deleted file mode 100644 index 9bb4f28..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.c" +++ /dev/null @@ -1,597 +0,0 @@ -// Time: 2022-04-18 14:07:49 -// Desc: C用例基础公共函数库 - -#include "common.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct tst_tc_control { - // 用例名 - char tc_name[PATH_MAX]; - // 用例参数 - int tc_argc; - char **tc_argv; - // 用例源文件路径 - char tc_source_path[PATH_MAX]; - // 用例可执行文件路径 - char tc_exec_path[PATH_MAX]; - // 执行用例文件时的目录 - char exec_cwd[PATH_MAX]; - // TST_TC_CWD 测试用例CWD - char tst_tc_cwd[PATH_MAX]; - // 用例开始执行的时间 - struct tst_time time_start; - // TST_TC_PID 测试用例主进程pid - pid_t tst_tc_pid; - // 标记tc_setup是否被调用 - int tc_setup_called; - // 用例执行状态 - int tc_stat; - // TST_TS_TOPDIR 测试套顶层目录 - char tst_ts_topdir[PATH_MAX]; - // TST_COMMON_TOPDIR common顶层目录 - char tst_common_topdir[PATH_MAX]; - // TST_TS_SYSDIR 测试套公共运行目录 - char tst_ts_sysdir[PATH_MAX]; - // TST_TC_SYSDIR 测试用例管理用临时目录 - char tst_tc_sysdir[PATH_MAX]; - // 测试套执行状态标记文件 - char tst_ts_setup_stat[PATH_MAX]; -}; - -struct tst_tc_control *g_tst_tc_control; - -void show_tc_control(void) { - dbg("tc_name: %s", g_tst_tc_control->tc_name); - dbg("tc_source_path: %s", g_tst_tc_control->tc_source_path); - dbg("tc_exec_path: %s", g_tst_tc_control->tc_exec_path); - dbg("exec_cwd: %s", g_tst_tc_control->exec_cwd); - dbg("tst_tc_cwd: %s", g_tst_tc_control->tst_tc_cwd); - dbg("tst_tc_pid: %d", g_tst_tc_control->tst_tc_pid); - dbg("tc_stat: %d", g_tst_tc_control->tc_stat); - dbg("tst_ts_topdir: %s", g_tst_tc_control->tst_ts_topdir); - dbg("tst_ts_sysdir: %s", g_tst_tc_control->tst_ts_sysdir); - dbg("tst_tc_sysdir: %s", g_tst_tc_control->tst_tc_sysdir); - dbg("tst_ts_setup_stat: %s", g_tst_tc_control->tst_ts_setup_stat); -} - -int _print(const char *format, ...) { - va_list ap; - int ret; - char buff[MAX_LOG_LEN] = {0}; - - va_start(ap, format); - ret = vsnprintf(buff, MAX_LOG_LEN - 1, format, ap); - va_end(ap); - - if (buff[ret - 1] != '\n') { - buff[ret] = '\n'; - buff[ret + 1] = '\0'; - } - fprintf(stderr, "%s", buff); - - return ret; -} - -static int _is_main_process(void) { - if (g_tst_tc_control->tst_tc_pid == getpid()) { - return 1; - } - return 0; -} - -static void _set_tcstat(int stat) { - g_tst_tc_control->tc_stat = stat; -} - -static int _get_tcstat(void) { - return g_tst_tc_control->tc_stat; -} - -void _tc_pass(void) { - // 只有初始状态的用例才能置为PASS,其他异常状态的用例不能从异常变为PASS - if (_get_tcstat() == TST_INIT) { - _set_tcstat(TST_PASS); - } -} - -void _tc_fail(void) { - if (_get_tcstat() != TST_FAIL) { - msg("the testcase first fail here"); - } - _set_tcstat(TST_FAIL); -} - -static char *_tcstat_to_str(int tcstat) { - switch (tcstat) { - case TST_PASS: - return "TST_PASS"; - case TST_FAIL: - return "TST_FAIL"; - case TST_INIT: - return "TST_INIT"; - case TST_SKIP: - return "TST_SKIP"; - default: - return "TST_UNKNOWN"; - } -} - -static int _tc_teardown(int argc, char **argv) { - int ret = 0; - - // 只有用例的主进程才能执行此函数 - if (!_is_main_process()) { - return 0; - } - if (tc_teardown) { - if (tc_teardown(argc, argv) == 0) { - msg("call tc_teardown success"); - } else { - err("call tc_teardown fail"); - ret = 1; - } - } else { - msg("tc_teardown not define"); - } - - return ret; -} - -static int _tc_teardown_common(int argc, char **argv) { - int ret = 0; - - // 只有用例的主进程才能执行此函数 - if (!_is_main_process()) { - return 0; - } - if (tc_teardown_common) { - if (tc_teardown_common(argc, argv) == 0) { - msg("call tc_teardown_common success"); - } else { - err("call tc_teardown_common fail"); - ret = 1; - } - } else { - msg("tc_teardown_common not define"); - } - - return ret; -} - -static void _tc_run_complete(int argc, char **argv) { - int ret = 0; - - // 只有用例的主进程才能执行此函数 - if (!_is_main_process()) { - return; - } - // tc_setup有调用时tc_teardown才会被调用 - if (g_tst_tc_control->tc_setup_called) { - if (_tc_teardown(argc, argv) == 0) { - msg("call _tc_teardown success"); - } else { - msg("call _tc_teardown fail"); - ret = 1; - } - } else { - msg("the tc_setup not called, so tc_teardown ignore"); - } - if (_tc_teardown_common(argc, argv) == 0) { - msg("call _tc_teardown_common success"); - } else { - msg("call _tc_teardown_common fail"); - ret = 1; - } - - // TCase自动化执行框架需要用这个输出判断用例是否支持完 - msg("Global test environment tear-down"); - switch (_get_tcstat()) { - case TST_PASS: - msg("RESULT : %s ==> [ PASSED ]", g_tst_tc_control->tc_name); - break; - case TST_FAIL: - msg("RESULT : %s ==> [ FAILED ]", g_tst_tc_control->tc_name); - ret = 1; - break; - case TST_INIT: - msg("RESULT : %s ==> [ NOTEST ]", g_tst_tc_control->tc_name); - ret = 1; - break; - case TST_SKIP: - msg("RESULT : %s ==> [ SKIP ]", g_tst_tc_control->tc_name); - ret = 0; - break; - default: - msg("RESULT : %s ==> [ UNKNOWN ]", g_tst_tc_control->tc_name); - ret = 1; - break; - } - msg("cost %.9Lf", (long double) tst_time_since_now(&(g_tst_tc_control->time_start)) / NS_PER_SEC); - - exit(ret); -} - -void _tst_assert(const char *expr, const char *file, int line, const char *func) { - msg("%s:%d %s assert '%s' fail", file, line, func, expr); - _tc_run_complete(g_tst_tc_control->tc_argc, g_tst_tc_control->tc_argv); -} - -void _skip_test(const char *message, const char *file, int line, const char *func) { - int tc_stat = _get_tcstat(); - - if ((tc_stat == TST_PASS) || (tc_stat == TST_INIT) || (tc_stat == TST_SKIP)) { - _set_tcstat(TST_SKIP); - msg("%s:%d %s: set testcase SKIP: %s", file, line, func, message); - } else { - msg("%s:%d %s: set testcase SKIP fail: %s", file, line, func, message); - err("the testcase stat is %s, can't set to SKIP", _tcstat_to_str(tc_stat)); - } - _tc_run_complete(g_tst_tc_control->tc_argc, g_tst_tc_control->tc_argv); -} - -static int _tc_setup_common(int argc, char **argv) { - int ret = 0; - - if (tc_setup_common) { - if (tc_setup_common(argc, argv) == 0) { - msg("call tc_setup_common success"); - } else { - err("call tc_setup_common fail"); - ret = 1; - } - } else { - msg("tc_setup_common not define"); - } - - return ret; -} - -static int _tc_setup(int argc, char **argv) { - int ret = 0; - - // 只有用例的主进程才能执行此函数 - if (!_is_main_process()) { - return 0; - } - g_tst_tc_control->tc_setup_called = 1; - if (tc_setup) { - if (tc_setup(argc, argv) == 0) { - msg("call tc_setup success"); - } else { - err("call tc_setup fail"); - ret = 1; - } - } else { - msg("tc_setup not define"); - } - - return ret; -} - -static int _do_test(int argc, char **argv) { - int ret = 0; - - // 只有用例的主进程才能执行此函数 - if (!_is_main_process()) { - return 0; - } - if (do_test) { - if (do_test(argc, argv) == 0) { - msg("call do_test success"); - } else { - err("call do_test fail"); - ret = 1; - } - } else { - err("do_test not define"); - ret = 1; - } - - return ret; -} - -static int _is_ts_setup_called(void) { - if (is_file(g_tst_tc_control->tst_ts_setup_stat)) { - return 1; - } - return 0; -} - -static int _get_ts_setup_stat(void) { - char buff[PAGE_SIZE]; - int read_size = read_line(g_tst_tc_control->tst_ts_setup_stat, 1, buff, PAGE_SIZE); - if (read_size <= 0) { - return TST_INIT; - } - return (int) strtol(buff, NULL, 0); -} - -// 功能:判断路径是否为文件并且存在 -// 参数: -// path -- 文件路径 -// 返回值: -// 0 -- 文件不存在 -// 1 -- 文件存在 -int is_file(const char *path) { - struct stat sb; - - if (stat(path, &sb) != 0) { - return 0; - } - if (S_ISDIR(sb.st_mode)) { - return 0; - } - return 1; -} - -// 功能:判断路径是否为目录并且存在 -// 参数: -// path -- 文件路径 -// 返回值: -// 0 -- 文件不存在 -// 1 -- 文件存在 -int is_dir(const char *path) { - struct stat sb; - - if (stat(path, &sb) != 0) { - return 0; - } - if (S_ISDIR(sb.st_mode)) { - return 1; - } - return 0; -} - -// 功能:判断路径是否存在 -// 参数: -// path -- 文件路径 -// 返回值: -// 0 -- 文件不存在 -// 1 -- 文件存在 -int is_exist(const char *path) { - if (access(path, F_OK) == 0) { - return 1; - } else { - return 0; - } -} - -// 功能:读文件内容到buff中 -// 参数: -// path -- 文件路径 -// buff -- 接收文件内容 -// size -- buff大小 -// 返回值: -// -1 -- 文件读取失败 -// 其他 -- 读取到的文件内容长度 -size_t read_file(const char *path, char *buff, size_t size) { - int fd = open(path, O_RDONLY); - if (fd < 0) { - return -1; - } - int ret = read(fd, buff, size) < 0; - if (ret < 0) { - close(fd); - return -1; - } - close(fd); - return ret; -} - -// 功能:读文本文件指定行的内容到buff中 -// 参数: -// path -- 文件路径 -// line -- 要读取内容的行号(从1开始) -// buff -- 接收文件内容 -// size -- buff大小 -// 返回值: -// -1 -- 文件读取失败 -// 其他 -- 读取到的文件内容长度 -size_t read_line(const char *path, int line, char *buff, size_t size) { - int i = 0; - FILE *file = NULL; - if (line <= 0) { - dbg("the line less then 0: %d", line); - return -1; - } - file = fopen(path, "r"); - if (file == NULL) { - dbg("open file %s fail, errno %d, error: %s", path, errno, strerror(errno)); - return -1; - } - while (i < line) { - i++; - if (fgets(buff, size, file) == NULL) { - if (i == line) { - // 刚好读到指定行的时候文件结束 - break; - } - // 文件读完了,但是行号还没有读到 - dbg("get line %d fail, buff: %s, errno %d, error: %s", i, buff, errno, strerror(errno)); - fclose(file); - return -1; - } - } - fclose(file); - return strlen(buff); -} - -// 功能:创建多层目录 -// 参数: -// dir -- 目录 -// mode -- 目录权限 -// 返回值: -// -1 -- 创建失败 -// 0 -- 创建成功 -int mkdirs(const char *dir, mode_t mode) { - int i; - char now_path[PATH_MAX]; - - for (i = 0; i < min(strlen(dir), PATH_MAX - 1); i++) { - if (dir[i] != '/') { - continue; - } - strncpy(now_path, dir, i + 1); - if (is_exist(now_path)) { - if (is_dir(now_path)) { - continue; - } else { - dbg("the path %s exist but not dir", now_path); - return -1; - } - } - if (mkdir(now_path, mode) != 0) { - dbg("mkdir %s fail, errno %d, error: %s", now_path, errno, strerror(errno)); - return -1; - } - } - if (mkdir(dir, mode) != 0) { - dbg("mkdir %s fail, errno %d, error: %s", dir, errno, strerror(errno)); - return -1; - } - if (!is_dir(dir)) { - dbg("mkdirs %s fail", dir); - return -1; - } - return 0; -} - -// 功能:执行命令 -// 参数: -// command_format -- 命令内容 -// 返回值:同system函数 -int command(const char *command_format, ...) { - va_list ap; - char cmd[MAX_CMD_LEN] = {0}; - - va_start(ap, command_format); - (void) vsnprintf(cmd, MAX_CMD_LEN, command_format, ap); - va_end(ap); - - return system(cmd); -} - -static int _tc_init(int argc, char **argv) { - size_t control_size = ((sizeof(struct tst_tc_control) / PAGE_SIZE) + 1) * PAGE_SIZE; - g_tst_tc_control = (struct tst_tc_control *) mmap(NULL, control_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANONYMOUS, -1, 0); - if (g_tst_tc_control == NULL) { - msg("mmap g_tst_tc_control fail, errno: %d, %s", errno, strerror(errno)); - return 1; - } - memset(g_tst_tc_control, 0, control_size); - if (tst_get_time(&(g_tst_tc_control->time_start)) != 0) { - msg("tst_get_time fail, errno: %d, %s", errno, strerror(errno)); - return 1; - } - strncpy(g_tst_tc_control->tc_name, basename(argv[0]), PATH_MAX); - g_tst_tc_control->tc_argc = argc; - g_tst_tc_control->tc_argv = argv; - - if (realpath(argv[0], g_tst_tc_control->tc_exec_path) == NULL) { - msg("get the realpath fail, errno: %d, %s", errno, strerror(errno)); - return 1; - } - - strncpy(g_tst_tc_control->tc_source_path, g_tst_tc_control->tc_exec_path, PATH_MAX); - strncat(g_tst_tc_control->tc_source_path, ".c", PATH_MAX); - - if (getcwd(g_tst_tc_control->exec_cwd, PATH_MAX) == NULL) { - msg("get cwd fail, errno: %d, %s", errno, strerror(errno)); - return 1; - } - - strncpy(g_tst_tc_control->tst_tc_cwd, g_tst_tc_control->tc_exec_path, PATH_MAX); - dirname(g_tst_tc_control->tst_tc_cwd); - - g_tst_tc_control->tst_tc_pid = getpid(); - g_tst_tc_control->tc_stat = TST_INIT; - - // 尝试获取TST_TS_TOPDIR - strncpy(g_tst_tc_control->tst_ts_topdir, g_tst_tc_control->tc_exec_path, PATH_MAX); - char path_tst_common[PATH_MAX]; - char path_cmd[PATH_MAX]; - char path_testcase[PATH_MAX]; - char path_tsuite[PATH_MAX]; - while (g_tst_tc_control->tst_ts_topdir[1] != '\0') { - snprintf(path_tst_common, PATH_MAX, "%s/tst_common", g_tst_tc_control->tst_ts_topdir); - snprintf(path_cmd, PATH_MAX, "%s/cmd", g_tst_tc_control->tst_ts_topdir); - snprintf(path_testcase, PATH_MAX, "%s/testcase", g_tst_tc_control->tst_ts_topdir); - snprintf(path_tsuite, PATH_MAX, "%s/tsuite", g_tst_tc_control->tst_ts_topdir); - if (is_dir(path_cmd) && is_dir(path_testcase) && is_file(path_tsuite)) { - if (is_dir(path_tst_common)) { - strncpy(g_tst_tc_control->tst_common_topdir, path_tst_common, PATH_MAX); - } else { - strncpy(g_tst_tc_control->tst_common_topdir, g_tst_tc_control->tst_ts_topdir, PATH_MAX); - } - break; - } - if (g_tst_tc_control->tst_ts_topdir[1] == '\0') { - memset(g_tst_tc_control->tst_ts_topdir, 0, PATH_MAX); - memset(g_tst_tc_control->tst_common_topdir, 0, PATH_MAX); - break; - } - dirname(g_tst_tc_control->tst_ts_topdir); - } - // TST_TS_TOPDIR成功获取后,TST_TS_SYSDIR和TST_TC_SYSDIR可以生成了 - if (g_tst_tc_control->tst_ts_topdir[0] != '\0') { - snprintf(g_tst_tc_control->tst_ts_sysdir, PATH_MAX, "%s/logs/.ts.sysdir", g_tst_tc_control->tst_ts_topdir); - snprintf(g_tst_tc_control->tst_tc_sysdir, PATH_MAX, "%s/logs/testcase/.tc.%d.sysdir", - g_tst_tc_control->tst_ts_topdir, g_tst_tc_control->tst_tc_pid); - snprintf(g_tst_tc_control->tst_ts_setup_stat, PATH_MAX, "%s/ts.setup.stat", g_tst_tc_control->tst_ts_sysdir); - } - - return 0; -} - -int tst_main(int argc, char **argv) { - int ret = 0; - - if (_tc_init(argc, argv) != 0) { - return 1; - } - if (chdir(g_tst_tc_control->tst_tc_cwd) != 0) { - msg("chdir to %s fail, errno: %d, %s", g_tst_tc_control->tst_tc_cwd, errno, strerror(errno)); - return 1; - } - - if (_is_ts_setup_called()) { - msg("tsuite setup executed, stat is %d", _get_ts_setup_stat()); - } else { - msg("tsuite setup may not executed"); - } - - _set_tcstat(TST_INIT); - - if (_tc_setup_common(argc, argv) == 0) { - if (_tc_setup(argc, argv) == 0) { - msg("call _tc_setup success"); - if (_do_test(argc, argv) == 0) { - msg("call _do_test success"); - } else { - err("call _do_test fail"); - ret = 1; - } - } else { - err("call _tc_setup success"); - ret = 1; - } - } else { - err("call _tc_setup_common success"); - ret = 1; - } - - _tc_run_complete(argc, argv); - - return ret; -} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" deleted file mode 100644 index c9d6264..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.h" +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "benchmark.h" - -#define TST_PASS 0 -#define TST_FAIL 1 -#define TST_INIT 2 -#define TST_SKIP 3 - -#ifndef MAX_LOG_LEN -#define MAX_LOG_LEN 4096 -#endif /* MAX_LOG_LEN */ -#ifndef MAX_CMD_LEN -#define MAX_CMD_LEN 4096 -#endif /* MAX_CMD_LEN */ - -#ifndef PAGE_SHIFT -#define PAGE_SHIFT 12 -#endif /* PAGE_SHIFT */ -#ifndef PAGE_SIZE -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#endif /* PAGE_SIZE */ -#ifndef PAGE_MASK -#define PAGE_MASK (~(PAGE_SIZE-1)) -#endif /* PAGE_MASK */ - -#define KB (1024) -#define MB (KB * KB) -#define GB (MB * KB) - -extern int _print(const char *format, ...); - -#define min(a, b) ((a) > (b) ? (b) : (a)) -#define max(a, b) ((a) < (b) ? (b) : (a)) - -#define dbg(format, ...) _print(format, ##__VA_ARGS__) -#define msg(format, ...) _print(format, ##__VA_ARGS__) -#define err(format, ...) \ - do{ \ - _tc_fail(); \ - _print("%s:%d %s: " format, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \ - }while(0) - -extern void _skip_test(const char *message, const char *file, int line, const char *func); - -#define skip_test(message) _skip_test(message, __FILE__, __LINE__, __FUNCTION__) - -#define skip_if_true(expr) \ - do{ \ - if(expr){ \ - skip_test("skip_if_true " #expr); \ - } \ - }while(0) - -#define skip_if_false(expr) \ - do{ \ - if(!(expr)){ \ - skip_test("skip_if_false " #expr); \ - } \ - }while(0) - -extern void _tc_pass(void); - -extern void _tc_fail(void); - -extern void _tst_assert(const char *expr, const char *file, int line, const char *func); - -// 功能:断言表达式返回真 -// 参数: -// expr -- 表达式 -// 返回值:无 -#define assert_true(expr) \ - do{ \ - if(expr){ \ - _tc_pass(); \ - }else{ \ - _tc_fail(); \ - _tst_assert(#expr, __FILE__, __LINE__, __FUNCTION__); \ - } \ - }while(0) - -// 功能:断言表达式返回假 -// 参数: -// expr -- 表达式 -// 返回值:无 -#define assert_false(expr) \ - do{ \ - if(!(expr)){ \ - _tc_pass(); \ - }else{ \ - _tc_fail(); \ - _tst_assert(#expr, __FILE__, __LINE__, __FUNCTION__); \ - } \ - }while(0) - - -extern void show_tc_control(void); - -extern int is_file(const char *path); - -extern int is_dir(const char *path); - -extern int is_exist(const char *path); - -extern size_t read_line(const char *path, int line, char *buff, size_t size); - -extern size_t read_file(const char *path, char *buff, size_t size); - -extern int mkdirs(const char *dir, mode_t mode); - -extern int command(const char *command_format, ...); - -extern int tc_setup_common(int argc, char **argv) __attribute__((weak)); - -extern int tc_setup(int argc, char **argv) __attribute__((weak)); - -extern int do_test(int argc, char **argv) __attribute__((weak)); - -extern int tc_teardown(int argc, char **argv) __attribute__((weak)); - -extern int tc_teardown_common(int argc, char **argv) __attribute__((weak)); - -#endif // __COMMON_H__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" deleted file mode 100644 index d9a1b97..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.py" +++ /dev/null @@ -1,755 +0,0 @@ -#!/usr/bin/env python3 -# coding: utf-8 -# Time: 2022-04-19 22:26:42 -# Desc: Python用例公共模块 - -import abc -import getpass -import os -import platform -import re -import shutil -import socket -import subprocess -import sys -import tempfile -import time -import traceback -import __main__ as main - -TST_PASS = 0 -TST_FAIL = 1 -TST_INIT = 2 -TST_SKIP = 3 -tst_tc_stat_dict = { - TST_PASS: 'TST_PASS', - TST_FAIL: 'TST_FAIL', - TST_INIT: 'TST_INIT', - TST_SKIP: 'TST_SKIP', -} - - -def command(cmd, timeout=20): - proc = subprocess.Popen(cmd, shell=True, encoding='utf-8') - try: - proc.communicate(timeout=timeout) - except subprocess.TimeoutExpired: - proc.kill() - return proc.wait() - - -def command_output(cmd, timeout=20): - proc = subprocess.Popen(cmd, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE) - outs = "" - errs = "" - try: - outs, errs = proc.communicate(timeout=timeout) - except subprocess.TimeoutExpired: - proc.kill() - code = proc.wait() - return outs, errs, code - - -def command_quiet(cmd, timeout=20): - proc = subprocess.Popen(cmd, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE) - try: - proc.communicate(timeout=timeout) - except subprocess.TimeoutExpired: - proc.kill() - code = proc.wait() - return code - - -def get_yum_provide(filename): - outs, errs, code = command_output(f'yum provides {filename}') - print(f'stdout:\n{outs}') - print(f'stderr:\n{errs}') - print(f'status: {code}') - if code != 0 or outs is None: - return None - for line in outs.splitlines(): - match = re.match(r'^([-\w.]+)-\d(\.\d+)+-.* : ', line) - if match: - package = match.groups()[0] - print(f'get file {filename} provide: {package}') - return package - return None - - -def try_install_command(cmd, package=None): - if command_quiet(f'which {cmd}') == 0: - return True - if package is None: - package = get_yum_provide(cmd) - if package is not None: - command(f'yum install -y {package}') - if command(f'which {cmd}') == 0: - return True - return False - - -def get_kernel_release(): - return platform.release() - - -def get_system_boot_time(): - with open('/proc/uptime', 'r') as f: - uptime = float(f.readline().split()[0]) - now_time = time.time() - boot_time = now_time - uptime - result = boot_time - - tsuite_tmpdir = os.path.join('/tmp', f'.tsuite-{getpass.getuser()}') - if not os.path.exists(tsuite_tmpdir): - os.makedirs(tsuite_tmpdir, mode=0o755, exist_ok=True) - boot_time_file = os.path.join(tsuite_tmpdir, 'boot-time') - if os.path.exists(boot_time_file): - # 如果系统启动的时间已经有记录,那么看看是否同一次启动 - with open(boot_time_file, 'r') as f: - old_boot_time = float(f.readline()) - # 如果记录的时间和当前计算的时间差别不大,那么就认为是同一次启动 - if abs(old_boot_time - boot_time) <= 10: - result = old_boot_time - else: - with open(boot_time_file, 'w') as f: - f.write(f'{boot_time}') - else: - with open(boot_time_file, 'w') as f: - f.write(f'{boot_time}') - return 'boot-time.' + time.strftime('%Y%m%d-%H%M%S', time.localtime(result)) - - -def get_os_release(): - release = None - if os.path.isfile('/etc/os-release'): - with open('/etc/os-release', 'r') as f: - for line in f.readlines(): - if re.match(r'PRETTY_NAME=', line, re.IGNORECASE): - release = re.sub(r'[^\w.]+', '-', line.split('=')[1].strip()) - if os.path.isfile('/etc/tencentos-release'): - with open('/etc/tencentos-release', 'r') as f: - for line in f.readlines(): - if re.match(r'TencentOS', line, re.IGNORECASE): - release = re.sub(r'[^\w.]+', '-', line.strip()) - if os.path.isfile('/etc/motd'): - with open('/etc/motd', 'r') as f: - for line in f.readlines(): - if re.match(r'version', line, re.IGNORECASE): - release = re.sub(r'[^\w.]+', '-', line.strip()) - if re.match(r'tlinux', line, re.IGNORECASE): - release = re.sub(r'[^\w.]+', '-', line.strip()) - if release is None: - return 'Unknown-Linux' - return release.strip('-') - - -def get_tst_test_env_ip(): - outs, _, _ = command_output('ifconfig eth1') - eth1_ip = get_ip_of_ifconfig(outs) - # 测试环境的eth1都是192.168.x.x - if (eth1_ip is None) or (not eth1_ip.startswith('192.168.')): - return None - env_main_ip_1 = re.sub(r'\.\d{1,3}$', '.11', eth1_ip) - # 获取测试环境主环境的IP - outs, _, _ = command_output(f'ssh root@{env_main_ip_1} ifconfig eth0', timeout=3) - env_main_ip_0 = get_ip_of_ifconfig(outs) - if env_main_ip_0 is None: - return None - return [env_main_ip_0, eth1_ip] - - -def get_ip_of_ifconfig(ifconfig_outs: str): - if ifconfig_outs is None: - return None - if not isinstance(ifconfig_outs, str): - return None - for line in ifconfig_outs.splitlines(): - if 'netmask' not in line: - continue - return re.search(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', line).group() - return None - - -def get_host_ip(): - """ - 这个方法是目前见过最优雅获取本机服务器的IP方法了。没有任何的依赖,也没有去猜测机器上的网络设备信息。 - 而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的IP。 - 这个方法并不会真实的向外部发包,所以用抓包工具是看不到的。但是会申请一个 UDP 的端口,所以如果经常调用也会比较耗时的, - 这里如果需要可以将查询到的IP给缓存起来,性能可以获得很大提升。 - - 作者:钟翦 - 链接:https://www.zhihu.com/question/49036683/answer/1243217025 - 来源:知乎 - 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 - - :return: - """ - _local_ip = None - s = None - try: - if not _local_ip: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(('8.8.8.8', 80)) - _local_ip = s.getsockname()[0] - return _local_ip - finally: - if s: - s.close() - - -def command_to_filename(cmd: str): - return re.sub(r'\W+', '.', cmd) + '.txt' - - -def get_commands_logs(cmd_list, logs_dir, timeout=60): - start_time = time.time() - exec_list = list() - index = 1 - for cmd in cmd_list: - # print(f'{index} execute command: {cmd}') - cmd_dict = { - 'index': index, - 'command': cmd, - 'timeout': timeout, - 'start_time': time.time(), - 'proc': subprocess.Popen(cmd, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE), - 'log_file': os.path.join(os.path.realpath(logs_dir), command_to_filename(cmd)), - 'end_time': None, - 'cost': None, - 'stdout': None, - 'stderr': None, - 'status': None - } - exec_list.append(cmd_dict) - index += 1 - - # 检查命令是否执行完 - while True: - all_command_ok = True - if time.time() - start_time > timeout: - break - for proc_dict in exec_list: - if proc_dict['status'] is not None: - continue - try: - proc_dict['stdout'], proc_dict['stderr'] = proc_dict['proc'].communicate(timeout=1) - except subprocess.TimeoutExpired: - all_command_ok = False - continue - proc_dict['status'] = proc_dict['proc'].returncode - proc_dict['end_time'] = time.time() - proc_dict['cost'] = proc_dict['end_time'] - proc_dict['start_time'] - # print(f'{proc_dict["index"]} command {proc_dict["command"]} end, status {proc_dict["status"]}') - if all_command_ok: - break - - # 记录命令执行结果,还没有结束的命令直接终止 - for proc_dict in exec_list: - if proc_dict['status'] is None: - proc_dict['proc'].kill() - proc_dict['stdout'], proc_dict['stderr'] = proc_dict['proc'].communicate(timeout=1) - proc_dict['status'] = proc_dict['proc'].returncode - proc_dict['end_time'] = time.time() - proc_dict['cost'] = proc_dict['end_time'] - proc_dict['start_time'] - print(f'{proc_dict["index"]} command {proc_dict["command"]} killed, status {proc_dict["status"]}') - with open(file=proc_dict['log_file'], mode='a', buffering=1, encoding='utf-8') as f: - f.write('=' * 60 + '\n') - f.write(f'### command: {proc_dict["command"]}\n') - f.write(f'### timeout: {proc_dict["timeout"]}\n') - f.write(f'### start_time: ' - f'{time.strftime("%Y-%m-%d %H:%M:%S %z", time.localtime(proc_dict["start_time"]))}\n') - f.write(f'### end_time: ' - f'{time.strftime("%Y-%m-%d %H:%M:%S %z", time.localtime(proc_dict["end_time"]))}\n') - f.write(f'### cost: {proc_dict["cost"]}\n') - f.write(f'### log_file: {proc_dict["log_file"]}\n') - f.write(f'### status: {proc_dict["status"]}\n') - f.write('=' * 60 + '\n') - f.write('### stdout:\n') - f.write(proc_dict["stdout"]) - f.write('=' * 60 + '\n') - f.write('### stderr:\n') - f.write(proc_dict["stderr"]) - f.write('=' * 60 + '\n') - print(f'### all command cost {time.time() - start_time}') - - -def sysinfo(log_dir, install_command=False, merge_files=True): - command_list = [ - "uname -a", - "ulimit -a", - "lscpu", - "lspci", - "lspci -k", - "lspci -vv", - "lspci -t -vv -nn", - "lsscsi", - "lsscsi --list --verbose --long", - "lsusb", - "lsusb --tree", - "lshw -short", - "lsmod", - "route -n", - "ifconfig -a", - "dmidecode", - "udevadm info --export-db", - "ipmitool sdr", - "ipmitool fru", - "ipmitool sensor", - "ipmitool sel", - "fdisk -l", - "mount", - "df -P", - "lsblk", - "lsblk -O", - "smartctl --scan" - "free", - "numastat -v", - "numastat -v -m", - "cpupower --cpu all frequency-info", - "cpupower --cpu all idle-info", - "sysctl -a", - "cat /etc/os-release", - "cat /etc/system-release", - "cat /etc/centos-release", - "cat /etc/redhat-release", - "cat /etc/system-release", - "cat /etc/tencentos-release", - "cat /etc/tlinux-release", - "cat /proc/cpuinfo", - "cat /proc/meminfo", - "cat /proc/buddyinfo", - "cat /proc/devices", - "cat /proc/interrupts", - "cat /proc/iomem", - "cat /proc/ioports", - "cat /proc/modules", - "cat /proc/module_md5_list", - "zcat /proc/config.gz", - "zcat /proc/bt_stat", - "zcat /proc/cgroups", - "zcat /proc/cmdline", - "zcat /proc/consoles", - "zcat /proc/crypto", - "zcat /proc/devices", - "zcat /proc/diskstats", - "zcat /proc/dma", - "zcat /proc/execdomains", - "zcat /proc/filesystems", - "zcat /proc/kallsyms", - "zcat /proc/loadavg", - "zcat /proc/loadavg_bt", - "zcat /proc/locks", - "zcat /proc/mdstat", - "zcat /proc/misc", - "zcat /proc/mtrr", - "zcat /proc/partitions", - "zcat /proc/sched_debug", - "zcat /proc/schedstat", - "zcat /proc/slabinfo", - "zcat /proc/softirqs", - "zcat /proc/stat", - "zcat /proc/swaps", - "zcat /proc/timer_list", - "zcat /proc/uptime", - "zcat /proc/version", - "zcat /proc/vmallocinfo", - "zcat /proc/vmstat", - "zcat /proc/zoneinfo", - "dmesg" - ] - if os.path.isfile('/proc/net/dev'): - with open(file='/proc/net/dev', mode='r') as f: - for line in f.readlines(): - if ':' not in line: - continue - dev = line.split(':')[0].strip() - command_list.append(f'ethtool {dev}') - command_list.append(f'ethtool -i {dev}') - if os.path.isfile('/proc/modules'): - with open(file='/proc/modules', mode='r') as f: - for line in f.readlines(): - module = line.split()[0].strip() - command_list.append(f'modinfo {module}') - outs, _, _ = command_output('smartctl --scan') - if outs: - for line in outs.splitlines(): - dev = line.split()[0].strip() - command_list.append(f'smartctl --xall {dev}') - command_list.append(f'hdparm {dev}') - - # 尝试安装命令 - if install_command: - for cmd in set([c.split()[0] for c in command_list]): - try_install_command(cmd) - - if not os.path.exists(log_dir): - os.makedirs(log_dir, mode=0o755, exist_ok=True) - get_commands_logs(command_list, log_dir) - # 将多个日志文本文件合并成一个文件 - if merge_files: - tmp_file = tempfile.mkstemp()[1] - with open(tmp_file, 'w') as f: - for txt_file in os.listdir(log_dir): - txt_path = os.path.join(log_dir, txt_file) - with open(txt_path, 'r') as tf: - f.write(tf.read()) - os.remove(txt_path) - shutil.move(tmp_file, os.path.join(log_dir, 'sysinfo.txt')) - - -def get_crash_path(): - result = None - if not os.path.exists('/etc/kdump.conf'): - return result - with open('/etc/kdump.conf', 'r') as f: - for line in f.readlines(): - if line.startswith('path '): - result = line.split()[1] - return result - - -def safe_repr(obj, short=False): - max_len = 120 - try: - result = repr(obj) - except Exception: - result = object.__repr__(obj) - if not short or len(result) < max_len: - return result - return result[:max_len] + ' [truncated]...' - - -def set_env(env, value): - if os.environ.get(env): - print(f"the env {env} has value {os.environ.get(env)}, don't set to {value}") - return - os.environ[env] = f"{value}" - - -def set_env_force(env, value): - if os.environ.get(env): - print(f"the env {env} has value {os.environ.get(env)}, now set to {value}") - os.environ[env] = value - - -def get_env(env): - return os.environ.get(env) - - -def get_env_default(env, default): - return os.environ.get(env, default) - - -def _is_main_process(): - return int(get_env_default('TST_TC_PID', '0')) == os.getpid() - - -class ExceptionSkip(Exception): - def __init__(self, message=""): - super(ExceptionSkip, self).__init__(self) - self.message = f'{message}' - - def __str__(self): - return self.message - - -def tcstat_to_str(tcstat): - tst_tc_stat_dict.get(tcstat, 'UNKNOWN') - - -class TestCase: - def __init__(self, *args): - # 用例文件路径 - self.tc_path = os.path.realpath(main.__file__) - # 用例名 - self.tc_name = self._get_tc_attr('用例名称') - # 执行用例文件时的目录 - self.exec_cwd = os.getcwd() - # TST_TC_CWD 测试用例CWD - self.tst_tc_cwd = os.path.dirname(self.tc_path) - set_env('TST_TC_CWD', self.tst_tc_cwd) - # TST_TC_PID 测试用例主进程pid - self.tst_tc_pid = os.getpid() - set_env('TST_TC_PID', self.tst_tc_pid) - # 用例执行状态 - self._tcstat = TST_INIT - # 用例退出码,0表示用例PASS或SKIP,其他表示异常 - self._exit_code = 0 - # TST_TS_TOPDIR 测试套顶层目录 - self.tst_ts_topdir = self._get_ts_topdir() - set_env('TST_TS_TOPDIR', self.tst_ts_topdir) - # TST_COMMON_TOPDIR common顶层目录 - self.tst_common_topdir = self._get_common_topdir() - set_env('TST_COMMON_TOPDIR', self.tst_common_topdir) - # 标记tc_setup是否被调用 - self._tc_setup_called = False - # TST_TS_SYSDIR 测试套公共运行目录 - self.tst_ts_sysdir = None if self.tst_ts_topdir is None \ - else os.path.join(self.tst_ts_topdir, 'logs', '.ts.sysdir') - set_env('TST_TS_SYSDIR', self.tst_ts_sysdir) - # TST_TC_SYSDIR 测试用例管理用临时目录 - self.tst_tc_sysdir = None if self.tst_ts_topdir is None \ - else os.path.join(self.tst_ts_topdir, 'logs', 'testcase', f'.tc.{self.tst_tc_pid}.sysdir') - set_env('TST_TC_SYSDIR', self.tst_tc_sysdir) - - def dbg(self, message): - print(message, file=sys.stderr) - - def msg(self, message): - print(message, file=sys.stderr) - - def err(self, message): - print(message, file=sys.stderr) - self._fail(message) - - def _get_tc_attr(self, attr): - with open(file=self.tc_path, mode='r', encoding='utf-8') as f: - for line in f.readlines(): - if f"@{attr}:" not in line: - continue - return re.sub(f'.*@{attr}:', '', line).strip() - return None - - def _get_ts_topdir(self): - result = self.tst_tc_cwd - while True: - if os.path.isdir(os.path.join(result, 'cmd')) and os.path.isdir(os.path.join(result, 'testcase')) and \ - os.path.isfile(os.path.join(result, 'tsuite')): - if os.path.isdir(os.path.join(result, '..', 'tst_common')): - return os.path.dirname(result) - return result - next_path = os.path.dirname(result) - if next_path == result: - return None - result = next_path - - def _get_common_topdir(self): - if self.tst_ts_topdir is None: - return None - if os.path.isdir(os.path.join(self.tst_ts_topdir, 'tst_common')): - return os.path.join(self.tst_ts_topdir, 'tst_common') - return self.tst_ts_topdir - - def _set_tcstat(self, stat): - self._tcstat = stat - - def _get_tcstat(self): - return self._tcstat - - def _get_tcstat_str(self): - return tcstat_to_str(self._tcstat) - - def _fail(self, message=None): - if self._tcstat != TST_FAIL: - self.msg("the testcase first fail here") - self._set_tcstat(TST_FAIL) - raise AssertionError(message) - - def _pass(self): - if self._get_tcstat() == TST_INIT: - self._set_tcstat(TST_PASS) - - def skip_test(self, message=None): - """ - 标记用例为SKIP状态(当用例不需要测试时) - :param message: 要输出的信息 - :return: None - 示例: - skip_test(message='内核CONFIG_XXX未开,系统不支持此测试') - """ - if self._get_tcstat() in (TST_PASS, TST_INIT, TST_SKIP): - self._set_tcstat(TST_SKIP) - raise ExceptionSkip(f'set testcase SKIP: {message}') - else: - self.msg(f'set testcase SKIP fail: {message}') - self._fail(f'the testcase stat is {self._get_tcstat_str()}, can\'t set to SKIP') - - def skip_if_true(self, expr, message=None): - """ - 当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 - :param expr: 要判断的表达式 - :param message: 要输出的信息 - :return: None - 示例: - skip_if_true(1 == 2) - """ - if expr: - self.skip_test(f'skip_if_true -> {safe_repr(expr)}: {message}') - - def skip_if_false(self, expr, message=None): - """ - 当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 - :param expr: 要判断的表达式 - :param message: 要输出的信息 - :return: None - 示例: - skip_if_false(1 == 2) - """ - if not expr: - self.skip_test(f'skip_if_false -> {safe_repr(expr)}: {message}') - - def assert_true(self, expr, message=None): - """ - 断言表达式返回真 - :param expr: 要断言的表达式 - :param message: 断言要输出的信息 - :return: None - 示例: - assert_true(1 == 2) - assert_true(a >= b) - """ - if not expr: - self.msg(f"{safe_repr(expr)} is not true: {message}") - self._fail(message) - else: - self._pass() - - def assert_false(self, expr, message=None): - """ - 断言表达式返回假 - :param expr: 要断言的表达式 - :param message: 断言要输出的信息 - :return: None - 示例: - assert_false(1 == 2) - assert_false(a >= b) - """ - if expr: - self.msg(f"{safe_repr(expr)} is not false: {message}") - self._fail(message) - else: - self._pass() - - def _tc_setup_common(self, *args): - # 只有用例的主进程才能执行此函数 - if not _is_main_process(): - return None - try: - self.tc_setup_common(*args) - except Exception: - raise - - def tc_setup_common(self, *args): - self.msg("this is TestCase.tc_setup_common") - - def _tc_setup(self, *args): - # 只有用例的主进程才能执行此函数 - if not _is_main_process(): - return None - try: - self._tc_setup_called = True - self.tc_setup(*args) - except Exception: - raise - - def tc_setup(self, *args): - self.msg("this is TestCase.tc_setup") - - def _do_test(self, *args): - # 只有用例的主进程才能执行此函数 - if not _is_main_process(): - return None - try: - self.do_test(*args) - except Exception: - raise - - @abc.abstractmethod - def do_test(self, *args): - self.msg("this is TestCase.do_test") - - def _tc_teardown(self, *args): - # 只有用例的主进程才能执行此函数 - if not _is_main_process(): - return None - try: - self.tc_teardown(*args) - except Exception: - raise - - def tc_teardown(self, *args): - self.msg("this is TestCase.tc_teardown") - - def _tc_teardown_common(self, *args): - # 只有用例的主进程才能执行此函数 - if not _is_main_process(): - return None - try: - self.tc_teardown_common(*args) - except Exception: - raise - - def tc_teardown_common(self, *args): - self.msg("this is TestCase.tc_teardown_common") - - def _is_ts_setup_called(self): - if self.tst_ts_sysdir: - return os.path.isfile(os.path.join(self.tst_ts_sysdir, 'ts.setup.stat')) - else: - return False - - def _get_ts_setup_stat(self): - if self.tst_ts_sysdir: - ts_stat_file = os.path.join(self.tst_ts_sysdir, 'ts.setup.stat') - if not os.path.isfile(ts_stat_file): - return None - with open(file=ts_stat_file, mode='r', encoding='utf-8') as f: - line = f.readline() - return int(line) - else: - return None - - def tst_main(self, *args): - time_start = int(time.monotonic() * 1000000000) - if self._is_ts_setup_called(): - self.msg(f"tsuite setup executed, stat is {self._get_ts_setup_stat()}") - else: - self.msg("tsuite setup may not executed") - - try: - self._tc_setup_common(*args) - self.msg("call _tc_setup_common success") - self._tc_setup(*args) - self.msg("call _tc_setup success") - self._do_test(*args) - self.msg("call _do_test success") - except ExceptionSkip as e: - self._set_tcstat(TST_SKIP) - self.msg(e.message) - except Exception: - self._set_tcstat(TST_FAIL) - self.msg(traceback.format_exc()) - finally: - try: - if self._tc_setup_called: - self._tc_teardown(*args) - else: - self.msg("the tc_setup not called, so tc_teardown ignore") - self._tc_teardown_common(*args) - except ExceptionSkip as e: - self._set_tcstat(TST_SKIP) - self.msg(e.message) - except Exception: - self._set_tcstat(TST_FAIL) - self.msg(traceback.format_exc()) - - # TCase自动化执行框架需要用这个输出判断用例是否支持完 - self.msg("Global test environment tear-down") - if self._get_tcstat() == TST_PASS: - self.msg(f"RESULT : {self.tc_name} ==> [ PASSED ]") - self._exit_code = 0 - elif self._get_tcstat() == TST_FAIL: - self.msg(f"RESULT : {self.tc_name} ==> [ FAILED ]") - self._exit_code = 1 - elif self._get_tcstat() == TST_INIT: - self.msg(f"RESULT : {self.tc_name} ==> [ NOTEST ]") - self._exit_code = 1 - elif self._get_tcstat() == TST_SKIP: - self.msg(f"RESULT : {self.tc_name} ==> [ SKIP ]") - self._exit_code = 0 - else: - self.msg(f"RESULT : {self.tc_name} ==> [ UNKNOWN ]") - self._exit_code = 1 - time_end = int(time.monotonic() * 1000000000) - self.msg(f'cost {(time_end - time_start) / 1000000000:.9f}') - exit(self._exit_code) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" deleted file mode 100644 index 325a76e..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common.sh" +++ /dev/null @@ -1,735 +0,0 @@ -#!/bin/bash -# 所有shell脚本的测试用例都应该source此文件 -# 约定: -# 1、以下划线"_"开头的函数和变量用例不能直接调用 -# 2、环境变量全大写,全局变量加上"g_"前置,局部变量统一加"local"修饰 - -export LANG="en_US.UTF-8" -export LANGUAGE="en_US:en" -export LC_ALL=en_US.UTF-8 - -if [ -d "$TST_TS_TOPDIR/tst_common" ]; then - export TST_COMMON_TOPDIR="$TST_TS_TOPDIR/tst_common" - # 先source测试用例自定义的公共文件 - source "$TST_TS_TOPDIR/tst_lib/ts_common.sh" || exit 1 - # 再source全局公共文件 - source "$TST_COMMON_TOPDIR/lib/common_func.sh" || exit 1 -elif [ -d "$TST_TS_TOPDIR/lib" ]; then - export TST_COMMON_TOPDIR="$TST_TS_TOPDIR" - # 只是tst_suite_common使用 - source "$TST_TS_TOPDIR/lib/common_func.sh" || exit 1 -else - echo "can't find the tsuite common file" - exit 1 -fi - -# 环境变量 -# TST_TS_TOPDIR 测试套顶层目录 -# TST_TS_SYSDIR 测试套公共运行目录 -[ -z "$TST_TS_SYSDIR" ] && export TST_TS_SYSDIR="$TST_TS_TOPDIR/logs/.ts.sysdir" -# TST_TC_SYSDIR 测试用例管理用临时目录 -# TST_TC_CWD 测试用例CWD -# TST_TC_PID 测试用例主进程pid -# 下面几个为用例结果状态 -export TST_PASS=0 -export TST_FAIL=1 -export TST_INIT=2 -export TST_SKIP=3 -# TST_TC_NAME 用例名称 -# TST_TC_FILE 用例文件 -# TST_VM_SUBNET 虚拟机子网 -if [ -z "$TST_VM_SUBNET" ]; then - TST_VM_SUBNET=$(ifconfig eth0 2>/dev/null | grep "netmask .* broadcast 192\.168\." | awk '{print $2}') - [ -z "$TST_VM_SUBNET" ] && TST_VM_SUBNET=$(ifconfig eth1 2>/dev/null | grep "netmask .* broadcast 192\.168\." | awk '{print $2}') - [ -z "$TST_VM_SUBNET" ] && TST_VM_SUBNET=$(ifconfig eth2 2>/dev/null | grep "netmask .* broadcast 192\.168\." | awk '{print $2}') - TST_VM_SUBNET=${TST_VM_SUBNET%.*} -fi -export TST_VM_SUBNET - -g_tst_case_start=$(get_up_time_ms) -g_tst_trap_signal=12 - -_tcstat_to_str() { - case "$1" in - "TST_PASS" | "$TST_PASS") - echo "TST_PASS" - ;; - "TST_FAIL" | "$TST_FAIL") - echo "TST_FAIL" - ;; - "TST_INIT" | "$TST_INIT") - echo "TST_INIT" - ;; - "TST_SKIP" | "$TST_SKIP") - echo "TST_SKIP" - ;; - *) - echo "TST_UNKNOWN" - ;; - esac -} - -# 获取用例属性 -# $1 -- 用例属性名称,例如:用例ID、用例名称 -_get_case_attr() { - grep "@${1}:" "$TST_TC_FILE_FULL" | head -n 1 | sed "s|.*@${1}:\s*||g" | sed "s|\s*$||g" -} -_get_case_preconditions() { - grep "@预置条件:" "$TST_TC_FILE_FULL" -} -_get_case_steps() { - grep "@测试步骤:" "$TST_TC_FILE_FULL" -} -_get_case_expect() { - grep "@预期结果:" "$TST_TC_FILE_FULL" -} - -# 功能:设置环境变量 -# 参数: -# $1 -- 环境变量名 -# $2 -- 环境变量值 -# 返回值: -# 0 -- 环境变量设置成功 -# 1 -- 环境变量设置失败 -setup_env_var() { - local _tst_var_name="$1" - local _tst_old_value - eval _tst_old_value=\"\$"${1}"\" - local _tst_new_value="$2" - - if ! echo "$_tst_var_name" | grep "^[A-Z_]\+$" >/dev/null; then - msg "the var name must be upper and '_'" - return 1 - fi - [ -n "$_tst_old_value" ] && msg "the environment variable $_tst_var_name has old value: $_tst_old_value" - eval export "$_tst_var_name"=\""$_tst_new_value"\" - echo "export $_tst_var_name=\"$_tst_new_value\"" >>"$TST_TS_SYSDIR/environment_variable" - return 0 -} - -# 功能:将K/M/G/T等单位互相转换 -# 参数:wait_proc_exit -p pid [-t timeout] [-s signal] -# -p pid 【必选参数】进程pid -# -t timeout 【可选参数】等待超时时间(单位:秒,不指定时默认等待60秒),如果等待超时进程仍未退出则返回失败 -# -s signal 【可选参数】必须配合-t参数使用,超时时间到期后发送-s指定信号到进程 -# 返回值: -# 0 -- 进程退出 -# 1 -- 等待失败 -wait_proc_exit() { - local _tst_all_args="$*" - local _tst_pid - local _tst_timeout - local _tst_signal - while [ $# -gt 0 ]; do - case "$1" in - "-p") - shift - _tst_pid="$1" - shift - ;; - "-t") - shift - _tst_timeout="$1" - shift - ;; - "-s") - shift - _tst_signal="$1" - shift - ;; - *) - msg "unknown args $1 in $_tst_all_args" - return 1 - ;; - esac - done - if [ -z "$_tst_pid" ]; then - msg "pid not set" - return 1 - fi - [ -z "$_tst_timeout" ] && _tst_timeout=60 - - local _tst_time_start - _tst_time_start="$(get_uptime)" - local _tst_time_now - _tst_time_now="$(get_uptime)" - while [ $((_tst_time_start + _tst_timeout)) -gt "$_tst_time_now" ]; do - [ -d "/proc/$_tst_pid" ] || return 0 - sleep 1 - _tst_time_now="$(get_uptime)" - done - [ -n "$_tst_signal" ] && kill -s "$_tst_signal" "$_tst_pid" - sleep 1 - [ -d "/proc/$_tst_pid" ] || return 0 - return 1 -} - -# 功能:获取系统启动后到现在的时间,单位:秒 -# 参数:无 -# 返回值:标准输出时间 -get_uptime() { - awk -F . '{print $1}' /proc/uptime -} - -# 功能:将K/M/G/T等单位互相转换 -# 参数:conv_unit [-i k|m|g|t] [-o k|m|g|t] value[_with_unit] -# -i k|m|g|t 【可选参数】输入数据的单位,可选参数,若不指定单位,则默认为1,或者输入的值后面带参数 -# -o k|m|g|t 【可选参数】输出数据的单位,若不指定单位,则默认为1 -# value[_with_unit] 【必选参数】需要转换的数据值,可以跟单位(只取单位第一个字母用于判断k|m|g|t) -# 返回值:标准输出转换后的结果 -# 0 -- 转换成功 -# 1 -- 转换失败 -conv_unit() { - local _tst_input_all - local _tst_input_value - local _tst_input_unit - local _tst_output_value - local _tst_output_unit - while [ $# -gt 0 ]; do - case "$1" in - "-i") - shift - _tst_input_unit="$1" - shift - ;; - "-o") - shift - _tst_output_unit="$1" - shift - ;; - *) - _tst_input_all="$_tst_input_all $1" - shift - ;; - esac - done - # shellcheck disable=SC2001 - _tst_input_value=$(echo "$_tst_input_all" | sed "s|^[[:blank:]]*\([0-9]\+\)[[:blank:]]*\(.*\)|\1|g") - # shellcheck disable=SC2001 - [ -z "$_tst_input_unit" ] && _tst_input_unit=$(echo "$_tst_input_all" | sed "s|^[[:blank:]]*\([0-9]\+\)[[:blank:]]*\(.*\)|\2|g" | head -c 1) - [ -z "$_tst_input_unit" ] && _tst_input_unit="b" - [ -z "$_tst_output_unit" ] && _tst_output_unit="b" - if [ -z "$_tst_input_value" ]; then - msg "no input value" - return 1 - fi - case "$_tst_input_unit" in - b | B) ;; - k | K) - _tst_input_value=$((_tst_input_value * 1024)) - ;; - m | M) - _tst_input_value=$((_tst_input_value * 1024 * 1024)) - ;; - g | G) - _tst_input_value=$((_tst_input_value * 1024 * 1024 * 1024)) - ;; - t | T) - _tst_input_value=$((_tst_input_value * 1024 * 1024 * 1024 * 1024)) - ;; - *) - msg "unknown input unit $_tst_input_unit" - return 1 - ;; - esac - case "$_tst_output_unit" in - b | B) - _tst_output_value=$_tst_input_value - ;; - k | K) - _tst_output_value=$((_tst_input_value / 1024)) - ;; - m | M) - _tst_output_value=$((_tst_input_value / 1024 / 1024)) - ;; - g | G) - _tst_output_value=$((_tst_input_value / 1024 / 1024 / 1024)) - ;; - t | T) - _tst_output_value=$((_tst_input_value / 1024 / 1024 / 1024 / 1024)) - ;; - *) - msg "unknown output unit $_tst_output_unit" - return 1 - ;; - esac - echo $_tst_output_value - return 0 -} - -# 功能:ssh到环境子网中指定机器上 -# 参数: -# $1 -- 需要登录的机器IP编号 -# $* -- 要远程执行的命令及参数 -# 返回值:同ssh -env_ssh() { - local _tst_ip="${TST_VM_SUBNET}.$1" - shift - msg "try ssh to $_tst_ip execute: $*" - timeout -s SIGTERM 60 ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@"$_tst_ip" "$@" -} - -# 功能:scp本机的文件到到环境子网中指定机器的指定路径 -# 参数: -# $1 -- scp目标机器IP编号 -# $2 -- 远程机器的目标文件夹 -# $* -- 需要从本机拷贝到远端机器的文件,可以拷贝多个文件 -# 返回值:同scp -env_scpt() { - local _tst_ip="${TST_VM_SUBNET}.$1" - shift - local _tst_target="$1" - shift - msg "try scp $* to ${_tst_ip}:$_tst_target" - timeout -s SIGTERM 120 scp -rvq -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$@" root@"$_tst_ip":"$_tst_target" -} - -# 功能:scp指定机器的文件到本机路径 -# 参数: -# $1 -- scp目标机器IP编号 -# $2 -- 本机目标文件夹 -# $* -- 需要从远端机器拷贝到本机的文件,可以拷贝多个文件 -# 返回值:同scp -env_scpf() { - local _tst_ret=0 - local _tst_ip="${TST_VM_SUBNET}.$1" - shift - local _tst_target="$1" - shift - while [ -n "$1" ]; do - msg "try scp ${_tst_ip}:$1 to local $_tst_target" - timeout -s SIGTERM 120 scp -rvq -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@"$_tst_ip":"$1" "$_tst_target" || _tst_ret=1 - shift - done - return $_tst_ret -} - -# 功能:等待指定机器就绪,默认超时时间60秒 -# 参数: -# $1 -- 目标机器IP编号 -# $2 -- 【可选】等待的超时时间,默认等待60秒 -# 返回值: -# 0 -- 机器在超时前就绪 -# 1 -- 机器启动异常 -env_wait() { - local _tst_start_time - _tst_start_time=$(get_uptime) - local _tst_end_time - _tst_end_time=$(get_uptime) - local _tst_timeout - if [ -z "$2" ]; then - _tst_timeout=60 - else - _tst_timeout=$2 - fi - - local _tst_ip="${TST_VM_SUBNET}.$1" - msg "wait env $_tst_ip standby" - while [ $((_tst_start_time + _tst_timeout)) -ge "$_tst_end_time" ]; do - echo -n "." - sleep 3 - _tst_end_time=$(get_uptime) - ping -w 1 -W 1 -c 1 "$_tst_ip" >/dev/null 2>&1 || continue - if env_ssh "$1" test -d /proc; then - msg "the env with IP $_tst_ip ssh success, wait total $((_tst_end_time - _tst_start_time)) seconds" - return 0 - else - continue - fi - done - _tst_end_time=$(get_uptime) - msg "wait the env $_tst_ip timeout, wait total $((_tst_end_time - _tst_start_time)) seconds" - return 1 -} - -_assert_trap_exit() { - kill -s "$g_tst_trap_signal" "$TST_TC_PID" -} - -# 功能:标记用例为SKIP状态(当用例不需要测试时) -# 参数: -# $* -- 对SKIP状态标记的描述 -# 返回值:无 -skip_test() { - local _tst_tc_stat - _tst_tc_stat="$(_get_tcstat)" - - case "$_tst_tc_stat" in - "$TST_PASS" | "$TST_INIT" | "$TST_SKIP") - _set_tcstat "$TST_SKIP" - msg "set testcase SKIP: $*" - _assert_trap_exit - ;; - *) - msg "set testcase SKIP fail: $*" - err "the testcase stat is $(_tcstat_to_str "$_tst_tc_stat"), can't set to SKIP" - ;; - esac -} - -# 功能:当表达式返回真或命令执行成功时,用例不满足测试条件,终止测试 -# 参数: -# $* -- 需要断言的表达式 -# 返回值:无 -skip_if_true() { - local _tst_ret - "$@" - _tst_ret=$? - if [ $_tst_ret -eq 0 ]; then - skip_test "skip_if_true get (_tst_ret:$_tst_ret) ->" "$@" - fi -} - -# 功能:当表达式返回假或命令执行失败,用例不满足测试条件,终止测试 -# 参数: -# $* -- 需要断言的表达式 -# 返回值:无 -skip_if_false() { - local _tst_ret - "$@" - _tst_ret=$? - if [ $_tst_ret -ne 0 ]; then - skip_test "skip_if_false get (_tst_ret:$_tst_ret) ->" "$@" - fi -} - -# 功能:断言表达式返回真或命令执行成功,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 -# 参数: -# $* -- 需要断言的表达式 -# 返回值:无 -assert_true_cont() { - local _tst_ret - "$@" - _tst_ret=$? - if [ $_tst_ret -eq 0 ]; then - _tc_pass - return 0 - else - err "assert_true, but return ${_tst_ret}: $*" - return 1 - fi -} -assert_true() { - assert_true_cont "$@" || _assert_trap_exit -} - -# 功能:断言表达式返回假或命令执行失败,'_cont'后缀的断言函数在断言失败后用例继续执行,不终止 -# 参数: -# $* -- 需要断言的表达式 -# 返回值:无 -assert_false_cont() { - local _tst_ret - "$@" - _tst_ret=$? - if [ $_tst_ret -ne 0 ]; then - _tc_pass - return 0 - else - err "assert_false, but return ${_tst_ret}: $*" - return 1 - fi -} -assert_false_skip() { - assert_false_cont "$@" || _skip "expect false but true ->" "$@" -} -assert_false() { - assert_false_cont "$@" || _assert_trap_exit -} - -_set_tcstat() { - echo "$1" >"$TST_TC_SYSDIR/tcstat" -} - -_get_tcstat() { - cat "$TST_TC_SYSDIR/tcstat" 2>/dev/null -} - -_tc_pass() { - # 只有初始状态的用例才能置为PASS,其他异常状态的用例不能从异常变为PASS - if [ "$(cat "$TST_TC_SYSDIR/tcstat" 2>/dev/null)" == "$TST_INIT" ]; then - _set_tcstat $TST_PASS - fi -} - -_tc_fail() { - if [ "$(_get_tcstat)" != "$TST_FAIL" ]; then - echo "the testcase first fail here" - fi - _set_tcstat $TST_FAIL -} - -_tc_setup_common() { - local _tst_ret=0 - - # 只有用例的主进程才能执行此函数 - [ "$TST_TC_PID" != "$$" ] && return 0 - - # 对用例执行环境进行初始化设置 - mkdir -p "${TST_TC_SYSDIR}/core" - ulimit -c >"$TST_TC_SYSDIR/old.ulimit.c" - ulimit -c unlimited - cat /proc/sys/kernel/core_pattern >"$TST_TC_SYSDIR/old.proc.core_pattern" - is_root && echo "${TST_TC_SYSDIR}/core/core-e%e-p%p-i%i-s%s-g%g-u%u-t%t.dump" >/proc/sys/kernel/core_pattern - - if is_function tc_setup_common; then - msg "try call tc_setup_common" - if tc_setup_common "$@"; then - msg "call tc_setup_common success" - else - err "call tc_setup_common fail" - _tst_ret=1 - fi - else - msg "tc_setup_common not define" - fi - - return $_tst_ret -} - -_tc_setup() { - local _tst_ret=0 - - # 只有用例的主进程才能执行此函数 - [ "$TST_TC_PID" != "$$" ] && return 0 - touch "$TST_TC_SYSDIR/tc_setup_called" - if is_function tc_setup; then - msg "try call tc_setup" - if tc_setup "$@"; then - msg "call tc_setup success" - else - err "call tc_setup fail" - _tst_ret=1 - fi - else - msg "tc_setup not define" - fi - - return $_tst_ret -} - -_do_test() { - local _tst_ret=0 - - # 只有用例的主进程才能执行此函数 - [ "$TST_TC_PID" != "$$" ] && return 0 - if is_function do_test; then - msg "try call do_test" - if do_test "$@"; then - msg "call do_test success" - else - err "call do_test fail" - _tst_ret=1 - fi - else - err "do_test not define" - _tst_ret=1 - fi - - return $_tst_ret -} - -_tc_teardown() { - local _tst_ret=0 - - # 只有用例的主进程才能执行此函数 - [ "$TST_TC_PID" != "$$" ] && return 0 - if is_function tc_teardown; then - msg "try call tc_teardown" - if tc_teardown "$@"; then - msg "call tc_teardown success" - else - err "call tc_teardown fail" - _tst_ret=1 - fi - else - msg "tc_teardown not define" - fi - - return $_tst_ret -} - -_tc_teardown_common() { - local _tst_ret=0 - - # 只有用例的主进程才能执行此函数 - [ "$TST_TC_PID" != "$$" ] && return 0 - if is_function tc_teardown_common; then - msg "try call tc_teardown_common" - if tc_teardown_common "$@"; then - msg "call tc_teardown_common success" - else - err "call tc_teardown_common fail" - _tst_ret=1 - fi - else - msg "tc_teardown_common not define" - fi - - # 恢复用例执行前做的初始化设置 - ulimit -c "$(cat "$TST_TC_SYSDIR/old.ulimit.c")" - is_root && cat "$TST_TC_SYSDIR/old.proc.core_pattern" >/proc/sys/kernel/core_pattern - - return $_tst_ret -} - -_tc_trap_call() { - _tc_run_complete || exit 1 - exit 0 -} - -_tc_run_complete() { - local _tst_ret=0 - - # 只有用例的主进程才能执行此函数 - [ "$TST_TC_PID" != "$$" ] && return 0 - if [ -e "$TST_TC_SYSDIR/tc_setup_called" ]; then - if _tc_teardown "$@"; then - msg "call _tc_teardown success" - else - err "call _tc_teardown fail" - _tst_ret=1 - fi - else - msg "the tc_setup not called, so tc_teardown ignore" - fi - if _tc_teardown_common "$@"; then - msg "call _tc_teardown_common success" - else - err "call _tc_teardown_common fail" - _tst_ret=1 - fi - - # TCase自动化执行框架需要用这个输出判断用例是否执行完 - echo "Global test environment tear-down" - # 用例失败则收集系统日志上传到TCase用于定位 - case "$(_get_tcstat)" in - "$TST_PASS") - msg "RESULT : $TST_TC_NAME ==> [ PASSED ]" - rm -rf "$TST_TC_SYSDIR" - echo "case-result: PASS" >>"$TST_RESULT_FILE" - ;; - "$TST_FAIL") - msg "RESULT : $TST_TC_NAME ==> [ FAILED ]" - _tst_ret=1 - echo "case-result: FAIL" >>"$TST_RESULT_FILE" - ;; - "$TST_INIT") - msg "RESULT : $TST_TC_NAME ==> [ NOTEST ]" - _tst_ret=1 - echo "case-result: ABORT" >>"$TST_RESULT_FILE" - ;; - "$TST_SKIP") - msg "RESULT : $TST_TC_NAME ==> [ SKIP ]" - rm -rf "$TST_TC_SYSDIR" - _tst_ret=0 - echo "case-result: SKIP" >>"$TST_RESULT_FILE" - ;; - *) - msg "RESULT : $TST_TC_NAME ==> [ UNKNOWN ]" - _tst_ret=1 - echo "case-result: ABORT" >>"$TST_RESULT_FILE" - ;; - esac - local _tst_case_end - _tst_case_end=$(get_up_time_ms) - msg "cost $(diff_time_ms2sec "$g_tst_case_start" "$_tst_case_end")" - - { - echo "case-end-time: $(get_timestamp_ms)" - echo "" - } >>"$TST_RESULT_FILE" - - return $_tst_ret -} - -_set_ts_setup_stat() { - echo "$1" >"$TST_TS_SYSDIR/ts.setup.stat" -} - -_get_ts_setup_stat() { - cat "$TST_TS_SYSDIR/ts.setup.stat" 2>/dev/null -} - -_is_ts_setup_called() { - test -f "$TST_TS_SYSDIR/ts.setup.stat" -} - -_clean_ts_setup_stat() { - rm -rf "$TST_TS_SYSDIR/ts.setup.stat" -} - -tst_main() { - local _tst_ret=0 - - if [ -z "$TST_TS_TOPDIR" ]; then - msg "the TST_TS_TOPDIR not set" - return 1 - fi - if [ ! -d "$TST_TS_TOPDIR" ]; then - msg "the TST_TS_TOPDIR=$TST_TS_TOPDIR not dir" - return 1 - fi - - [ -f "$TST_TS_SYSDIR/environment_variable" ] && source "$TST_TS_SYSDIR/environment_variable" - export TST_TC_PID=$$ - TST_TC_CWD="$(realpath "$(dirname "$0")")" - export TST_TC_CWD - TST_TC_FILE_FULL="$(realpath "$0")" - export TST_TC_FILE_FULL - # shellcheck disable=SC2001 - TST_TC_FILE="$(echo "$TST_TC_FILE_FULL" | sed "s|^${TST_TS_TOPDIR}/*||g")" - export TST_TC_FILE - TST_TC_NAME="$(_get_case_attr "用例名称")" - export TST_TC_NAME - export TST_TC_SYSDIR="$TST_TS_TOPDIR/logs/testcase/.tc.${TST_TC_PID}.sysdir" - - # 用于断言,有的断言会终止测试活动 - trap _tc_trap_call "$g_tst_trap_signal" - - # 生成结果记录文件 - _get_tst_result_file - - { - echo "TESTCASE" - echo "case-name: $TST_TC_NAME" - echo "case-id: $(_get_case_attr "用例ID")" - echo "case-type: case-type" - echo "case-level: $(_get_case_attr "用例级别")" - echo "case-label: $(_get_case_attr "用例标签")" - echo "case-steps: $(_get_case_steps)" - echo "case-result-id: ${TST_TC_NAME}-result-${TST_RESULT_ID}" - echo "case-start-time: $(get_timestamp_ms)" - } >>"$TST_RESULT_FILE" - - if _is_ts_setup_called; then - msg "tsuite setup executed, stat is $(_get_ts_setup_stat)" - else - msg "tsuite setup may not executed" - fi - - cd "$TST_TC_CWD" || return 1 - mkdir -p "$TST_TC_SYSDIR" - _set_tcstat $TST_INIT - - if _tc_setup_common "$@"; then - if _tc_setup "$@"; then - msg "call _tc_setup success" - if _do_test "$@"; then - msg "call _do_test success" - else - err "call _do_test fail" - _tst_ret=1 - fi - else - err "call _tc_setup fail" - _tst_ret=1 - fi - else - err "call _tc_setup_common fail" - _tst_ret=1 - fi - - _tc_run_complete "$@" || _tst_ret=1 - - return $_tst_ret -} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" deleted file mode 100644 index 9217202..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/common_func.sh" +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -# 所有shell脚本的测试用例都应该source此文件 -# 约定: -# 1、以下划线"_"开头的函数和变量用例不能直接调用 -# 2、环境变量全大写,全局变量加上"g_"前置,局部变量统一加"local"修饰 - -# Func: 输出调试级别用例日志 -dbg() { - echo "$@" 1>&2 -} - -# Func: 输出普通级别用例日志 -msg() { - echo "$@" 1>&2 -} - -# Func: 输出错误级别用例日志,如果是用例上下文,则标记用例为失败状态 -err() { - echo "$@" 1>&2 - # 只有用例上下文才设置用例状态 - is_function _tc_fail && _tc_fail -} - -is_function() { - type "$1" 2>&1 | head -n 1 | grep "$1 is a function" >/dev/null 2>&1 - return $? -} - -is_root() { - [ "$(id -u)" == "0" ] && return 0 - return 1 -} - -get_up_time_sec() { - awk -F . '{print $1}' /proc/uptime -} - -get_up_time_ms() { - local _tst_uptime - _tst_uptime=$(awk '{print $1}' /proc/uptime | tr -d '.') - echo -n "${_tst_uptime}0" -} - -# 获取时间戳 -get_timestamp_sec() { - date +%s -} -get_timestamp_ms() { - date +%s%N | sed "s|......$||g" -} - -# 输出时间差,并将ms转换为sec -# $1 -- start time: ms -# $2 -- end time: ms -diff_time_ms2sec() { - local _tst_diff_time=$(($2 - $1)) - local _tst_time_sec=$((_tst_diff_time / 1000)) - local _tst_time_ms=$((_tst_diff_time % 1000)) - printf "%d.%03d" $_tst_time_sec $_tst_time_ms -} - -# 获取测试套名 -get_suite_name() { - basename "$TST_TS_TOPDIR" -} - -# 获取测试结果文件 -_get_tst_result_file() { - if [ -z "$TST_RESULT_FILE" ]; then - local test_index=0 - while [ $test_index -lt 10000 ]; do - test_index=$((test_index + 1)) - [ -f "$TST_TS_TOPDIR/logs/${test_index}.result" ] && continue - break - done - export TST_RESULT_ID="$test_index" - TST_RESULT_FILE="$TST_TS_TOPDIR/logs/${test_index}.result" - export TST_RESULT_FILE - { - echo "TESTSUITE" - echo "suite-name: $(get_suite_name)" - echo "suite-start-time: $(get_timestamp_ms)" - echo "suite-end-time:" - echo "" - } >>"$TST_RESULT_FILE" - fi - echo "$TST_RESULT_FILE" -} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" deleted file mode 100644 index 7a2ca85..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/main.h" +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __MAIN_H__ -#define __MAIN_H__ - -#include "common.h" - -extern int tst_main(int argc, char **argv); - -int main(int argc, char **argv) { - return tst_main(argc, argv); -} - -#endif // __MAIN_H__ diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" deleted file mode 100644 index 09e3972..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/sched.py" +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env python3 -# coding: utf-8 -# Time: 2022-08-24 12:22:09 -# Desc: 系统调度 - -import os, time -from multiprocessing import Process, cpu_count - - -def exec_cpu(cpu: int, rate: float, interval: int, timeout: int) -> None: - t_start = time.time() - while time.time() - t_start < timeout: - if ((time.time() - t_start) / interval) % 1 < rate: - pass - else: - time.sleep((1 - rate) * interval) - print(f'cpu {cpu} execute terminated') - - -def set_cpu_rate_of_system(rate: float, interval: int = 1, timeout: int = 10) -> None: - """ - 设置系统CPU使用率到指定值 - :param rate: 系统CPU使用率百分比, [0, cpu_num] - :param interval: 设置使用率的采样间隔时间 - :param timeout: 设置使用率的时间 - :return: None - """ - cpu_num = cpu_count() - if (rate < 0 or rate > cpu_num): - print(f'Input usage rate is {rate}, which must be a float value between 0 and {cpu_num}!') - return - if (interval <= 0): - print(f'Input interval is {interval}, which must be a positive number!') - return - if (timeout <= 0): - print(f'Input timeout is {timeout}, which must be a positive number!') - return - - ps_list = [] - cpu_rate = rate / cpu_num - for i in range(0, cpu_num): - ps_list.append(Process(target = exec_cpu, args = (i, cpu_rate, interval, timeout))) - for p in ps_list: - p.start() - for p in ps_list: - p.join() - print("all cpus execute over") - - -def exec_on_specific_cpu(cpu: int, rate: float, interval: int, timeout: int) -> None: - pid = os.getpid() - os.sched_setaffinity(pid, {cpu}) - t_start = time.time() - while time.time() - t_start < timeout: - if ((time.time() - t_start) / interval) % 1 < rate: - pass - else: - time.sleep((1 - rate) * interval) - print(f'cpu {cpu} execute terminated') - - -def set_cpu_rate_of_cpu(cpu_index: int, rate: float, interval: int = 1, timeout : int = 10) -> Process: - """ - 设置某个CPU的使用率到指定值 - :param cpu_index: cpu编号 - :param rate: CPU使用率百分比, [0, 1] - :param interval: 设置使用率的采样间隔时间 - :param timeout: 设置使用率的时间 - :return: None - """ - if (rate < 0 or rate > 1): - print(f'Input usage rate is {rate}, which must be a float value between 0 and 1!') - return - if (interval <= 0): - print(f'Input interval is {interval}, which must be a positive number!') - return - if (timeout <= 0): - print(f'Input timeout is {timeout}, which must be a positive number!') - return - pid = os.getpid() - eligible_cpu_set = os.sched_getaffinity(pid) - if (cpu_index not in eligible_cpu_set): - print(f'Input cpu index is {cpu_index}, which is not valid! ' + - f'The eligible cpu set is {eligible_cpu_set}') - return - - print(f'Set cpu usage of cpu{cpu_index} to {rate}') - - p = Process(target = exec_on_specific_cpu, args = (cpu_index, rate, interval, timeout)) - p.start() - return p - - -def set_cpu_rate_of_task(rate: float, interval: int = 1, timeout : int = 10) -> None: - """ - 设置进程的使用率到指定值 - :param rate: 进程CPU使用率百分比, [0, 1] - :param interval: 设置使用率的采样间隔时间 - :param timeout: 设置使用率的时间 - :return: None - """ - if (rate < 0 or rate > 1): - print(f'Input usage rate is {rate}, which must be a float value between 0 and 1!') - return - if (interval <= 0): - print(f'Input interval is {interval}, which must be a positive number!') - return - if (timeout <= 0): - print(f'Input timeout is {timeout}, which must be a positive number!') - return - - pid = os.getpid() - print(f'set cpu usage of pid {pid} to {rate}') - t_start = time.time() - - while time.time() - t_start < timeout: - if ((time.time() - t_start) / interval) % 1 < rate: - pass - else: - time.sleep((1 - rate) * interval) - -if __name__ == '__main__': - # set_cpu_rate_of_system(4, 1, 60) - p = set_cpu_rate_of_cpu(1, 0.3, 1, 30) - print('joining') - p.join() - print('cpu test finished') - # set_cpu_rate_of_task(1.5, 1, 20) - diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" deleted file mode 100755 index 17bd646..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_setup" +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash -# Time: 2022-04-19 22:44:25 -# Desc: 测试套公共ts_setup - -if [ -d "$TST_TS_TOPDIR/tst_common" ]; then - # 先source测试用例自定义的公共文件 - source "$TST_TS_TOPDIR/tst_lib/ts_common.sh" || exit 1 - # 再source全局公共文件 - source "$TST_TS_TOPDIR/tst_common/lib/common.sh" || exit 1 -elif [ -d "$TST_TS_TOPDIR/lib" ]; then - # 只是tst_suite_common使用 - source "$TST_TS_TOPDIR/lib/common.sh" || exit 1 -else - echo "can't find the tsuite common file" - exit 1 -fi - -_ts_setup() { - if _is_ts_setup_called; then - if [ "$(_get_ts_setup_stat)" == "$TST_PASS" ]; then - echo "the ts_setup executed passed yet" - return 0 - else - echo "the ts_setup executed yet, but fail" - return 1 - fi - fi - - local _tst_ret=0 - - if [ -f "$TST_TS_TOPDIR/tst_lib/ts_setup" ]; then - if [ -x "$TST_TS_TOPDIR/tst_lib/ts_setup" ]; then - msg "try execute $TST_TS_TOPDIR/tst_lib/ts_setup" - if "$TST_TS_TOPDIR/tst_lib/ts_setup"; then - msg "execute ts_setup success" - _set_ts_setup_stat "$TST_PASS" - else - msg "execute ts_setup fail" - _set_ts_setup_stat "$TST_FAIL" - _tst_ret=1 - fi - else - msg "the $TST_TS_TOPDIR/tst_lib/ts_setup can't execute" - _set_ts_setup_stat "$TST_FAIL" - _tst_ret=1 - fi - else - msg "ts_setup not exist" - _set_ts_setup_stat "$TST_PASS" - fi - - return $_tst_ret -} - -_ts_setup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" deleted file mode 100755 index c3ae1ba..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tst_ts_teardown" +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -# Time: 2022-04-19 22:44:25 -# Desc: 测试套公共ts_teardown - -if [ -d "$TST_TS_TOPDIR/tst_common" ]; then - # 先source测试用例自定义的公共文件 - source "$TST_TS_TOPDIR/tst_lib/ts_common.sh" || exit 1 - # 再source全局公共文件 - source "$TST_TS_TOPDIR/tst_common/lib/common.sh" || exit 1 -elif [ -d "$TST_TS_TOPDIR/lib" ]; then - # 只是tst_suite_common使用 - source "$TST_TS_TOPDIR/lib/common.sh" || exit 1 -else - echo "can't find the tsuite common file" - exit 1 -fi - -_ts_teardown() { - local _tst_ret=0 - - if ! _is_ts_setup_called; then - msg "the ts_setup may not execute, we'll not execute the ts_teardown" - return 1 - fi - - if [ -f "$TST_TS_TOPDIR/tst_lib/ts_teardown" ]; then - if [ -x "$TST_TS_TOPDIR/tst_lib/ts_teardown" ]; then - msg "try execute $TST_TS_TOPDIR/tst_lib/ts_teardown" - if ts_teardown; then - msg "execute ts_teardown success" - else - msg "execute ts_teardown fail" - _tst_ret=1 - fi - else - msg "the $TST_TS_TOPDIR/tst_lib/ts_teardown exist, but can't execute" - _tst_ret=1 - fi - else - msg "ts_teardown not exist" - fi - _clean_ts_setup_stat - - return $_tst_ret -} - -_ts_teardown diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" deleted file mode 100644 index e1d3e4c..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite-completion.bash" +++ /dev/null @@ -1,51 +0,0 @@ -# bash/zsh completion support for tsuite. - -# To use these routines: -# -# 1) Copy this file to somewhere (e.g. ~/.tsuite-completion.bash). -# 2) Add the following line to your .bashrc/.zshrc: -# source ~/.tsuite-completion.bash - -_tsuite_completion() { - local cur prev - - cur=${COMP_WORDS[COMP_CWORD]} - prev=${COMP_WORDS[COMP_CWORD - 1]} - - case ${COMP_CWORD} in - 1) - COMPREPLY=($(compgen -W "help new list compile setup run teardown clean cleanall" -- ${cur})) - ;; - 2) - case ${prev} in - new) - COMPREPLY=($(compgen -W "case" -- ${cur})) - ;; - run) - local arr i file - arr=($(grep --include \*.c --include \*.sh --include \*.py -Ril "@用例名称:" testcase/)) - COMPREPLY=() - for ((i = 0; i < ${#arr[@]}; ++i)); do - file=${arr[i]} - if [[ -d $MEMO_DIR/$file ]]; then - file=$file/ - fi - COMPREPLY[i]=$file - done - ;; - esac - ;; - 3) - case ${prev} in - case) - COMPREPLY=($(compgen -W "sh c py" -- ${cur})) - ;; - esac - ;; - *) - COMPREPLY=() - ;; - esac -} - -complete -F _tsuite_completion tsuite diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" deleted file mode 100644 index 42887c2..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/lib/tsuite_func.sh" +++ /dev/null @@ -1,499 +0,0 @@ -#!/bin/bash -# 测试套管理工具 - -export LANG=en_US.UTF-8 -export LANGUAGE="en_US:en" -export LC_ALL=en_US.UTF-8 - -if [ -d "$TST_TS_TOPDIR/tst_common" ]; then - source "$TST_TS_TOPDIR/tst_common/lib/common.sh" || exit 1 -elif [ -d "$TST_TS_TOPDIR/lib" ]; then - # 只是tst_suite_common使用 - source "$TST_TS_TOPDIR/lib/common.sh" || exit 1 -else - echo "can't find the tsuite common file" - exit 1 -fi - -[ -z "$TST_TS_SYSDIR" ] && export TST_TS_SYSDIR="$TST_TS_TOPDIR/logs/.ts.sysdir" - -tsuite_usage() { - echo -e "" - echo -e "./tsuite options sub_command sub_options" - echo -e " help: 显示帮助信息" - echo -e " new case sh|c|py case_name [template]: 新增测试用例" - echo -e " sh|c|py: 【必选】三选一,sh表示Shell脚本用例,c表示C用例,py表示Python脚本用例" - echo -e " case_name: 【必选】要创建的用例名,同时用作文件名" - echo -e " template: 【可选】不使用默认用例模板时,可以指定一个文件用作新用例模板" - echo -e " list: 列出本测试套的测试用例" - echo -e " compile: 编译测试套" - echo -e " setup: 执行测试套setup" - echo -e " run options: 执行测试用例,options可选参数如下:" - echo -e " null: 不指定时默认执行所有用例" - echo -e " case_path: 执行指定用例" - echo -e " -l level: 执行指定级别的用例,例如:0,1,2" - echo -e " -f case_list: 执行指定列表文件的用例" - echo -e " teardown: 执行测试套teardown" - echo -e " clean: 执行make clean" - echo -e " cleanall: 执行make cleanall,在clean基础上删除所有临时文件等" - echo -e "" -} - -get_all_testcase() { - local _tst_case_dir=./testcase - if [ ! -d "$_tst_case_dir" ]; then - echo "no testcase dir" - return 1 - fi - touch "$TST_TS_SYSDIR/all_testcase.list" - grep -r "@用例名称:" $_tst_case_dir | awk -F : '{print $1}' | sort | uniq >"$TST_TS_SYSDIR/all_testcase.list" -} - -# 获取用例属性 -# $1 -- 属性名称 -# $2 -- 用例文件 -get_case_attr() { - grep "@${1}:" "$2" 2>/dev/null | head -n 1 | sed "s|.*@${1}:\s*||g" | sed "s|\s*$||g" -} - -tsuite_list() { - local _tst_index=1 - - get_all_testcase - local _tst_nr_all_case - _tst_nr_all_case=$(wc -l <"$TST_TS_SYSDIR/all_testcase.list") - - echo "" - for i in $(seq "$_tst_nr_all_case"); do - local _tst_case_file - local _tst_case_name - _tst_case_file="$(sed -n "${i}p" "$TST_TS_SYSDIR/all_testcase.list")" - _tst_case_name=$(get_case_attr "用例名称" "$_tst_case_file") - printf "%4d : %-30s : %s\n" $_tst_index "$_tst_case_name" "$_tst_case_file" - _tst_index=$((_tst_index + 1)) - done - echo "" - echo "total $_tst_nr_all_case testcase" - echo "" -} - -# 执行单个用例 -# $1 -- 用例文件,Shell和Python用例直接执行脚本文件,C可以是源码文件,也可以是二进制文件(两个文件要同名,后缀不同) -tsuite_run_one() { - local _tst_input_file="$1" - shift - - local _tst_ret=0 - local _tst_log_dir="$TST_TS_TOPDIR/logs/testcase" - - local _tst_exec_file - local _tst_case_file - # C用例 - if file "$_tst_input_file" | grep -w "ELF" >/dev/null; then - _tst_exec_file="$_tst_input_file" - _tst_case_file="${_tst_exec_file%.test}" - _tst_case_file="${_tst_case_file}.c" - elif file "$_tst_input_file" | grep -w "C source" >/dev/null; then - _tst_exec_file="${_tst_input_file%.c}" - _tst_exec_file="${_tst_exec_file}.test" - _tst_case_file="${_tst_input_file}" - else - _tst_exec_file="${_tst_input_file}" - _tst_case_file="${_tst_input_file}" - fi - local _tst_case_name - _tst_case_name=$(get_case_attr "用例名称" "$_tst_case_file") - - mkdir -p "$_tst_log_dir" - - echo "execute $_tst_case_name: $_tst_exec_file $*" - "$_tst_exec_file" "$@" || _tst_ret=1 - - return $_tst_ret -} - -# 执行指定列表文件的用例 -# $1 -- 要执行的用例列表文件,每行一个用例,井号'#'表示忽略对应用例 -tsuite_run_some() { - if [ ! -f "$1" ]; then - echo "testcase list file '$1' not exist" - fi - local _tst_run_list="$TST_TS_SYSDIR/run.list" - local _tst_run_result="$TST_TS_SYSDIR/run.result" - rm -rf "$_tst_run_list" "$_tst_run_result" - # 去掉注释行和空行,删掉行前的空格 - grep -v "^[[:blank:]]*#" "$1" | grep -v "^[[:blank:]]*$" | sed "s|^[[:blank:]]\+||g" >"$_tst_run_list" - - local _tst_ret=0 - local _tst_nr_pass=0 - local _tst_nr_skip=0 - local _tst_nr_fail=0 - local _tst_index=1 - local _tst_nr_all_case - _tst_nr_all_case=$(wc -l <"$_tst_run_list") - local _tst_case_time_start - local _tst_case_time_end - local _tst_case_cost - - printf "\n %-30s ==>" "ts_setup" - if tsuite_setup >"$TST_TS_TOPDIR/logs/ts_setup.log" 2>&1; then - echo " PASS" - else - echo " FAIL" - fi - mkdir -p "$TST_TS_TOPDIR/logs/testcase" - for i in $(seq "$_tst_nr_all_case"); do - local _tst_case_file - local _tst_case_name - local _tst_case_result - _tst_case_file="$(sed -n "${i}p" "$_tst_run_list")" - _tst_case_name=$(get_case_attr "用例名称" "$_tst_case_file") - local _tst_case_log="$TST_TS_TOPDIR/logs/testcase/${_tst_case_name}.log" - printf "%4d/%-4d : %-30s ==>" $_tst_index "$_tst_nr_all_case" "$_tst_case_name" - _tst_case_time_start=$(get_up_time_ms) - tsuite_run_one "$_tst_case_file" >"$_tst_case_log" 2>&1 - _tst_case_time_end=$(get_up_time_ms) - _tst_case_cost=$(diff_time_ms2sec "$_tst_case_time_start" "$_tst_case_time_end") - _tst_case_result=$(grep "RESULT : .* ==> \[ [A-Z]\+ \]" "$_tst_case_log" | - tail -n 1 | sed "s|.* ==> \[ \([A-Z]\+\) \].*|\1|g") - case "$_tst_case_result" in - "PASSED") - _tst_nr_pass=$((_tst_nr_pass + 1)) - echo "$_tst_index/$_tst_nr_all_case $_tst_case_name PASS cost:$_tst_case_cost" >>"$_tst_run_result" - echo " PASS (cost $_tst_case_cost)" - ;; - "SKIP") - _tst_nr_skip=$((_tst_nr_skip + 1)) - echo "$_tst_index/$_tst_nr_all_case $_tst_case_name SKIP cost:$_tst_case_cost" >>"$_tst_run_result" - echo " SKIP (cost $_tst_case_cost)" - ;; - *) - _tst_nr_fail=$((_tst_nr_fail + 1)) - echo "$_tst_index/$_tst_nr_all_case $_tst_case_name FAIL cost:$_tst_case_cost" >>"$_tst_run_result" - echo " FAIL (cost $_tst_case_cost)" - _tst_ret=1 - ;; - esac - _tst_index=$((_tst_index + 1)) - done - printf " %-30s ==>" "ts_teardown" - if tsuite_teardown >"$TST_TS_TOPDIR/logs/ts_teardown.log" 2>&1; then - echo " PASS" - else - echo " FAIL" - fi - - echo "" - echo "total: $_tst_nr_all_case" - echo " pass: $_tst_nr_pass" - echo " skip: $_tst_nr_skip" - echo " fail: $_tst_nr_fail" - echo "" - - return $_tst_ret -} - -tsuite_run_all() { - get_all_testcase - tsuite_run_some "$TST_TS_SYSDIR/all_testcase.list" -} - -tsuite_compile() { - local _tst_ret=0 - - echo "try cleanall before compile" - make -C "$TST_TS_TOPDIR" cleanall || _tst_ret=1 - echo "compile the testsuite" - if which bear; then - bear -- make -C "$TST_TS_TOPDIR" all || _tst_ret=1 - else - make -C "$TST_TS_TOPDIR" all || _tst_ret=1 - fi - - return $_tst_ret -} - -tsuite_setup() { - local _tst_ret=0 - - echo "tsuite try execute ts_setup" - if [ -f "$TST_TS_TOPDIR/tst_common/lib/tst_ts_setup" ]; then - "$TST_TS_TOPDIR/tst_common/lib/tst_ts_setup" || _tst_ret=1 - elif [ -f "$TST_TS_TOPDIR/lib/tst_ts_setup" ]; then - # 只是tst_suite_common使用 - "$TST_TS_TOPDIR/lib/tst_ts_setup" || _tst_ret=1 - else - echo "the tst_ts_setup not found" - _tst_ret=1 - fi - - return $_tst_ret -} - -tsuite_run() { - local _tst_ret=0 - - # 生成结果记录文件 - _get_tst_result_file - - if [ -z "$1" ]; then - tsuite_run_all || _tst_ret=1 - elif [ "$1" == "-f" ]; then - echo "Try run testcases in list file '$2'" - tsuite_run_some "$2" || _tst_ret=1 - elif [ "$1" == "-l" ]; then - echo "Try run testcases with level '$2'" - rm -rf "$TST_TS_SYSDIR/level.list" - for l in $(echo "$2" | tr ',' ' '); do - grep -r "@用例级别:[[:blank:]]*$l" ./testcase | awk -F : '{print $1}' | - sort | uniq >>"$TST_TS_SYSDIR/level.list" - done - tsuite_run_some "$TST_TS_SYSDIR/level.list" || _tst_ret=1 - else - tsuite_run_one "$@" || _tst_ret=1 - fi - - sed -i "/^suite-end-time:/c suite-end-time: $(get_timestamp_ms)" "$TST_RESULT_FILE" - - return $_tst_ret -} - -tsuite_teardown() { - local _tst_ret=0 - - mkdir -p "$TST_TS_TOPDIR/logs" - echo "tsuite try execute ts_teardown" - if [ -f "$TST_TS_TOPDIR/tst_common/lib/tst_ts_teardown" ]; then - "$TST_TS_TOPDIR/tst_common/lib/tst_ts_teardown" || _tst_ret=1 - elif [ -f "$TST_TS_TOPDIR/lib/tst_ts_teardown" ]; then - # 只是tst_suite_common使用 - "$TST_TS_TOPDIR/lib/tst_ts_teardown" || _tst_ret=1 - else - echo "the tst_ts_setup not found" - _tst_ret=1 - fi - - return $_tst_ret -} - -tsuite_clean() { - local _tst_ret=0 - - make -C "$TST_TS_TOPDIR" clean || _tst_ret=1 - - return $_tst_ret -} - -tsuite_cleanall() { - local _tst_ret=0 - - make -C "$TST_TS_TOPDIR" cleanall || _tst_ret=1 - rm -rfv "$TST_TS_TOPDIR/logs" "$TST_TS_TOPDIR/compile_commands.json" - - return $_tst_ret -} - -# 新建用例模板 -# $1 -- 用例代码类型:sh/c/py -# $2 -- 用例名 -# $3 -- 可选参数,用例模板 -tsuite_new_case() { - local _tst_tc_type="$1" - local _tst_tc_name="$2" - local _tst_input_template="$3" - local _tst_tc_id - _tst_tc_id=$(date '+%Y%m%d-%H%M%S-%N') - local _tst_tc_file="testcase/${2}.${1}" - local _tst_template_path="$TST_TS_TOPDIR/tst_common/testcase" - # 为了适配tst_suite_common - [ -d "$_tst_template_path" ] || _tst_template_path="$TST_TS_TOPDIR/testcase" - if [ ! -d "$_tst_template_path" ]; then - echo "the template path is $_tst_template_path, not dir" - return 1 - fi - - if [ -z "$_tst_tc_name" ]; then - echo "the testcase name not set" - return 1 - fi - - if [ -z "$_tst_input_template" ]; then - case "$_tst_tc_type" in - sh) - cp -v "$_tst_template_path/test_shell_testcase.sh" "$TST_TS_TOPDIR/$_tst_tc_file" - sed -i "s|}/lib/common|}/tst_common/lib/common|g" "$TST_TS_TOPDIR/$_tst_tc_file" - ;; - c) - cp -v "$_tst_template_path/test_c_testcase.c" "$TST_TS_TOPDIR/$_tst_tc_file" - ;; - py) - cp -v "$_tst_template_path/test_python_testcase.py" "$TST_TS_TOPDIR/$_tst_tc_file" - sed -i "/from lib.common import TestCase/c from tst_lib.ts_common import MyTestCase" \ - "$TST_TS_TOPDIR/$_tst_tc_file" - sed -i "/class PythonTestCase(TestCase):/c class PythonTestCase(MyTestCase):" \ - "$TST_TS_TOPDIR/$_tst_tc_file" - ;; - *) - echo "unsupported testcase type" - return 1 - ;; - esac - else - if [ ! -f "$_tst_input_template" ]; then - echo "the template file $_tst_input_template not exist" - return 1 - fi - if ! echo "$_tst_input_template" | grep "\.$_tst_tc_type$" >/dev/null; then - echo "the template file $_tst_input_template not match the testcase type $_tst_tc_type" - return 1 - fi - cp -v "$_tst_input_template" "$TST_TS_TOPDIR/$_tst_tc_file" - fi - - sed -i "s|@用例ID:.*|@用例ID: $_tst_tc_id|g" "$TST_TS_TOPDIR/$_tst_tc_file" - sed -i "s|@用例名称:.*|@用例名称: $_tst_tc_name|g" "$TST_TS_TOPDIR/$_tst_tc_file" - echo "" - echo "the new testcase info:" - echo " name: $_tst_tc_name" - echo " type: $_tst_tc_type" - echo " id: $_tst_tc_id" - echo " file: $_tst_tc_file" - echo "" - return 0 -} - -# 新建测试套 -# $1 -- 测试套git路径 -tsuite_new_suite() { - local _tst_git_url="$1" - local _tst_suite_name - _tst_suite_name=$(basename "$_tst_git_url" | sed "s|\.git$||g") - - if ! echo "$_tst_git_url" | grep "\.git$" >/dev/null; then - echo "the git url unusable" - return 1 - fi - if [ -z "$_tst_suite_name" ]; then - echo "get suite name fail" - return 1 - fi - if [ -d "./$_tst_suite_name" ]; then - echo "the ./$_tst_suite_name existed" - return 1 - fi - - echo "git clone $_tst_git_url ./$_tst_suite_name" - if ! git clone "$_tst_git_url" "./$_tst_suite_name"; then - echo "clone $_tst_suite_name fail" - return 1 - fi - if [ -d "./$_tst_suite_name/tst_common" ]; then - echo "the suite $_tst_suite_name initialization has been completed yet" - return 1 - fi - - echo "get suite_example: git clone https://gitee.com/opencloudos-stream/test-suite-example.git" - rm -rf "$TST_TS_SYSDIR/suite_example" - if ! git clone https://gitee.com/opencloudos-stream/test-suite-example.git "$TST_TS_SYSDIR/suite_example"; then - echo "clone suite_example fail" - rm -rf "./$_tst_suite_name" - return 1 - fi - cp -rv "$TST_TS_SYSDIR/suite_example"/* "./$_tst_suite_name" - cp -rv "$TST_TS_SYSDIR/suite_example/.gitignore" "./$_tst_suite_name" - rm -rf "$TST_TS_SYSDIR/suite_example" - - cd "./$_tst_suite_name" || return 1 - rm -rf ./tst_common - echo "add submodule to common for $_tst_suite_name" - if ! git submodule add https://gitee.com/opencloudos-stream/test-suite-base.git ./common; then - echo "add submodule fail" - cd .. - rm -rf "./$_tst_suite_name" - return 1 - fi - - echo "remove the sample testcase" - rm -fv ./testcase/test_* - - return 0 -} - -tsuite_new() { - local _tst_ret=0 - - case $1 in - case) - shift - tsuite_new_case "$@" || _tst_ret=1 - ;; - suite) - shift - tsuite_new_suite "$@" || _tst_ret=1 - ;; - *) - echo "unknown new type: $*" - _tst_ret=1 - ;; - esac - - return $_tst_ret -} - -tsuite_main() { - local _tst_ret=0 - local _tst_cmd="$0 $*" - local _tst_suite_time_start - _tst_suite_time_start=$(get_up_time_ms) - local _tst_suite_time_end - - echo "TST_TS_TOPDIR=$TST_TS_TOPDIR" - cd "$TST_TS_TOPDIR" || return 1 - mkdir -p "$TST_TS_SYSDIR" || return 1 - - case "$1" in - help) - tsuite_usage - return 0 - ;; - new) - shift - tsuite_new "$@" || _tst_ret=1 - ;; - list) - tsuite_list || _tst_ret=1 - ;; - compile) - tsuite_compile || _tst_ret=1 - ;; - setup) - tsuite_setup || _tst_ret=1 - ;; - run) - shift - tsuite_run "$@" || _tst_ret=1 - ;; - teardown) - tsuite_teardown || _tst_ret=1 - ;; - clean) - tsuite_clean || _tst_ret=1 - ;; - cleanall) - tsuite_cleanall || _tst_ret=1 - ;; - *) - echo "$0 $*" - tsuite_usage - return 1 - ;; - esac - - _tst_suite_time_end=$(get_up_time_ms) - if [ $_tst_ret -eq 0 ]; then - echo "execute $_tst_cmd success, cost $(diff_time_ms2sec "$_tst_suite_time_start" "$_tst_suite_time_end")" - else - echo "execute $_tst_cmd fail, cost $(diff_time_ms2sec "$_tst_suite_time_start" "$_tst_suite_time_end")" - fi - return $_tst_ret -} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" deleted file mode 100644 index 1cb97df..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/Makefile" +++ /dev/null @@ -1,20 +0,0 @@ -export TST_COMMON_TOPDIR ?= $(shell pwd)/.. -include $(TST_COMMON_TOPDIR)/Makefile.common -ALL_SRC := $(wildcard *.c) -ALL_OBJ := $(patsubst %.c,%.o,$(ALL_SRC)) -ALL_BIN := $(patsubst %.o,%.test,$(ALL_OBJ)) -CFLAGS += -LDFLAGS += - -all: $(ALL_BIN) - -$(ALL_BIN):%.test:%.o - $(CC) $^ -o $@ $(LDFLAGS) - -$(ALL_OBJ):%.o:%.c - $(CC) $(CFLAGS) -c $^ -o $@ - -clean: - rm -rfv $(ALL_OBJ) $(ALL_BIN) - -cleanall: clean diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" deleted file mode 100644 index 6624689..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_c_testcase.c" +++ /dev/null @@ -1,35 +0,0 @@ -/* **************************************************************************** - * @用例ID: 20220418-230037-838974137 - * @用例名称: test_c_testcase - * @用例级别: 3 - * @用例标签: - * @用例类型: 功能 - * ***************************************************************************/ - -#include "main.h" - -int tc_setup(int argc, char **argv) { - msg("this is tc_setup"); - // @预置条件: - // @预置条件: - return 0; -} - -int do_test(int argc, char **argv) { - msg("this is do_test"); - - // @测试步骤:1: - - // @测试步骤:2: - - // @测试步骤:3: - // @预期结果:3: - assert_true(1 + 1 == 2); - - return 0; -} - -int tc_teardown(int argc, char **argv) { - msg("this is tc_teardown"); - return 0; -} diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" deleted file mode 100755 index b09c3b0..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_perf_tools.py" +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -# coding: utf-8 -import os.path -import subprocess -import sys - -sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) -from lib.common import TestCase -from lib.benchmark import PerfSysBench - - -def prepare(): - subprocess.run(["which", "sysbench"]) - - -def cleanup(): - pass - - -class PythonTestCase(TestCase): - """ - @用例ID: 20220721-001631-159391306 - @用例名称: test_perf_tools - @用例级别: 3 - @用例标签: - @用例类型: 功能 - """ - - def tc_setup(self, *args): - # @预置条件: - self.msg("this is tc_setup") - - def do_test(self, *args): - # @测试步骤:1: - perf = PerfSysBench(name='cpu', sysbench='sysbench', testname='cpu') - perf.prepare = prepare - perf.cleanup = cleanup - perf.run() - perf.report() - # @测试步骤:2: - - # @测试步骤:3: - # @预期结果:3: - self.assert_true(1 == 1) - - def tc_teardown(self, *args): - self.msg("this is tc_teardown") - - -if __name__ == '__main__': - PythonTestCase().tst_main(sys.argv) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" deleted file mode 100755 index ea86f3d..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_python_testcase.py" +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -# coding: utf-8 - -import os.path -import sys - -sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) -from lib.common import TestCase - - -class PythonTestCase(TestCase): - """ - @用例ID: 20220420-234008-893237761 - @用例名称: test_python_testcase - @用例级别: 3 - @用例标签: - @用例类型: 功能 - """ - - def tc_setup(self, *args): - # @预置条件: - self.msg("this is tc_setup") - - def do_test(self, *args): - # @测试步骤:1: - - # @测试步骤:2: - - # @测试步骤:3: - # @预期结果:3: - self.assert_true(1 == 1) - - def tc_teardown(self, *args): - self.msg("this is tc_teardown") - - -if __name__ == '__main__': - PythonTestCase().tst_main(sys.argv) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" deleted file mode 100755 index 5f5f5ba..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/testcase/test_shell_testcase.sh" +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20220410-152859-724647329 -# @用例名称: test_shell_testcase -# @用例级别: 3 -# @用例标签: -# @用例类型: 功能 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -source "${TST_TS_TOPDIR}/lib/common.sh" || exit 1 -############################################################################### - -g_tmpdir="$(mktemp -d)" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: - # @预置条件: - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: - - # @测试步骤:2: - - # @测试步骤:3: - # @预期结果:3: - assert_true [ 1 -eq 1 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - rm -rfv "$g_tmpdir" || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" deleted file mode 100755 index ee4170c..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/tsuite" +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# 测试套管理工具 - -TST_TS_TOPDIR=$(realpath "$(dirname "$0")") -export TST_TS_TOPDIR -TST_TS_ORI_CWD="$(pwd)" -export TST_TS_ORI_CWD -if [ -f "$TST_TS_TOPDIR/tst_common/lib/tsuite_func.sh" ]; then - source "$TST_TS_TOPDIR/tst_common/lib/tsuite_func.sh" -elif [ -f "$TST_TS_TOPDIR/lib/tsuite_func.sh" ]; then - source "$TST_TS_TOPDIR/lib/tsuite_func.sh" -else - echo "can't find the tsuite_func.sh file" - exit 1 -fi - -tsuite_main "$@" -- Gitee From 7800c56d82f2df920aa8da837942ec39f4acadc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 11:51:06 +0000 Subject: [PATCH 25/37] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20tst=5Fcommon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst-cgroup/tst_common/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.keep" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.keep" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 5c63bbfd2ff3841a473d7325cb5c0dda4736b5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 21:10:25 +0800 Subject: [PATCH 26/37] update --- .../tst-cgroup/nohup.out" | 0 .../tst-cgroup/perf.data" | Bin 2470886 -> 0 bytes .../tst-cgroup/tst_common/.keep" | 0 .../tst-cgroup/tst_lib/cgroup_event_listener" | Bin 16624 -> 0 bytes .../tst_lib/cgroup_event_listener.c" | 83 ------------------ .../tst-cgroup/tst_lib/hugetlb_test_01" | Bin 16520 -> 0 bytes .../tst-cgroup/tst_lib/hugetlb_test_01.c" | 73 --------------- .../tst-cgroup/tst_lib/hugetlb_test_02" | Bin 16448 -> 0 bytes .../tst-cgroup/tst_lib/hugetlb_test_02.c" | 51 ----------- 9 files changed, 207 deletions(-) delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/nohup.out" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/perf.data" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_common/.keep" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/nohup.out" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/nohup.out" deleted file mode 100644 index e69de29..0000000 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/perf.data" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/perf.data" deleted file mode 100644 index ed7a71ed8c47ff39b3283ccf00f344feccbfcb13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2470886 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%0Dgp$5yXJ$g;pFDl0xqWtUzw zKl4d%Dj%&%6}n^F}5|-VSt~RXIMn=S$Yk{*oizkOO7@ zOP11gR^@oN;np0HW4$2<%2p${GdbqHN!MAGW8>Z5`c)2L=ee}-+b}O1cczTY zUt#A@^|{9IBC-Ew z#{m8BxXz#cxWor}Fs{Y#+Uc(+?P;sukS1!=KOyp8bG)_B$eS;(zI;^tl1KltyxCxg z`WiJU>w%xk#G}RUAGcMEkR8sOf#;_Up76w3cryRZf7OR^E%>~Zznpiu)Aty18{?BG zT?hIH^VesMaqa!{nhF(jJ==|I6Jq5wz8KnuiJSBf@a$bw(F2|o^LH(II^l6Bj|Yx9 zxhi?U;bsrPI|xS_jn7p3YiH=C>#(5rgnZ2Y?DQhW`&BB23%yhh4XYel&C<*6XDc&2 zlutyO{yib>fW!m*_e`rI>EYkf-vkgNp8)-Ny&=UIobvE3W__4fM189c)MoYN7j@|$ ztbc)CT^Ib{^p^PPA+IgS+h?fGlh?giI`Kq484|zInq-(?%#G{@1J>nY|+a*TGhwHWzW-$FD9^rQ_vfB9b z`g0*#l(h4_V2JwqR-Ea9pUcFfh2;A3z!05>!|@1s z9{ki3o;V9n+QlKhjN`#)@SmReq*#2CH*A!0JLLbs5tJ~O=^u6_eiwFyGG@VINr(H= z=F&Cniu~%>b$+#5uS0zAxq49E4?lf~%;q}3!a0t6-=q11(H~OjYTya=ftQw3k1b= z{$nsieFy&Z#Ls2o(OhL#eeZ{PYT$XK`(Y3A$60tXF4yy=KL?)+t32^ZvG^qCBDo#% zAK-X7_9&B={J`2@f&K#Y6$YPVexUBJ0R4aMUtZZsez1KPm1BRQa>-4v58p5KH?UHJ ze$k12Vi6aF93n2DJly}3ln3&4?MK&$3-Ff%`aR-{bsb!HX*}>bPxHq3UCS)kX3Gn@ zBlx(kgZheBO7y_bC9w$_Ep_GX`~A@00MDl5p76w3cryO!>PvqEJ_Vu%F}cZ3t@Y*K zzoj?|`g`9TD(Mlg)%9i2x86_pJ${JF2ES3c#wbs=_nz1Md~B7}cTnjsWJ&STtv!O% zs68BBZ-U$to_v+*iSVRY?U6jfz~jt%6L3s_cNoJV+AEiybYWiYi4RF%pf5Xk1ZywR zZ^)042ZKI(73sTn5|t4K8QH`2>&vLW|$_lD)$;? z!VU7?kxj-)eaF@c2@C1lF9vZ);QGmkDWXg`K3d`f-pHeLt;V5DomPC2_u~53^^2Ll z(Qo5-eSLXn9p7^<>&IFB?`NpWP676j6ZgNKsCAl5$?||oAjfXwRonpzIT;IUsOn(O)2l^FcILNQ8@#OcF@09zfK%beX zh@?k;qK+p)pV^Dd#3m$E?28TH`1^ftb!K`czfLmm)6y5nb3U}xas(({)@;t_G_FANepULU9v1|8 z^e>xVRv3ftWBH>z@O8QIU449-ANFSePwtOA;fb^GoL)21mvJfh#Qg1vPm0ASb3VzP zPAl-32S6Ut*w`n1aoD#ruG6>Od}<$SpEPhZnH_Tj{eMO{G6Wa>6CwXK+x=26YWGn~ z-yAJ|VeM{*qiaHpF{c|ATAk_xo)?eBddH*9COi?w{Cf!954}9soA7*d?4`Nlmn`9l z9xyn5pqzaV4GX1-7U0=kp}TiHu33b~z#%7(b-uv!wBZ*o_xmC`%Xku^2gVZ|ecHRG zxXrYSnB#E_55>QTAmsZI_jFIcrhkAxf2H1%9`Uc3tj(II27Td(zVg1I3H@dH>?f<` zJoWxGD%bumNnV#PIarom%2QdU0+oYe==YOpRPO(r%0e5d+%fNEdEZkDschDO=Ide` zQF*i(mBHbZ7Zn*s<>nV@zuSRq+Hc>r`Wo3@L5-*+{aNdRm&dk~IHA8v!4sJN)OA77 z|Jj4${L6_{uAf(1*0Ze|U5{UzM_zAeuF2BwIk6RY|BvCLIP4Y=GiQ*!1$(yt7X8Wo z3lx~uPc(Iw?0*OuTb0l-EI*m{cJd<0U&^qX>+on%1|ColA?&}NVgEx4|Fk^Ic%Dg& z84UZUZJs8ckT*VH_J19olu&OHvnN3>K3F#beO8~(D437zWm8kK=j-&5mVS)-Pr2-7 zt`DPqY8vg+=J6}?D9HoA;mZ2W!JuB zzaNkMa+mleOL%(q=_fmsD*DdgC#XK)*;RjvcRW$4gy%Hfr>;{qH2f(#`rMT)<4H=2 z>yi*Bv{N}WoR)Nf=kw+tdBEe=?aaPMtX_&te5wVb{aDF z3mFo#)J}bjZoe{meamjP@0scyk2aq0gcv&oQwbOB_ywb##@4>$(=4~skc5E}QCMiT z&~T~``pFfZ%J2w3&81oE%e|i@e*^uB{+~#C^s|&5>o*zmYM@8IbDdvgjwSihjJU4E zt&xVl|890VLLkkOzIzYp(?wWe_0THNIPl*81K}+tD$_sL;Rz{Ec6i#LF!T<67rBT0 z^reqVyeaO_5+0dn^%IDUsBX3Y(ch+diA;V#9ow7 zWcH@=zdpAYv4q+`df!^vZnY;;86lLRf5={}dDwCWJ@C)GkjC%}{mGAEFQE5czh#fE zHz{tQ{y}BaS^cU#fN^Hb`26y|kDoTTUXK5h4}><5#k z(Dj!_`F9KN`A}NYd(sZW!b8HsYE`L9IJcN~f#(Tdib9^I-`|RpE zvTQw-^fvt><#jWbyeR*^uRYnt_?}cY?M3B?8?0L#Zaj|Stl|EuA5QE$oawD&^hG9z z>W82o{U+U4{F0M6Q_c2mv7Xj%pzrhF-PzK8K3g3(fxgQoy6<0~*P%&|J)&b1D(QQl zRQoG$JU=Z$?foldT8DXL(3j(pzC zU?_gnKfv+*OCvq-b(z0w$-|bvFj&9A;dKk(`S5}#JaHDDh)N&$GOr0fyIbwV+>FFxdd;gW~o!%ssY-s0~MJl#w32VVFg@M-CNQVzAzD@>Esn*NCK#?79? zf_l%4@x<3<;?;sr4qqq6xDNXv@RZ)=2~V7bC$q|0U-t2U&(!mt_@r2Tk~fgt4*4N) z>|fA_wL95qoUNUPPL5}Gdb?o`S+&!&CSOarh)S+pm*?`64JjR zAK}d~@gm*;Z{~(03~vENFQ7+!!Z}oS`^`Hl`^|SuqkZRdv-!L#fq$z0MR|PTQ7H%H zx;mS#5f_k`%-8P`XNI8MH{xS?ZiV=p__iNT*SL@L=ekaRpdVLjDm(YWxx9p*^R~di zi?UX+PnjHx9;NH7%28%3(W9SoS`O0d99zAPk3G)xdZT_5cInjlXrjHv*&!$=4kvuD zgGYwZHS~@Aak+kv_+q~ouD6!>QJ!}Idg{00C9R;*GB1p{D@HG)42KM%68%xh#HB#d_B2uk&!YzXF~)ukG<5f1HIUEiBfT{tA5l+~tW+ip3}Sa1SZBL;V$S zT(0*slb7uOm}&o?81MN6{rJ9zBt85Q`4{>t(4R`AeIqx!uVlm1w0^j#36=fgsPuWA zaefJDM?pu)o`jsav=>b|8@xwmDVA^oMA^==O2AH|Lb~cnGlVST0V~odc+OTYudwI*GB0#RQ5dIU;MV)MRi*F7EgB- z<#ppugCXi`81IRnOJWl=nydGU)vxHK!*K(6-k$CWPn?A(t>bOJ?2`kZhtfUqag#f} zC&?Y5%Pu}4@?Uekaip;xT>9URE5t8M&vyG)xX} z5phO480{VJ|ToRk0(Oebh4;reM4#z#5iDf;kf z4|1nie3EmK+z$B-a9o@D7sCO&62FU+-B9+ta7ohPz82@`8g_;Ie$ej``|42^iJmH- z8xz;!+dqn~)%$)l?nC+OW=-zL7uVuj_e;9QeX!&G`fuXfH?dEb=z+cE|HXCLn*HSc zpeH*{GJn@HClnkk&RejVH-5;NH$IS2c8^ZQ`xP;742I%I{R155k9gwiGJn@nhn8&V zhk0Y*x!5D#gC626JjtC0`!a6~K7H4C;^QWF+7OaEN~+7$JH}ZL8s`fAZAzw7-H;c>{npqD1KUuOEJd^+9izcKFv`koW{^LXmM z2+-R-KYjQ?%Fo9(q!QzfN1vhV+0Ce2d4qNPODBg({nSpPGQwy!!f%ZS>KM<#0Ds5< zdae%nhdLereRe+w6M3|W#EUp2@QCNdP@XOEnrsK)oKc*vVIL%yHBN+{59@V^?|^%L zlJ`R{b({!#yLJh*=h`7xboYeVfqL8Gx@yz?%wEy|<9F@!*xov85DJZ$xn8XHwf*$E|m5Y zfPT_JqK92PVyFf42cU1=o$hXztLj zRz<%LcxIhF=mAfP`MZ{UI91xCL;VJD{QYt!!$Edv&Eu9Z&ie-a@qZ3Udf1^lj|=)6 zoezGab7w~^jFs&Xy|0@rYfq#yLMUJV5YA+?f9t)7_UQrVntP5ioPu6_;4h%ZdD}O7 z&*?M47pXm{8e`vH6O(_`_y5Y@!T;5FPBH#i2gUdp^s2sVcBm`&@t~fS>(8@#RDFYf zpYfbok5JM>afi+~6}Uv+jq>W0e?_PdDp`H1fy_Z(*H@M`}L`lScxzAzup6{uT>&S5j)81}cv#MkBc zT~o#LG{Co_`ELxLdM*d(o3^FrR~omcvR4X~SUgZLP`VH(bXU^H7_d6s*9!{J z`n4=UZ>v5S67u!vCl$B0{qSK%9J9JOuo%G%;*me-1LRCnTt`Zjm=#Lp$M z2^uZ(;nw5)uN*zx$}%Pl0wPf0<+Y|LIdTWF86n(sdv6 zy8i<7Z(n^v-dC#+&ENREe*94(sh6PLWEU8B0hg9~Kj|&q$dDswz906v+L*6vzA#C; zLYDM4KtF_1KPgqd1H^c)4*U{ZlOCYA>+qy!wvzT6EHtWr(&fMAI^YuH`Kqn|?2H$` zWC>57_-^u<&>H4r<7PWX7Y||WcpaYPJ%s19;G}<2<-aDL?tRFv&fFJrMEsH^Jl*@y zpj1C86$i;eKb3~k`_Q<4QcS#B%MXE)ZSCu zB*^vTEVcJQ@hFjqA~nnh>VW6Ro@K7nbC9;u)N`vB>G>AWKR>q|)3Xug%yBj7pXkQt zp*mEhacSsqDsT4vcNbgEm+ceXliI!Z<5WgS?ch1OCMNF9iMwRK2i!-NRAIQ)@i^$w zPmBA+d(}|xT$&{BM}3VK(>2-={qz$39`VIK4_v=7|0B6i1oRZIx0ra7a?^Yr=tqqE znC*8_pF;wD_hl5P53Zwfa*n(wGhWIpuxqZkZx=@ErH}hnpocn1Q<>fnAMv{uRkd!= zP@SK{<0A08r|>inc;YPiqlUiZOTGa<%X@p`@TZ`g&vTMHz@HG8wmIpj3mVT0R5gv!)IdBYYJ;wtMH@!raA{-9y z2LYbRC+9Le)NfjGaoOk9B_7bPKekBHV?I}ni=d}?W#yL`U!tDyOG{Zj>O3XrvF|+l zo{PC(%A>FMh`IKPh~EO&V*QJ9Zk6Q{AMmyhqie)t#P2owJ>rY_jq7$3-jVN_0X@Z` zcu6a0wA7J#UeAWO2Y#iZ>3vw7pUdJGv2DcNei&x~&yd_>Jjfqs;fb%e-IslO;IpQS zCq8a+$A3+7M^JomD((SK_bcytklPK<>934-a5nA%&(J;-Jm5*O+97#5;c+PL0mp!1 zA9%pwrkAu22#3RQ4|tA#`60t&7q38H?#o${9&yiq@oKTuOIVe#npO26f_NoxiTA~! z?0eudi4S<|?4xVM1H`M1`aR-{^EYvwyIK*sj|%jNSNL5EDOqNxc<+Lb=Wn9E>0f)| z=aSe2jTRsDY!g4sUjt8zn4%u!kF)SZ{n^5ocm+PMZ}P;)P43JKEu`EIpT7w_Q#%y% zAa{x-ck%`UPaz7R$<*UxzQxz~ssqQU$;BBCJAVZIi1HOBz5o63JE@O%ep@yBNXoog z@JE4bgW+4E?D%>mi4S0yMoV%rJne> z$sN3m|Ry!n*AUqD`55UnY zS8fkD-1L$;hj2KYKLF3Q*KcEZ)OhvjYjo};=+}*_p24&m^C9$S6?SN6T1h4#1L{VeFuAV+i;(OHm8;%{q?ye8#>9?+kGUJL%{ ze?j7W_Xu&9{t1!)n)6dU9rz;w(HFg=+XR4+uUPA9>=FV)03yPI5aGuYu#m(l&p`G57 z^oWn@{59yaYWH^M5M2Gw=d3N3dPBY^aF5i#C^PT*K;nlyi|(Xr*gO2=sD6+5VqG5B zzh0yB=N~7tH_lCrm$ZUL%V<&Q>6i4<$8~w|`(a}txu1^nb6Nc2Pli?)s`GO=-vgeg z4v%=i6KCN`UD4T>@fY~Ku*MS~H@P!TklZ1Cx|~`|?1)D=K^Q-OBA>mU^k(MiUjt$B=6gT@k*eeX*91|b%1>n0>`YDFbf8z$ypV7R=KJW}%oPB0CU^s7;^O%I5 zf6>1vzp2$w$^rdHhSN3T71>j|X3Q#T$7>Xk_Q(Zi+@37{AwystfexpXt=C@--P>QIc5fxZ_TChoKd!HsL9{$-lNcV9zTa^k%1TG znQN6KZpcy3xGu~5+hxiPI|cpxh{{ZEr_W)cyfj?uTwu_*!u5{tGB6JI3S2K$kCeC| z2aVs7%=@&A_5F54>32mMcZN`je(yo!eE^SknfiqI<+|~k!WewNx~-)LzAlTeYhmXf z;`It0&QpPB=x3hr#94UaTO9T!PX(XCmpt)FvG^p9Ah{jt-+|+)F>RUt$#3V_+Hb)> zJ2U(BUz{B$^?~^ajMIc1Vw{FDrc+mm5Av;SPuH+(_`?_aJ>uK7OG2zX_?66A{!RS- zP~vlPy$$!lA8?x}1MoDt>IqMrg(qX#N?-f|eA<+VWcn6%DE4=v|0s80mXsUx7pk;k>$S37 zg`$o9ouJqMBB$8MuG7r=#(mjB_5-NzRHwGAJ~dAS{VNWgvs`fXY$@NSf2n=R-cl?* zCy$_ZcPJh}4W$o{Wome0lB*d`^t<#3#k#lU$tScF6vLqxdu5 zF#S{9SZT(Mv8(C*0HA;70?}i9X-p@X`=3ES$=Elo?t}LAd3?mXeL;<-euB=EeGu*> z6F1Ij2JVEe-$^-vTl8DvgZvxxcIP@TZ2yGhSG!3gSw_gaEk6`|)*3z~%DI_GBtP)~ z{Aap`9}2v=v?eCr<&ov&xzS(g_lob2hg!?^V&FAq%glHWdYY99*R~kyi2T%jZ?g8F3SN1%B6( zPey$po-6lpJqY!s?()RXC9w$_E%W)zReo461)jqF2Y8S_&cc&i=XPJ#OTnk_&z|_W z$sN&>?=bAe z+4UgcskJnj;h}ydS;Ki);f-j%7xak(T#_FBrl1!e%or+ziWu*epG@Vt613j(n9XzA zH@_}Ka*{mhraT|rN&F#C=lo}wJnB3?=+_UW`(j5?`KeLn%}w~L<)Ly+HlI^;qxM)o z_bkJ2*B-v^OUdr{V+j3=_hX>^Gw3fV2ij%%Rgw$&h0uc-U%@Ye_SBSlm^iasd^7Lg z!sd0=@fGNi&n`3WLz!>*R(U__YcPzi-T90075Kw1K>z%5qK9AlE1y@-Z~x_`Z zO6z54$1m%jk@rImbsPYC-5liy^Z4R^kyoP(di4s!aoEP|Y>;M|EeMaAFQ`ibZBQDQ3UXM7|kRZI%6QL#ofc}NP` zg5del&z|taS$Hy5#rg8Q0p$9-@Iodx`TZQzPIfe*eI}s)Xy_tlC+avC^x1uGZRKTO zN&Qb8u|<}IbES#%&S-AW-~aGA!>P`5f_`ity022Np3)!2ze4BJt$K~hkv_h!v*7Q9 zcSKpjf1OBBv)y5}hwX9*|h`zNes`cv~1(5v~*u{v){ zc~DQ>BkR4^1A5hek+-0pN&jqN^{D;}dgPDU_niAUDbKQZjxBos=z^JqGu8Cp#cgOG z7I5w#^bNzQ?%x7^mm8eZ_-NH&>DPH{Q2BmsDx1`yGSnDvspBW~^8%0P=TYWP-zISZ zXUVm6?QRc2`XOcLXJcNW=VuP;b%<||J&V|RsOq{c=xddKTHTs)**;b%a`c9U(kQ}BhjP%)aQjjf4nc*vwA)o z^2*#sUYU5rzvp&C4$W2X9beXoQP1av=v+>2KW^rvg~PgzO1@09Q3OHZ>vW2WOYCIiso~q{6TL~T%`Ey zrk~{Eq#uXonIZ3@Sdy2wlbc_;CJ+vX&&30tqUSjtYOgf2y_(jiyaec?c``5yY46mA3gP!EhFzZ2ni+bV?JbO#drwaVy9A1>=Dn2LWfLtGxr)$_F=^@?J z!^k%AvK?pXb%<}@7KPaPg6jMa=|WHcj|Q6Lujbvbhj-Fwp01KHv4#0A;Kh6wt~U;$^KBt7@-+Oex!$}O*;O|xALolu z-_wnYN_}yDE~!gFqlHvCS9FM8I-I8g&%ooJ@Wfeo(#ntZC7%JGyIa$_y|!|@%97j; z&u0M7_E+fKRE{Ubk~=wM> zZiGuLq8{b34)gE12D~imhg=jtlFZ+=sD+Uqi}L^?joL$~#Qg8gK2HMuR9@kUugl__ zzH{-9gLPgG#}VN9;!jU_;w(Is&-!%E4fu?^H_3y(Q!GBo(@AcJ@;2ajWzk@UgZy@m zX@~Gb&`+v6l-Z&G=Fb*OeW=fq2wY;`2IbyMgb#RkT%>E*HTu!@`aR-{bDnTr?!ZrS z-z(_RkK%VNEj%Mbyw}Xf^KnsM>Wuv!__-uDL8C?fvgwc?<~x9AbJzh7c;YNPt^x;q z+2;j5dB%I<<0g0VA(A^n*Mazi$bZfCrtCT&7kIYa@rwt!-SB7!jdn2h$wYBH*>yfH z@CW$p46#PzN}+| zPp7$@5BY^PKb6sl*0DifynK1KzNF4ifj+y=6U)Es6{&aCUoSjSNctUcwY;6b-(2-q z&};o@p3LX@vkF5cuApv1WJ&hvW-q}>WG@khLx)g_yf?f0A;|wlb&{X^iyIzSBH>AO zwjTnXhPdXSJE0_9!!OY9OxEuaU(AQ$`h4}Ha(=Xe!3X^ge%B(OZFIJs{-clcVW=;Dm?wTN ziA~UG@fAuP^+Ue{Jh96>;fb^GWIp3f zx0dZF2#t9R(CdGZOQ(p(xL?aGL3(s}ehvKI97XSw1b^I{z4Ll#j{Nw>ooP{Uk z+5%tZy}@VsCQp3aiM7@T9)m&6jg* zz^7=XZ@tT%*^T6OINt!CdJBK>fG5S0JGs7r$C-QsI9$){VmQce=a_zrd;|0^B+z^% z{ML`-38{~Fnl`8vQl)YgVT<999UeDR`Ue`S>Z6`v6K zui39=^}HI?HzURqKbMJ5i{H3#q#w?!0iJ3TJmHD6@MIKS=F2z*eBNH@iBF2fCwT

qu~olEd|_9({xCP4HvxLs6@J$$ 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¡ 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 LV!lto$BKUegRH{a diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" deleted file mode 100644 index 461b0a5..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_event_listener.c" +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * cgroup_event_listener.c - Simple listener of cgroup events - * - * Copyright (C) Kirill A. Shutemov - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define USAGE_STR "Usage: cgroup_event_listener " - -int main(int argc, char **argv) -{ - int efd = -1; - int cfd = -1; - int event_control = -1; - char event_control_path[4096]; - char line[256]; - int ret; - - if (argc != 3) - errx(1, "%s", USAGE_STR); - - cfd = open(argv[1], O_RDONLY); - if (cfd == -1) - err(1, "Cannot open %s", argv[1]); - - ret = snprintf(event_control_path, 4096, "%s/cgroup.event_control", - dirname(argv[1])); - if (ret >= 256) - errx(1, "Path to cgroup.event_control is too long"); - - event_control = open(event_control_path, O_WRONLY); - if (event_control == -1) - err(1, "Cannot open %s", event_control_path); - - efd = eventfd(0, 0); - if (efd == -1) - err(1, "eventfd() failed"); - - ret = snprintf(line, 63, "%d %d %s", efd, cfd, argv[2]); - if (ret >= 256) - errx(1, "Arguments string is too long"); - - ret = write(event_control, line, strlen(line) + 1); - if (ret == -1) - err(1, "Cannot write to cgroup.event_control"); - - while (1) { - uint64_t result; - - ret = read(efd, &result, sizeof(result)); - if (ret == -1) { - if (errno == EINTR) - continue; - err(1, "Cannot read from eventfd"); - } - assert(ret == sizeof(result)); - - ret = access(event_control_path, W_OK); - if ((ret == -1) && (errno == ENOENT)) { - puts("The cgroup seems to have removed."); - break; - } - - if (ret == -1) - err(1, "cgroup.event_control is not accessible any more"); - - printf("%s %s: crossed\n", argv[1], argv[2]); - } - - return 0; -} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01" deleted file mode 100755 index 162350e1309cb21e1ad9aeaacb258bc4c9129376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16520 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 Mw#5REgGUtq09~;zg8%>k diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" deleted file mode 100644 index 6c150b5..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_01.c" +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include -#include - -#define FILE_NAME "/mnt/huge/hugepagefile" -#define PROTECTION (PROT_READ | PROT_WRITE) -#define ADDR (void *)(0x0UL) -#define FLAGS (MAP_SHARED) - -size_t size = 0; - -static void write_bytes(char *addr) -{ - unsigned long i; - - for (i = 0; i < size; i++) - *(addr + i) = (char)i; -} - -static int read_bytes(char *addr) -{ - unsigned long i; - - for (i = 0; i < size; i++) - if (*(addr + i) != (char)i) { - printf("Mismatch at %lu\n", i); - return 1; - } - return 0; -} - -int main(int argc, char *argv[]) -{ - if (argc != 3) { - fprintf(stderr, "用法: %s \n", argv[0]); - exit(1); - } - - int hugepage_count = atoi(argv[1]); - int hugepage_size = atoi(argv[2]); - size = hugepage_count * hugepage_size * 1024 * 1024UL; - - void *addr; - int fd, ret; - fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); - if (fd < 0) { - perror("打开文件失败"); - exit(1); - } - - // 申请hugepage内存 - addr = mmap(ADDR, size, PROTECTION, FLAGS, fd, 0); - if (addr == MAP_FAILED) { - perror("mmap"); - unlink(FILE_NAME); - exit(1); - } - - printf("内存映射起始地址: %p\n", addr); - write_bytes(addr); - ret = read_bytes(addr); - - sleep(5); - - // 释放hugepage内存 - munmap(addr, size); - close(fd); - unlink(FILE_NAME); - - return ret; -} \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/hugetlb_test_02" deleted file mode 100755 index e453dc87d0542654aa030fd890b4cf3bec9c69d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16448 zcmeHOeQX@X6`!*)n2^K{A&>-`TvI>^kn`C%X`nTnV_&kSNg#KI`_)`@N5ueLK6J*`4`fc*D9HpHDE=ifaT)`{yYnM2h?xDgXPCv{|bfr{_Xj?fyKzSJ_&VDGO-vIdykRS7Ds*gG6 z6Pu5}HIz>`4}uPfx!W&Fes12W+yry118M7o75OOj-9Uaj{W6Sj^Hv25=3L)q@WZ_P zyTq4y3)NTcI_#tTGpF>5rg*Gpb!$^RvN9e^<_1;{tXaKsb!#A-3be>3V7vVA!#=fs z(>4KN#t@@4ikiHVIUefHBR$#&$8&F;cO>qA#6^C9OVTSgDxEC82kI zLG;E`SyQCaW>RG1rkNI5D`I9cA`ORBMwkOJOC&HH2E#tQTCCsDwYEcV3A6-O+2t!+ zh2GV@Q3qeMKbE!3O!vl)cq(aj8$EFo+R~p$C8;gCGOcKcy|fm3aV`DLlx9#L*z`dP z@OmQU7RS!U-kydsVoyA<7rJ+ixC50y{QTs6U`$4`ZfM+u!?{LXE zmz;3Prc1urC2w=d8(nhPCAYccRZhA2ovy->&ufL(wV^krZ|Dv;k2SxnjkNs~&a$*% zK3JaY3p6a<2_js;k+!P<(MIZ8kX?1kS^$^!J$Rddm-g(^v4*92w0nU#*q<%!SJfa} zaat=(YX|>yt#!zV9XV~C2LWEB0QIF~eKK$CkJmrn_B(uAk-L1GHq`bFENX=b zYqmDr_AL-52TzwulM%QWhw7dL*>^Me+V!LV)a{_e!Zz@O&KNB0cugzh#)o#iR%G2BViI?*ph1ew$E; zBGKCihfy<9x0l2&5LNJ3Q85fIg+ri!MCnx$I?)L4qseEb(Sohe0%iLvjM)w7 zaQGyYE<^oD-5QGi*56Ad8RF#^@Dj*pfqnO5Lp|~`;AOzefR_O;16~Ha40svvGT>$4 ze9R}%-Up{dB2Vc3`e@WK=>1eLsOdI{C-kZuLt!o@W7Cuc~GfOljl2#L1$pf19 z#ozi57T3vvATc^LdIMT5?>Vg z+3VmgB$;Ozi%I77a5yhPV*OuEmr^K?(&9E=JGPq&yk_hu>3Qwf&(R5p*L*EhqF6wj z8M%olt?yE^N~oVslukqN8Z=yoij*gS@dMNlZue1TCU}h+*S~~tw) zc*S+|TYEEBb07t)(~X{(ZW;XofUK44>kIUXnU(CimC#|CeA3K$bFS4C~=dojNS0@BHkh_KjT~0K?7?J*<&d>)ayr^&75V+rB}+ ze%-pQ;cmUVeeH%Yc(`{4gm_6mEaO-E0&D~q`G45TetfMfbTeXDhLEQz-`keC%Pj_F z2&570)ph{hmEbZc-!Gs?vMD`kBqO+&pzC_@jKq?9E^9`h?j#)ao@|!lsqGJC;pFZI z+~ZJ&sx1y>5blg9191OC8KCR1v4Jy>J02=-V~|@ZTz<|y8s#dy z0Jk!VN4W$WIm}F21d=Js4D=^+fpi8=Fk=lmpq^X|HX+3#1hud2T8W)pnn#UnR0JY} zNvJ|`E2A{GnVD=Xl`Io<&}GcHfeutk$1M?%Ee}93(4PVk3t6*Q1T1p^MC|ooosyj+ zU`DB*Mt?k@)|al7zs0Q%-;P{yF^a;3WS4z!;88oc=s6V(w={;%@&N z0e=t1uH1ee-!orMel*Per}i75$FV*8^Z1|nC?*#O+lWOze;$X&0K=gi`}2H)InN)! zL=uH#QQQh89GkO0kH?vF{q?+9A=LU>G0dva!JpW+M^AE1y zeg0o1|Fsk_j}-wi=lKu%W6s?E4*`Zb;rRCdJ^KI0^E@z-N!JO?l0L#orUH;RgV2*kxu^)3a4xTxG9v3l>^M#=x?8h;2Ev57Pc^t`{ z=h1BM&fkmVZ&%|dOX7Ev$c(Qa%fEmE*3bSs{Yt~URf+b|UH@-E -#include -#include -#include -#include - -#define FILE_NAME "/mnt/huge/hugepagefile" -#define PROTECTION (PROT_READ | PROT_WRITE) -#define ADDR (void *)(0x0UL) -#define FLAGS (MAP_SHARED) - -size_t size = 0; - -int main(int argc, char *argv[]) -{ - if (argc != 3) { - fprintf(stderr, "用法: %s \n", argv[0]); - exit(1); - } - - int hugepage_count = atoi(argv[1]); - int hugepage_size = atoi(argv[2]); - size = hugepage_count * hugepage_size * 1024 * 1024UL; - - void *addr; - int fd, ret; - fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); - if (fd < 0) { - perror("打开文件失败"); - exit(1); - } - - // 申请hugepage内存 - addr = mmap(ADDR, size, PROTECTION, FLAGS, fd, 0); - if (addr == MAP_FAILED) { - perror("mmap"); - unlink(FILE_NAME); - exit(1); - } - - printf("内存映射起始地址: %p\n", addr); - - sleep(5); - - // 释放hugepage内存 - munmap(addr, size); - close(fd); - unlink(FILE_NAME); - - return 0; -} \ No newline at end of file -- Gitee From 0e3343a7dd10c09649d1081123792d7b0872133b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 21:25:57 +0800 Subject: [PATCH 27/37] update --- .../tst-cgroup/testcase/allocate_hugepage" | Bin 16240 -> 0 bytes .../tst-cgroup/testcase/allocate_hugepage.c" | 24 ------------------ 2 files changed, 24 deletions(-) delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/allocate_hugepage" delete mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/allocate_hugepage.c" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/allocate_hugepage" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/allocate_hugepage" deleted file mode 100755 index a4bf2440d82a2be9a3c5a5809e90cdb501d39651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16240 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 - #include - #include - #include - #include - - int main() { - size_t size = 2 * 1024 * 1024; // 2MB - void *ptr; - - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); - if (ptr == MAP_FAILED) { - printf("mmap failed: %s\n", strerror(errno)); - return 1; - } - - printf("mmap succeeded, writing to the allocated memory...\n"); - memset(ptr, 0, size); - printf("Memory write succeeded.\n"); - - munmap(ptr, size); - return 0; - } -- Gitee From 8f1be1e5012e19f74ad6c0971f784e17ea7ec9ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 21:32:46 +0800 Subject: [PATCH 28/37] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\275\277\347\224\250\346\226\207\346\241\243.md" | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" index d1efedb..8f19591 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" @@ -5,7 +5,14 @@ ### 克隆到本地 ```bash -git clone --recurse-submodules -b hmt-issue https://gitee.com/LINGYUNXINGZHE/tst-cgroup.git +git clone -b hmt-issue https://gitee.com/LINGYUNXINGZHE/contributor_rhino-bird.git +``` + +### 进入到tst-cgroup目录下载子模块 + +``` +git submodule init +git submodule update ``` ### 安装必要的工具 -- Gitee From a8a60a7594d4930f5b5e09888bba4c82c9010efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 21:48:58 +0800 Subject: [PATCH 29/37] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\275\277\347\224\250\346\226\207\346\241\243.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" index 8f19591..aee34d7 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\344\275\277\347\224\250\346\226\207\346\241\243.md" @@ -11,8 +11,7 @@ git clone -b hmt-issue https://gitee.com/LINGYUNXINGZHE/contributor_rhino-bird.g ### 进入到tst-cgroup目录下载子模块 ``` -git submodule init -git submodule update +git submodule add https://gitee.com/opencloudos-stream/test-suite-base.git tst_common ``` ### 安装必要的工具 -- Gitee From 49c30aa03655c4c4c65959c4df06ff2d4d2294a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 21:51:45 +0800 Subject: [PATCH 30/37] =?UTF-8?q?=E5=88=A0=E9=99=A4tst=5Flib/cgroup=5Futil?= =?UTF-8?q?/bin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst_lib/cgroup_util/bin/alloc_anon" | Bin 16312 -> 0 bytes .../tst_lib/cgroup_util/bin/alloc_anon_mlock" | Bin 16368 -> 0 bytes .../tst_lib/cgroup_util/bin/alloc_hugepage" | Bin 16480 -> 0 bytes .../cgroup_util/bin/alloc_hugepage_rsvd" | Bin 16480 -> 0 bytes .../tst_lib/cgroup_util/bin/alloc_pagecache" | Bin 16552 -> 0 bytes .../cgroup_util/bin/cgroup_event_listener" | Bin 16656 -> 0 bytes .../tst_lib/cgroup_util/bin/pressure_listener" | Bin 16296 -> 0 bytes .../tst_lib/cgroup_util/bin/register_notify" | Bin 16568 -> 0 bytes 8 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon_mlock" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage_rsvd" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_pagecache" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/pressure_listener" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/register_notify" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon" deleted file mode 100755 index 7b1de3e4c0d00576d01e657463530f304111744d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16312 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 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon_mlock" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_anon_mlock" deleted file mode 100755 index 3ed21d64673d8a5f1eda6593857f950a1ef015f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16368 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 JE(ez={s|1dh+O~x diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_hugepage" deleted file mode 100755 index debef21595ebfa251602ff670d296e31c6b850be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16480 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 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_pagecache" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/alloc_pagecache" deleted file mode 100755 index d19763d182088e6db4b35001ef2ef1335963b02a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16552 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 I1`d|}3ji`*+5i9m diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/cgroup_event_listener" deleted file mode 100755 index 2857c986b91d586162bade0cc7a03ad287d27fc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16656 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 J%fKaye*l2Iqx%2= diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/register_notify" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/tst_lib/cgroup_util/bin/register_notify" deleted file mode 100755 index 2bcc4daf8371695de3bd9420e4271a802bed0ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16568 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 -- Gitee From 9866870bd256eb270b205be611f815c3c2980ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 21:54:10 +0800 Subject: [PATCH 31/37] =?UTF-8?q?=E6=9B=B4=E6=96=B0.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst-cgroup/.gitignore" | 1 + 1 file changed, 1 insertion(+) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" index d9510fe..6579f69 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" @@ -12,4 +12,5 @@ __pycache__/ Module.symvers modules.order compile_commands.json +tst_lib/cgroup_util/bin/* -- Gitee From 6d5d9655ed03063328151bc46a433a3190c03ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 22:00:55 +0800 Subject: [PATCH 32/37] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v1-blkio-weight.sh" | 91 ---------- .../tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" | 65 ------- .../cgroup-v1-cpuset-memory_migrate.sh" | 113 ------------ .../cgroup-v1-cpuset-memory_pressure.sh" | 91 ---------- ...group-v1-cpuset-sched_load_balance-001.sh" | 83 --------- ...group-v1-cpuset-sched_load_balance-002.sh" | 80 --------- .../testcase/cgroup-v2-cpu-pressure-001.sh" | 77 --------- .../testcase/cgroup-v2-cpu-pressure-002.sh" | 80 --------- .../testcase/cgroup-v2-cpu-uclamp-min-001.sh" | 118 ------------- .../testcase/cgroup-v2-cpu-uclamp-min-002.sh" | 102 ----------- .../testcase/cgroup-v2-memory-low.sh" | 163 ------------------ .../testcase/cgroup-v2-memory-max-001.sh" | 47 ----- .../testcase/cgroup-v2-memory-max-002.sh" | 47 ----- .../testcase/cgroup-v2-memory-min.sh" | 160 ----------------- 14 files changed, 1317 deletions(-) delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" deleted file mode 100755 index 3ae1ece..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-weight.sh" +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240715-150528-267263308 -# @用例名称: cgroup-v1-blkio-weight -# @用例级别: 3 -# @用例标签: cgroup-v1 blkio weight -# @用例类型: 测试blkio.weight控制文件 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -g_tmpdir="$(mktemp -d)" -cgroup1="${g_tmpdir}/cgroup1" -cgroup2="${g_tmpdir}/cgroup2" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - exit 1 - fi - # @预置条件: 检查是否开启CONFIG_BLK_CGROUP配置 - if ! grep -q CONFIG_BLK_CGROUP=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_CGROUP 配置未开启" - fi - # @预置条件: 检查是否开启CONFIG_BLK_DEV_THROTTLING配置 - if ! grep -q CONFIG_BLK_DEV_THROTTLING=y /boot/config-"$(uname -r)"; then - echo "CONFIG_BLK_DEV_THROTTLING 配置未开启" - fi - - # @预置条件: 创建两个新的cgroup - cgcreate -g blkio:"$cgroup1" - cgcreate -g blkio:"$cgroup2" - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: 设置blkio.weight文件 - cgset -r blkio.weight=500 "$cgroup1" - cgset -r blkio.weight=1000 "$cgroup2" - - # @测试步骤:2: 启动两个进程进行磁盘I/O操作 - dd if=/dev/zero of="$cgroup1/testfile1" bs=1M count=100 oflag=direct & - pid1=$! - echo $pid1 > "$cgroup1/cgroup.procs" - - dd if=/dev/zero of="$cgroup2/testfile2" bs=1M count=100 oflag=direct & - pid2=$! - echo $pid2 > "$cgroup2/cgroup.procs" - - wait $pid1 - wait $pid2 - - # @测试步骤:3: 检查blkio.throttle.io_service_bytes文件 - io1=$(cgget -r blkio.throttle.io_service_bytes "$cgroup1" | awk '{print $2}') - io2=$(cgget -r blkio.throttle.io_service_bytes "$cgroup2" | awk '{print $2}') - - # @预期结果:1: 检查cgroup1和cgroup2的I/O带宽比是否接近1:2 - ratio=$(echo "scale=2; $io2 / $io1" | bc) - expected_ratio=2.00 - - msg "cgroup1 I/O: $io1 bytes" - msg "cgroup2 I/O: $io2 bytes" - msg "I/O ratio: $ratio" - - assert_true [ $(echo "$ratio > 1.8" | bc) -eq 1 ] && [ $(echo "$ratio < 2.2" | bc) -eq 1 ] - - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - cgdelete -g blkio:"$cgroup1" - cgdelete -g blkio:"$cgroup2" - rm -rfv "$g_tmpdir" || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" deleted file mode 100755 index 7eb16f4..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-rt.sh" +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240711-140451-238651765 -# @用例名称: cgroup-v1-cpu-rt -# @用例级别: 3 -# @用例标签: cgroup-v1 cpu rt -# @用例类型: 测试cpu是否能按CPU使用周期时间分配CPU时间(RT调度策略) -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST - _TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - # @预置条件:检查是否启用了CONFIG_RT_GROUP_SCHED配置 - if ! grep -q "^CONFIG_RT_GROUP_SCHED=y" "/boot/config-$(uname -r)"; then - skip_test "内核CONFIG_RT_GROUP_SCHED配置未开启" - fi - - # @预置条件: 创建一个新的cgroup - cgcreate -g cpu:"/test_cgroup" || return 1 - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us - echo 1000000 >"$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_period_us || return 1 - echo 800000 >"$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_runtime_us || return 1 - - # @测试步骤:2: 验证设置 - period=$(cat "$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_period_us) - runtime=$(cat "$CGROUP_TOPDIR"/cpu/test_cgroup/cpu.rt_runtime_us) - - # @预期结果:1:验证cpu.rt_period_us和cpu.rt_runtime_us是否正确设置 - assert_true [ "$period" -eq 1000000 ] && [ "$runtime" -eq 800000 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - cgdelete -g cpu:/test_cgroup || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" deleted file mode 100755 index 1e62850..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate.sh" +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240716-170043-088308720 -# @用例名称: cgroup-v1-cpuset-memory_migrate -# @用例级别: 3 -# @用例标签: cgroup-v cpuset memory_migrate -# @用例类型: 测试memory_migrate控制文件 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - # @预置条件:检查numactl命令是否存在 - if ! is_numactl_installed; then - skip_test "numactl 未安装, 请先安装numactl" - fi - # @预置条件:检查是否支持NUMA - numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) - if [ "$numa_nodes" = "0" ]; then - skip_test "系统不支持NUMA架构" - fi - # @预置条件:检查NUMA节点数量是否大于1 - if [ "$numa_nodes" -lt 2 ]; then - skip_test "系统NUMA节点数量小于2" - fi - - # @预置条件: 创建一个新的cgroup - cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-001" # 测试迁移 - cgcreate -g cpuset:"cgroup-v1-cpuset-memory_migrate-002" # 测试不迁移 - - # @预置条件: 设置cpuset.cpus和cpuset.mems - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_migrate-001 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_migrate-001 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-memory_migrate-002 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-memory_migrate-002 - - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: 设置memory_migrate控制文件 - cgset -r cpuset.memory_migrate=1 cgroup-v1-cpuset-memory_migrate-001 - cgset -r cpuset.memory_migrate=0 cgroup-v1-cpuset-memory_migrate-002 - - # @测试步骤:2: 启动一个进程并将其放入cgroup - { - while true; do - : - done - } & - task_pid0=$! - echo $task_pid0 >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_migrate-001/tasks - msg "task_pid0: $task_pid0" - { - while true; do - : - done - } & - task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-memory_migrate-002/tasks - msg "task_pid1: $task_pid1" - - # @测试步骤:3: 修改cpuset.mems - cgset -r cpuset.mems=1 cgroup-v1-cpuset-memory_migrate-001 - cgset -r cpuset.mems=1 cgroup-v1-cpuset-memory_migrate-002 - sleep 3 - - # @测试步骤:4: 检查内存页是否迁移,使用numastat命令 - memory_usage_in_numa0=$(numastat -p $task_pid0 | awk 'END{print $2}') - memory_usage_in_numa1=$(numastat -p $task_pid0 | awk 'END{print $3}') - memory_usage_in_numa2=$(numastat -p $task_pid1 | awk 'END{print $2}') - memory_usage_in_numa3=$(numastat -p $task_pid1 | awk 'END{print $3}') - - kill -9 $task_pid0 - kill -9 $task_pid1 - - # @预期结果:1: 001:进程在numa node1上有内存使用,在numa node0没有内存使用 - assert_true [ "$memory_usage_in_numa0" == "0.00" ] && [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] - - # @于其结果:2: 002: 进程在numa_node2上有内存使用,在numa_node3也有内存使用 - assert_true [ "$(echo "$memory_usage_in_numa2 > 0" | bc)" -eq 1 ] && [ "$(echo "$memory_usage_in_numa3 > 0" | bc)" -eq 1 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-memory_migrate-001 - cgdelete -g cpuset:cgroup-v1-cpuset-memory_migrate-002 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" deleted file mode 100755 index 47ae75c..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_pressure.sh" +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240716-232544-101349770 -# @用例名称: cgroup-v1-cpuset-memory_pressure -# @用例级别: 3 -# @用例标签: cgroup-v1 cpuset memory_pressure -# @用例类型: 功能 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - # @预置条件:检查numactl命令是否存在 - if ! is_numactl_installed; then - skip_test "numactl 未安装, 请先安装numactl" - fi - # @预置条件:检查是否支持NUMA - numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) - if [ "$numa_nodes" = "0" ]; then - skip_test "系统不支持NUMA架构" - fi - - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: 启用cpuset.memory_pressure_enabled - cgset -r cpuset.memory_pressure_enabled=1 / - - # @测试步骤:2: 获取numa node0的空闲内存 - # num0_free_size=$(numactl -H | grep "node 0 free" | awk '{print $4}') - num0_free_size=$(free -h | grep "Mem" | awk '{gsub(/i/, ""); print $4}') - msg "num0_free_size: $num0_free_size" - vm_bytes="${num0_free_size}" - - # @测试步骤:3: 模拟内存压力 - { - stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s - - # stress-ng --vm 1 --vm-bytes 3G -t 10s - } & - task_pid=$! - msg "task_pid: $task_pid" - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/tasks - { - stress-ng --vm 1 --vm-bytes "$vm_bytes" -t 10s - # stress-ng --vm 1 --vm-bytes 3G -t 10s - } & - task_pid2=$! - msg "task_pid: $task_pid2" - echo $task_pid2 >"$CGROUP_TOPDIR"/cpuset/tasks - - sleep 15 # 等待内存压力生效 - - memory_pressure=$(cat "$CGROUP_TOPDIR"/cpuset/cpuset.memory_pressure) - msg "memory_pressure: $memory_pressure" - - # @预期结果:1: - assert_true [ "$memory_pressure" -gt "0" ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 恢复cpuset.memory_pressure_enabled默认值 - cgset -r cpuset.memory_pressure_enabled=0 / - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" deleted file mode 100755 index f1f2a4b..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-001.sh" +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240719-213044-128698057 -# @用例名称: cgroup-v1-cpuset-sched_load_balance -# @用例级别: 3 -# @用例标签: cgroup-v1 cpuset sched_load_balance -# @用例类型: 测试不启用sched_load_balance时,cpuset的调度策略 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -TMP_FILE="$(mktemp)" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - - - # @预置条件: 创建一个新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-sched_load_balance-001 - # @预置条件: 设置cpuset.cpus文件 - cgset -r cpuset.cpus=0-1 cgroup-v1-cpuset-sched_load_balance-001 - # @预置条件: 设置cpuset.mems文件 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-sched_load_balance-001 - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 禁用负载平衡 - cgset -r cpuset.sched_load_balance=0 / - cgset -r cpuset.sched_load_balance=0 cgroup-v1-cpuset-sched_load_balance-001 - - # @测试步骤:2: 启动一个进程并将其放入cgroup - taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks - sleep 10 - - # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 - top -b -n 1 1 >"$TMP_FILE" - cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') - cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') - echo "CPU0 user time: $cpu0_user_time" - echo "CPU1 user time: $cpu1_user_time" - - # @预期结果:1: 验证CPU0和CPU1的使用情况 - if [ "$(echo "$cpu0_user_time > 50.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time < 10.0" | bc)" -eq 1 ]; then - assert_true [ true ] - elif [ "$(echo "$cpu0_user_time < 10.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 50.0" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - cgset -r cpuset.sched_load_balance=1 / - cgdelete -g cpuset:cgroup-v1-cpuset-sched_load_balance-001 - rm "$TMP_FILE" - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" deleted file mode 100755 index 5d10b31..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance-002.sh" +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240720-103753-359099985 -# @用例名称: cgroup-v1-cpuset-sched_load_balance-002 -# @用例级别: 3 -# @用例标签: cgroup-v1 cpuset sched_load_balance -# @用例类型: 测试启用sched_load_balance时,cpuset的调度策略 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -TMP_FILE="$(mktemp)" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - - # @预置条件: 创建一个新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-sched_load_balance-002 - # @预置条件: 设置cpuset.cpus文件 - cgset -r cpuset.cpus=0-1 cgroup-v1-cpuset-sched_load_balance-002 - # @预置条件: 设置cpuset.mems文件 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-sched_load_balance-002 - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 启用负载平衡 - cgset -r cpuset.sched_load_balance=1 / - cgset -r cpuset.sched_load_balance=1 cgroup-v1-cpuset-sched_load_balance-001 - - # @测试步骤:2: 启动一个进程并将其放入cgroup - taskset -c 0,1 stress-ng --cpu 2 --timeout 15s & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-sched_load_balance-001/tasks - sleep 10 - - # @测试步骤:3: 通过top获取CPU0和CPU1的使用情况 - top -b -n 1 1 >"$TMP_FILE" - cpu0_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu0 " | sed -n 's/.*%Cpu0 : *\([0-9.]*\) us.*/\1/p') - cpu1_user_time=$(grep '^%Cpu' "$TMP_FILE" | grep "Cpu1 " | sed -n 's/.*%Cpu1 : *\([0-9.]*\) us.*/\1/p') - echo "CPU0 user time: $cpu0_user_time" - echo "CPU1 user time: $cpu1_user_time" - - # @预期结果:1: 验证CPU0和CPU1的使用情况 - if [ "$(echo "$cpu0_user_time > 80.0" | bc)" -eq 1 ] && [ "$(echo "$cpu1_user_time > 80.0" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - cgset -r cpuset.sched_load_balance=1 / - cgdelete -g cpuset:cgroup-v1-cpuset-sched_load_balance-002 - rm "$TMP_FILE" - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" deleted file mode 100755 index defc719..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-001.sh" +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240804-225021-343953847 -# @用例名称: cgroup-v2-cpu-pressure-001 -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu pressure -# @用例类型: 测试cpu.pressure接口文件,读取压力状态 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v2-cpu-pressure-001" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$CGROUP - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then - skip_test "当前cgroup不能启用cpu控制器" - fi - # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 运行两个压力测试并将其运行在一个CPU核心上 - taskset -c 0 stress-ng --cpu 1 --timeout 10 & - task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - taskset -c 0 stress-ng --cpu 1 --timeout 10 & - task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - sleep 5 - - # @测试步骤:2: 读取cpu.pressure文件 - cpu_pressure=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.pressure) - msg "cpu_pressure: " - msg "$cpu_pressure" - avg10=$(echo "$cpu_pressure" | awk 'NR==1 {for(i=1;i<=NF;i++) if ($i ~ /^avg10=/) {split($i, a, "="); print a[2]}}') - msg "avg10: $avg10" - - # @预期结果:1: avg10值应该大于0 - assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" deleted file mode 100755 index 917ada4..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure-002.sh" +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240804-234007-224181376 -# @用例名称: cgroup-v2-cpu-pressure-002 -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu pressure -# @用例类型: 测试cpu.pressure接口文件,注册触发器 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -TMP_FILE=$(mktemp) -CGROUP="cgroup-v2-cpu-pressure-002" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$CGROUP - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/$CGROUP/cgroup.controllers"; then - skip_test "当前cgroup不能启用cpu控制器" - fi - # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 注册触发器 - stdbuf -oL "${TST_TS_TOPDIR}"/tst_lib/cpu_pressure_listener &> "$TMP_FILE" & - - # @测试步骤:2: 运行两个压力测试并将其运行在一个CPU核心上 - taskset -c 0 stress-ng --cpu 1 --timeout 10 & - task_pid1=$! - echo $task_pid1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - taskset -c 0 stress-ng --cpu 1 --timeout 10 & - task_pid2=$! - echo $task_pid2 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - sleep 5 - - # @预期结果:1: 触发器应该被触发 - if grep -q "event triggered" "$TMP_FILE"; then - assert_true [ true ] - else - assert_false [ true ] - fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$CGROUP - # @清理工作: 删除临时文件 - rm "$TMP_FILE" - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" deleted file mode 100755 index 711f98b..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-001.sh" +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240805-132549-636092226 -# @用例名称: cgroup-v2-cpu-uclamp-min-001 -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu uclamp min -# @用例类型: 测试cpu.uclamp.min接口文件,设置了最小利用率 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -PARENT_CGROUP="cgroup-v2-cpu-uclamp-min-001" -CGROUP="cgroup-v2-cpu-uclamp-min-001-pare" -SUB_CGROUP1="cgroup-v2-cpu-uclamp-min-001/sub_cgroup01" -SUB_CGROUP2="cgroup-v2-cpu-uclamp-min-001/sub_cgroup02" -TMP_FILE=$(mktemp) - - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - mkdir "$CGROUP_TOPDIR"/$CGROUP - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then - skip_test "当前cgroup不能启用cpu控制器" - fi - # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 设置sub_cgroup1的cpu.uclamp.min为50% - echo 50 > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cpu.uclamp.min - - # @测试步骤:2: sub_cgroup1运行一个占用CPU1的进程,sub_cgroup2运行两个占用CPU1的进程 - echo $$ > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.procs - taskset 0x1 sh -c 'while true; do :; done' & - - # echo "$task_pid1" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.procs - # echo $$ > "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - # taskset 0x1 sh -c 'while true; do :; done' & - # task_pid2=$! - - # taskset 0x1 sh -c 'while true; do :; done' & - # task_pid2=$! - # echo $task_pid2 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs - # taskset 0x1 sh -c 'while true; do :; done' & - # task_pid3=$! - # echo $task_pid3 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs - # taskset 0x1 sh -c 'while true; do :; done' & - # task_pid4=$! - # echo $task_pid4 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs - - # @测试步骤:3: 使用top命令循环获取task_pid的cpu利用率 - # total_cpu_usage=0 - # for _ in $(seq 1 10); do - # top -b -n 1 -p $task_pid1 > "$TMP_FILE" - # cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') - # msg "CPU usage: $cpu_usage" - # total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) - # sleep 1 - # done - # aver_cpu_usage=$(echo "scale=2; $total_cpu_usage / 10" | bc) - # msg "average CPU usage: $aver_cpu_usage" - - # @预期结果:1: 在误差范围内,task_pid1的cpu利用率为50% - # kill -9 $task_pid1 - # sleep 3 - # aver_cpu_usage_max=55 - # aver_cpu_usage_min=45 - # if [ "$(echo "$aver_cpu_usage >= $aver_cpu_usage_min" | bc)" -eq 1 ] && [ "$(echo "$aver_cpu_usage <= $aver_cpu_usage_max" | bc)" -eq 1 ]; then - # assert_true [ true ] - # else - # assert_false [ true ] - # fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - rmdir "$CGROUP_TOPDIR"/$CGROUP - # @清理工作: 删除临时文件 - rm "$TMP_FILE" - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" deleted file mode 100755 index d5efa5d..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-uclamp-min-002.sh" +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240805-205424-093934808 -# @用例名称: cgroup-v2-cpu-uclamp-min-002 -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu uclamp min -# @用例类型: 测试cpu.uclamp.min接口文件,不设置最小利用率 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -PARENT_CGROUP="cgroup-v2-cpu-uclamp-min-002" -SUB_CGROUP1="cgroup-v2-cpu-uclamp-min-002/sub_cgroup01" -SUB_CGROUP2="cgroup-v2-cpu-uclamp-min-002/sub_cgroup02" -TMP_FILE=$(mktemp) - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - mkdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then - skip_test "当前cgroup不能启用cpu控制器" - fi - # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+cpu" > "$CGROUP_TOPDIR"/$PARENT_CGROUP/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: sub_cgroup1运行一个占用CPU1的进程,sub_cgroup2运行两个占用CPU1的进程 - taskset 0x1 sh -c 'while true; do :; done' & - task_pid1=$! - echo "$task_pid1" > "$CGROUP_TOPDIR"/$SUB_CGROUP1/cgroup.procs - - taskset 0x1 sh -c 'while true; do :; done' & - task_pid2=$! - echo $task_pid2 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs - taskset 0x1 sh -c 'while true; do :; done' & - task_pid3=$! - echo $task_pid3 > "$CGROUP_TOPDIR"/$SUB_CGROUP2/cgroup.procs - - # @测试步骤:2: 使用top命令循环获取task_pid的cpu利用率 - total_cpu_usage=0 - for _ in $(seq 1 10); do - top -b -n 1 -p $task_pid1 > "$TMP_FILE" - cpu_usage=$(grep -A 1 "%CPU" "$TMP_FILE" | tail -n 1 | awk '{print $9}') - msg "CPU usage: $cpu_usage" - total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage" | bc) - sleep 1 - done - aver_cpu_usage=$(echo "scale=2; $total_cpu_usage / 10" | bc) - msg "average CPU usage: $aver_cpu_usage" - - # @预期结果:1: 在误差范围内,task_pid1的cpu利用率为50% - kill -9 $task_pid1 $task_pid2 $task_pid3 - # aver_cpu_usage_max=55 - # aver_cpu_usage_min=45 - # if [ "$(echo "$aver_cpu_usage >= $aver_cpu_usage_min" | bc)" -eq 1 ] && [ "$(echo "$aver_cpu_usage <= $aver_cpu_usage_max" | bc)" -eq 1 ]; then - # assert_true [ true ] - # else - # assert_false [ true ] - # fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP1 - rmdir "$CGROUP_TOPDIR"/$SUB_CGROUP2 - rmdir "$CGROUP_TOPDIR"/$PARENT_CGROUP - # @清理工作: 删除临时文件 - rm "$TMP_FILE" - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" deleted file mode 100755 index 6d46c6d..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-low.sh" +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240806-175358-337059818 -# @用例名称: cgroup-v2-memory-low -# @用例级别: 3 -# @用例标签: cgroup-v2 memory low -# @用例类型: 测试memoruy.low接口文件,设置保护措施 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v2-memory-low" -PARENT1="$CGROUP/parent1" -PARENT2="$CGROUP/parent2" -CHILD0="$PARENT1/child0" -CHILD1="$PARENT1/child1" -CHILD2="$PARENT1/child2" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$CGROUP - mkdir "$CGROUP_TOPDIR"/$PARENT1 - mkdir "$CGROUP_TOPDIR"/$PARENT2 - mkdir "$CGROUP_TOPDIR"/$CHILD0 - mkdir "$CGROUP_TOPDIR"/$CHILD1 - mkdir "$CGROUP_TOPDIR"/$CHILD2 - # @预置条件: 检查当前cgroup是否能启用memory控制器 - if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then - skip_test "当前cgroup不能启用memory控制器" - fi - # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+memory" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 - echo "+memory" > "$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 关闭系统上的所有交换空间 - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max - - # @测试步骤:2: 设置memory.max和memory.low - echo 200M > "$CGROUP_TOPDIR"/$CGROUP/memory.max - echo 50M > "$CGROUP_TOPDIR"/$PARENT1/memory.low - echo 75M > "$CGROUP_TOPDIR"/$CHILD0/memory.low - echo 25M > "$CGROUP_TOPDIR"/$CHILD1/memory.low - echo 0M > "$CGROUP_TOPDIR"/$CHILD2/memory.low - - # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 - echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - sleep 1 # 确保子进程已经分配内存 - - # @测试步骤:4: 给PARENT2分配146MB内存 - echo $$ > "$CGROUP_TOPDIR"/$PARENT2/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 146M & - sleep 1 - - # @测试步骤:5: 检查内存使用情况 - parent1_memory=0 - chidl0_memory=0 - chidl1_memory=0 - chidl2_memory=0 - parent2_memory=0 - for _ in $(seq 1 8); do - memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD0/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - chidl0_memory=$(echo "$memory_current + $chidl0_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD1/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - chidl1_memory=$(echo "$memory_current + $chidl1_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD2/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - chidl2_memory=$(echo "$memory_current + $chidl2_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) - sleep 1 - done - aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) - aver_chidl0_memory=$(echo "$chidl0_memory / 8" | bc) - aver_chidl1_memory=$(echo "$chidl1_memory / 8" | bc) - aver_chidl2_memory=$(echo "$chidl2_memory / 8" | bc) - aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) - msg "parent1 memory average: $aver_parent1_memory" - msg "child0 memory average: $aver_chidl0_memory" - msg "child1 memory average: $aver_chidl1_memory" - msg "child2 memory average: $aver_chidl2_memory" - msg "parent2 memory average: $aver_parent2_memory" - - sleep 3 - echo $$ >"$CGROUP_TOPDIR"/cgroup.procs - - # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和小于等于50MB - assert_true [ "$aver_parent1_memory" -le 50 ] - - # @预期结果:2: 在误差允许范围内,CHILD0分配的内存小于等于25MB, CHILD1分配的内存小于等于25MB, CHILD2分配的内存小于等于0MB - assert_true [ "$aver_chidl0_memory" -le 25 ] - assert_true [ "$aver_chidl1_memory" -le 25 ] - assert_true [ "$aver_chidl2_memory" -le 0 ] - - # @预期结果:3: 在误差允许范围内,PARENT2分配的内存等于150MB - parent2_memory_max=160 - parent2_memory_min=140 - if [ "$aver_parent2_memory" -gt "$parent2_memory_min" ]; then - assert_true [ "$aver_parent2_memory" -lt "$parent2_memory_max" ] - else - asset_false [ true ] - fi - - # @预期结果:4: 检查memory.low事件次数大于0 - low_cnt=$(grep "low" "$CGROUP_TOPDIR"/$PARENT1/memory.events | awk '{print $2}') - msg "low cnt: $low_cnt" - assert_true [ "$low_cnt" -gt 0 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$CHILD0 - rmdir "$CGROUP_TOPDIR"/$CHILD1 - rmdir "$CGROUP_TOPDIR"/$CHILD2 - rmdir "$CGROUP_TOPDIR"/$PARENT1 - rmdir "$CGROUP_TOPDIR"/$PARENT2 - rmdir "$CGROUP_TOPDIR"/$CGROUP - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" deleted file mode 100755 index ba4c24d..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-001.sh" +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240805-225552-969242515 -# @用例名称: cgroup-v2-memory-max-001 -# @用例级别: 3 -# @用例标签: -# @用例类型: 功能 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -############################################################################### - -g_tmpdir="$(mktemp -d)" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: - # @预置条件: - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: - - # @测试步骤:2: - - # @测试步骤:3: - # @预期结果:3: - assert_true [ 1 -eq 1 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - rm -rfv "$g_tmpdir" || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" deleted file mode 100755 index 3c085a9..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max-002.sh" +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240805-225554-315839228 -# @用例名称: cgroup-v2-memory-max-002 -# @用例级别: 3 -# @用例标签: -# @用例类型: 功能 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -############################################################################### - -g_tmpdir="$(mktemp -d)" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: - # @预置条件: - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: - - # @测试步骤:2: - - # @测试步骤:3: - # @预期结果:3: - assert_true [ 1 -eq 1 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - rm -rfv "$g_tmpdir" || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" deleted file mode 100755 index 0362ae2..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-min.sh" +++ /dev/null @@ -1,160 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240806-100136-390417533 -# @用例名称: cgroup-v2-memory-min -# @用例级别: 3 -# @用例标签: cgroup-v2 memory min -# @用例类型: 测试memoruy.min接口文件,设置了保护措施 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v2-memory-min" -PARENT1="$CGROUP/parent1" -PARENT2="$CGROUP/parent2" -CHILD0="$PARENT1/child0" -CHILD1="$PARENT1/child1" -CHILD2="$PARENT1/child2" - - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$CGROUP - mkdir "$CGROUP_TOPDIR"/$PARENT1 - mkdir "$CGROUP_TOPDIR"/$PARENT2 - mkdir "$CGROUP_TOPDIR"/$CHILD0 - mkdir "$CGROUP_TOPDIR"/$CHILD1 - mkdir "$CGROUP_TOPDIR"/$CHILD2 - # @预置条件: 检查当前cgroup是否能启用memory控制器 - if ! check_string_in_file "memory" "$CGROUP_TOPDIR/cgroup.controllers"; then - skip_test "当前cgroup不能启用memory控制器" - fi - # @预置条件: 启用memory控制器 - echo "+memory" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - echo "+memory" > "$CGROUP_TOPDIR"/$CGROUP/cgroup.subtree_control || return 1 - echo "+memory" > "$CGROUP_TOPDIR"/$PARENT1/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 关闭系统上的所有交换空间 - echo 0 > "$CGROUP_TOPDIR"/$CGROUP/memory.swap.max - - # @测试步骤:2: 设置memory.max和memory.min - echo 200M > "$CGROUP_TOPDIR"/$CGROUP/memory.max - echo 50M > "$CGROUP_TOPDIR"/$PARENT1/memory.min - echo 75M > "$CGROUP_TOPDIR"/$CHILD0/memory.min - echo 25M > "$CGROUP_TOPDIR"/$CHILD1/memory.min - echo 0M > "$CGROUP_TOPDIR"/$CHILD2/memory.min - - # @测试步骤:3: 给PARENT1的三个子cgroup分配50MB内存 - echo $$ >"$CGROUP_TOPDIR"/$CHILD0/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - echo $$ >"$CGROUP_TOPDIR"/$CHILD1/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - echo $$ >"$CGROUP_TOPDIR"/$CHILD2/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_pagecache 50M & - sleep 1 # 确保子进程已经分配内存 - - # @测试步骤:4: 给PARENT2分配150MB内存 - echo $$ > "$CGROUP_TOPDIR"/$PARENT2/cgroup.procs - "$TST_TS_TOPDIR"/tst_lib/cgroup_util/bin/alloc_anon 146M & - sleep 1 - - # @测试步骤:5: 检查内存使用情况 - parent1_memory=0 - chidl0_memory=0 - chidl1_memory=0 - chidl2_memory=0 - parent2_memory=0 - for _ in $(seq 1 8); do - memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT1/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - parent1_memory=$(echo "$memory_current + $parent1_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD0/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - chidl0_memory=$(echo "$memory_current + $chidl0_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD1/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - chidl1_memory=$(echo "$memory_current + $chidl1_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$CHILD2/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - chidl2_memory=$(echo "$memory_current + $chidl2_memory" | bc) - - memory_current=$(cat "$CGROUP_TOPDIR"/$PARENT2/memory.current) - memory_current=$(echo "$memory_current / 1024 / 1024" | bc) - parent2_memory=$(echo "$memory_current + $parent2_memory" | bc) - sleep 1 - done - aver_parent1_memory=$(echo "$parent1_memory / 8" | bc) - aver_chidl0_memory=$(echo "$chidl0_memory / 8" | bc) - aver_chidl1_memory=$(echo "$chidl1_memory / 8" | bc) - aver_chidl2_memory=$(echo "$chidl2_memory / 8" | bc) - aver_parent2_memory=$(echo "$parent2_memory / 8" | bc) - msg "parent1 memory average: $aver_parent1_memory" - msg "child0 memory average: $aver_chidl0_memory" - msg "child1 memory average: $aver_chidl1_memory" - msg "child2 memory average: $aver_chidl2_memory" - msg "parent2 memory average: $aver_parent2_memory" - - sleep 3 - echo $$ >"$CGROUP_TOPDIR"/cgroup.procs - - # @预期结果:1: 在误差允许范围内,PARENT1的三个子cgroup分配的内存总和小于等于50MB - assert_true [ "$aver_parent1_memory" -le 50 ] - - # @预期结果:2: 在误差允许范围内,CHILD0分配的内存小于等于25MB, CHILD1分配的内存小于等于25MB, CHILD2分配的内存小于等于0MB - assert_true [ "$aver_chidl0_memory" -le 25 ] - assert_true [ "$aver_chidl1_memory" -le 25 ] - assert_true [ "$aver_chidl2_memory" -le 0 ] - - # @预期结果:3: 在误差允许范围内,PARENT2分配的内存等于150MB - parent2_memory_max=160 - parent2_memory_min=140 - if [ "$aver_parent2_memory" -gt "$parent2_memory_min" ]; then - assert_true [ "$aver_parent2_memory" -lt "$parent2_memory_max" ] - else - asset_false [ true ] - fi - - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - rmdir "$CGROUP_TOPDIR"/$CHILD0 - rmdir "$CGROUP_TOPDIR"/$CHILD1 - rmdir "$CGROUP_TOPDIR"/$CHILD2 - rmdir "$CGROUP_TOPDIR"/$PARENT1 - rmdir "$CGROUP_TOPDIR"/$PARENT2 - rmdir "$CGROUP_TOPDIR"/$CGROUP - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### -- Gitee From 02f9ea9f524f2bfc35e42f113eb2c5f30f3b3a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 22:11:02 +0800 Subject: [PATCH 33/37] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" | 87 ------------- .../cgroup-v1-cpuset-mem_hardwall.sh" | 119 ------------------ ...roup-v1-memory-soft_limit_in_bytes-001.sh" | 87 ------------- .../testcase/cgroup-v2-cpu-max-001.sh" | 86 ------------- .../testcase/cgroup-v2-cpu-max-002.sh" | 84 ------------- 5 files changed, 463 deletions(-) delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" delete mode 100755 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" deleted file mode 100755 index 4bebaf5..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs.sh" +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240711-115955-308386734 -# @用例名称: cgroup-v1-cpu-cfs -# @用例级别: 3 -# @用例标签: cgroup-v1 cpu cfs -# @用例类型: 测试cpu是否能按CPU使用周期时间分配CPU时间 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_T - OPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v1-cpu-cfs" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - # @预置条件: 创建一个新的cgroup - cgcreate -g cpu:/"${CGROUP}" || return 1 - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤:1: 设置cpu.cfs_period_us和cpu.cfs_quota_us - echo 500000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_period_us - echo 400000 >"$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.cfs_quota_us - - # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup - { - while true; do :; done - } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpu/$CGROUP/tasks - - sleep 3 - - # @测试步骤:3: 读取cpu.stat文件 - cpu_stat=$(cat "$CGROUP_TOPDIR"/cpu/"${CGROUP}"/cpu.stat) - msg "cpu_stat: " - msg "$cpu_stat" - - # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_time均不为零 - nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') - nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') - throttled_time=$(echo "$cpu_stat" | grep throttled_time | awk '{print $2}') - - msg "nr_periods: $nr_periods" - msg "nr_throttled: $nr_throttled" - msg "throttled_time: $throttled_time" - - kill -9 $task_pid - - if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then - assert_true [ "$throttled_time" -gt 0 ] - else - assert_false [ true ] - fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" deleted file mode 100755 index fc4b2f9..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mem_hardwall.sh" +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240716-194110-374464054 -# @用例名称: cgroup-v1-cpuset-mem_hardwall -# @用例级别: 3 -# @用例标签: cgroup-v cpuset mem_hardwall -# @用例类型: 测试cpuset.mem_hardwall -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - # @预置条件:检查numactl命令是否存在 - if ! is_numactl_installed; then - skip_test "numactl 未安装, 请先安装numactl" - fi - # @预置条件:检查是否支持NUMA - numa_nodes=$(numactl -H | grep "available" | cut -d' ' -f2) - if [ "$numa_nodes" = "0" ]; then - skip_test "系统不支持NUMA架构" - fi - # @预置条件:检查NUMA节点数量是否大于1 - if [ "$numa_nodes" -lt 2 ]; then - skip_test "系统NUMA节点数量小于2" - fi - - # @预置条件: 创建两个新的cgroup - cgcreate -g cpuset:cgroup-v1-cpuset-mem_hardwall - # @预置条件: 设置cpuset.cpus文件 - cgset -r cpuset.cpus=0 cgroup-v1-cpuset-mem_hardwall - # @预置条件: 设置cpuset.mems文件 - cgset -r cpuset.mems=0 cgroup-v1-cpuset-mem_hardwall - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 开启mem_hardwall - cgset -r cpuset.mem_hardwall=1 cgroup-v1-cpuset-mem_hardwall || return 1 - - # @测试步骤:2: 获取numa node0和numa node1的空闲内存 - num0_before_free_size=$(numactl -H | grep "node 0 free" | awk '{print $4}') - num1_before_free_size=$(numactl -H | grep "node 1 free" | awk '{print $4}') - msg "num0_before_free_size: $num0_before_free_size" - msg "num1_before_free_size: $num1_before_free_size" - - # @测试步骤:3: 根据获取的numa node0空闲内存运行一个需要大量内存的测试程序,如果空闲内存小于100MB,提示用户numa node0空闲内存不足,不能进行此测试 - if [ "$num0_before_free_size" -lt "100" ]; then - msg "numa node0空闲内存不足100MB, 不能进行cgroup-v1-cpuset-mem_hardwall测试" - exit 1 - fi - - # @测试步骤:4:运行测试程序 - tmp=$((num0_before_free_size / 2)) - vm_bytes="${tmp}M" - { - stress-ng --vm 1 --vm-bytes $vm_bytes --vm-keep -t 5s - } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/cpuset/cgroup-v1-cpuset-mem_hardwall/tasks - - # @测试步骤:5: 不断检查numa节点的空闲内存并更新最小的空闲内存 - num0_min_free_size=$num0_before_free_size - num1_min_free_size=$num1_before_free_size - while kill -0 $task_pid 2>/dev/null; do - num0_current_free_size=$(numactl -H | grep "node 0 free" | awk '{print $4}') - num1_current_free_size=$(numactl -H | grep "node 1 free" | awk '{print $4}') - - # 更新最小空闲内存值 - if [ "$num0_current_free_size" -lt "$num0_min_free_size" ]; then - num0_min_free_size=$num0_current_free_size - fi - if [ "$num1_current_free_size" -lt "$num1_min_free_size" ]; then - num1_min_free_size=$num1_current_free_size - fi - - sleep 1 - done - - msg "num0_min_free_size: $num0_min_free_size" - msg "num1_min_free_size: $num1_min_free_size" - - # @预期结果:1: 考虑到误差,numa node0被分配的内存至少要大于vm_bytes/2,而numa node1被分配的内存不能超过25MB - num0_diff=$(echo "$num0_before_free_size-$num0_min_free_size" | bc) - num0_expected=$(echo "$tmp * 4 / 5" | bc) - num1_diff=$(echo "$num1_before_free_size-$num1_min_free_size" | bc) - num1_expected=$(echo "25" | bc) - msg "num0_diff: $num0_diff" - msg "num1_diff: $num1_diff" - assert_true [ "$num0_diff" -gt "$num0_expected" ] && [ "$num1_diff" -lt "$num1_expected" ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - cgdelete -g cpuset:cgroup-v1-cpuset-mem_hardwall - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" deleted file mode 100755 index ce2d139..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes-001.sh" +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240723-133429-048617311 -# @用例名称: cgroup-v1-memory-soft_limit_in_bytes-001 -# @用例级别: 2 -# @用例标签: cgroup-v1 memory soft_limit_in_bytes -# @用例类型: 测试memory.soft_limit_in_bytes控制文件,设置限制 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v1-memory-soft_limit_in_bytes-001" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v1 - if ! check_cgroup_version_is_v1; then - skip_test "cgroup版本不是v1" - fi - # @预置条件: 检查是否开启了CONFIG_MEMCG配置 - if ! grep -q CONFIG_MEMCG=y /boot/config-"$(uname -r)"; then - skip_test "内核CONFIG_MEMCG配置未开启" - fi - # @预置条件: 检查是否没有CONFIG_PREEMPT_RT配置 - if grep -q CONFIG_PREEMPT_RT=y /boot/config-"$(uname -r)"; then - skip_test "内核CONFIG_PREEMPT_RT配置开启" - fi - - # @预置条件: 创建一个cgroup - cgcreate -g memory:$CGROUP - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 关闭系统上的所有交换空间并设置cgroup的内存限制为50M - swapoff -a - cgset -r memory.soft_limit_in_bytes=50M $CGROUP - - # @测试步骤:2: 使用stress-ng运行一个分配100M内存的进程 - echo $$ >"$CGROUP_TOPDIR"/memory/$CGROUP/cgroup.procs - stress-ng --vm 1 --vm-bytes 100M --vm-keep -t 5s - - # @测试步骤:3: 获取cgroup的最大内存使用量 - max_usage_in_bytes=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.max_usage_in_bytes) - msg "max_usage_in_bytes: $max_usage_in_bytes" - - # @测试步骤:4: 获取该cgroup被oom killer杀死的进程数 - oom_control=$(cat "$CGROUP_TOPDIR"/memory/$CGROUP/memory.oom_control) - oom_kill=$(echo "$oom_control" | awk 'NR==3 {print $2}') - msg "oom_kill: $oom_kill" - - # @预期结果:1: 最大内存使用量超过了50M且oom_kill等于0 - if [ "$max_usage_in_bytes" -gt "52428800" ]; then - assert_true [ "$oom_kill" -eq "0" ] - else - assert_false [ true ] - fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 开启系统的交换空间 - swapon -a - # @清理工作: 清空所有内存页 - cgset -r memory.force_empty=0 $CGROUP - # @清理工作: 删除cgroup - cgdelete -g memory:$CGROUP - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" deleted file mode 100755 index b4d3b4b..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-001.sh" +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240804-180942-698874070 -# @用例名称: cgroup-v2-cpu-max-001 -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu max -# @用例类型: 测试cpu.max接口文件,设置限制 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v2-cpu-max-001" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$CGROUP - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then - skip_test "当前cgroup不能启用cpu控制器" - fi - # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 设置cpu.max值 - echo "500000 1000000" >"$CGROUP_TOPDIR"/$CGROUP/cpu.max - - # @测试步骤:2: 启动一个占用CPU的进程,并将其放入cgroup - { - while true; do :; done - } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - - sleep 3 - - # @测试步骤:3: 读取cpu.stat文件 - cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) - msg "cpu_stat: " - msg "$cpu_stat" - nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') - nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') - throttled_usec=$(echo "$cpu_stat" | grep throttled_usec | awk '{print $2}') - kill -9 $task_pid - - # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_usec均不为零 - if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then - assert_true [ "$throttled_usec" -gt 0 ] - else - assert_false [ true ] - fi - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" deleted file mode 100755 index dbe1c32..0000000 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-002.sh" +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20240804-223009-206912194 -# @用例名称: cgroup-v2-cpu-max-002 -# @用例级别: 3 -# @用例标签: cgroup-v2 cpu max -# @用例类型: 测试cpu.max接口文件,不设置限制 -############################################################################### -[ -z "$TST_TS_TOPDIR" ] && { - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - export TST_TS_TOPDIR -} -[ -z "$CGROUP_TOPDIR" ] && { - CGROUP_TOPDIR="/sys/fs/cgroup" - export CGROUP_TOPDIR -} -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1 -# shellcheck source=/dev/null -source "${TST_TS_TOPDIR}/tst_lib/other_common.sh" || exit 1 -############################################################################### - -CGROUP="cgroup-v2-cpu-max-002" - -tc_setup() { - msg "this is tc_setup" - # @预置条件: 检查cgroup版本是否为cgroup v2 - if ! check_cgroup_version_is_v2; then - skip_test "cgroup版本不是v2" - fi - - # @预置条件: 创建cgroup - mkdir "$CGROUP_TOPDIR"/$CGROUP - # @预置条件: 检查当前cgroup是否能启用cpu控制器 - if ! check_string_in_file "cpu" "$CGROUP_TOPDIR/cgroup.controllers"; then - skip_test "当前cgroup不能启用cpu控制器" - fi - # @预置条件: 启用cpu控制器 - echo "+cpu" > "$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 - - return 0 -} - -do_test() { - msg "this is do_test" - # @测试步骤:1: 启动一个占用CPU的进程,并将其放入cgroup - { - while true; do :; done - } & - task_pid=$! - echo $task_pid >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - - sleep 3 - - # @测试步骤:2: 读取cpu.stat文件 - cpu_stat=$(cat "$CGROUP_TOPDIR"/$CGROUP/cpu.stat) - msg "cpu_stat: " - msg "$cpu_stat" - nr_periods=$(echo "$cpu_stat" | grep nr_periods | awk '{print $2}') - nr_throttled=$(echo "$cpu_stat" | grep nr_throttled | awk '{print $2}') - throttled_usec=$(echo "$cpu_stat" | grep throttled_usec | awk '{print $2}') - kill -9 $task_pid - - # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_usec均等于零 - if [ "$nr_periods" -eq 0 ] && [ "$nr_throttled" -eq 0 ]; then - assert_true [ "$throttled_usec" -eq 0 ] - else - assert_false [ true ] - fi - - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - # @清理工作: 删除cgroup - cgdelete -g cpu:/$CGROUP || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### -- Gitee From e9baa2418c1cbbead3fabc931770133f0fb38003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Wed, 14 Aug 2024 23:03:16 +0800 Subject: [PATCH 34/37] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../image-20240814222204119.png" | Bin 0 -> 4300 bytes .../image-20240814222221561.png" | Bin 0 -> 4450 bytes .../image-20240814225750443.png" | Bin 0 -> 2427 bytes .../image-20240814225759870.png" | Bin 0 -> 3930 bytes ...5\213\350\257\225\346\212\245\345\221\212.md" | 6 ++++-- 5 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814222204119.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814222221561.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814225750443.png" create mode 100644 "\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814225759870.png" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814222204119.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814222204119.png" new file mode 100644 index 0000000000000000000000000000000000000000..07609ec5bcb6829635b8bfdfb42d7b4d0cc22785 GIT binary patch literal 4300 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814222221561.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814222221561.png" new file mode 100644 index 0000000000000000000000000000000000000000..68f4010b56df2ad60ce0bf6bd1a3fe775cff7d72 GIT binary patch literal 4450 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814225750443.png" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.assets/image-20240814225750443.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad518c15e9a2fd690b9fe3df6d46f6cb7ed0d795 GIT binary patch literal 2427 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 literal 0 HcmV?d00001 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" index e2f31db..bedd836 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" @@ -895,14 +895,16 @@ cgroup-v2-kill-001/002测试用例失败原因是不存在cgroup.kill这个接 本地qemu: ![image-20240814154750773](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814154750773.png) - - +![image-20240814222204119](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814222204119.png) +![image-20240814222221561](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814222221561.png) **OpenCloudOS Stream 23:** 本地qemu: ![image-20240814184416348](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814184416348.png) +![image-20240814225750443](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814225750443.png) +![image-20240814225759870](%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.assets/image-20240814225759870.png) ## 控制器接口文件 -- Gitee From 157abb0a3181f65e28b84b3b7752a65ad71e3456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 15 Aug 2024 20:43:53 +0800 Subject: [PATCH 35/37] =?UTF-8?q?=E6=8C=89=E8=A6=81=E6=B1=82=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tst-cgroup/.gitignore" | 3 +-- .../testcase/cgroup-v1-blkio-bfq-weight.sh" | 13 ++++------ .../cgroup-v1-blkio-bfq-weight_device.sh" | 26 +++++++++---------- ...roup-v1-blkio-throttle-read_bps_device.sh" | 20 +++++++------- ...oup-v1-blkio-throttle-read_iops_device.sh" | 18 ++++++------- ...oup-v1-blkio-throttle-write_bps_device.sh" | 21 +++++++-------- ...up-v1-blkio-throttle-write_iops_device.sh" | 18 ++++++------- .../testcase/cgroup-v1-cpu-cfs-001.sh" | 8 +++--- .../testcase/cgroup-v1-cpu-cfs-002.sh" | 10 +++---- .../testcase/cgroup-v1-cpuacct-stat.sh" | 8 +++--- .../testcase/cgroup-v1-cpuacct-usage.sh" | 7 +++-- .../cgroup-v1-cpuset-memory_migrate-001.sh" | 6 ++--- .../cgroup-v1-cpuset-memory_migrate-002.sh" | 3 ++- ...group-v1-cpuset-memory_spread_page-001.sh" | 8 +++--- ...group-v1-cpuset-memory_spread_page-002.sh" | 14 +++------- .../testcase/cgroup-v1-cpuset-mems.sh" | 8 +----- .../cgroup-v1-cpuset-sched_load_balance.sh" | 7 ++--- .../testcase/cgroup-v1-devices-001.sh" | 12 ++------- .../testcase/cgroup-v1-devices-002.sh" | 13 +++------- .../testcase/cgroup-v1-freezer-001.sh" | 21 +++------------ .../cgroup-v1-hugetlb-limit_in_bytes-001.sh" | 7 ++--- .../cgroup-v1-hugetlb-limit_in_bytes-002.sh" | 7 ++--- .../cgroup-v1-hugetlb-limit_in_bytes-003.sh" | 7 ++--- .../cgroup-v1-hugetlb-limit_in_bytes-004.sh" | 8 +++--- ...oup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" | 6 +---- ...oup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" | 7 ++--- ...oup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" | 6 +---- ...oup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" | 7 ++--- .../cgroup-v1-memory-limit_in_bytes.sh" | 14 +++------- .../cgroup-v1-memory-memsw-limit_in_bytes.sh" | 10 +++---- .../cgroup-v1-memory-pressure_level.sh" | 6 +---- .../cgroup-v1-memory-soft_limit_in_bytes.sh" | 7 ++--- .../testcase/cgroup-v1-net_cls-001.sh" | 3 ++- .../testcase/cgroup-v1-perf_event.sh" | 8 +++--- .../testcase/cgroup-v1-pids-001.sh" | 2 +- .../testcase/cgroup-v1-pids-002.sh" | 7 ++--- .../testcase/cgroup-v1-pids-003.sh" | 2 +- .../testcase/cgroup-v2-cpu-pressure.sh" | 8 +++--- .../testcase/cgroup-v2-io-max-001.sh" | 13 +++++----- .../testcase/cgroup-v2-io-max-002.sh" | 13 +++++----- .../testcase/cgroup-v2-io-max-003.sh" | 11 ++++---- .../testcase/cgroup-v2-io-max-004.sh" | 11 ++++---- .../testcase/cgroup-v2-io-pressure.sh" | 17 ++++++------ .../testcase/cgroup-v2-io-weight.sh" | 21 ++++++++------- .../testcase/cgroup-v2-memory-high-001.sh" | 12 +++++---- .../testcase/cgroup-v2-memory-max.sh" | 13 +++++----- .../testcase/cgroup-v2-memory-oom-events.sh" | 11 ++++---- .../cgroup-v2-memory-oom-group-001.sh" | 12 +++++---- .../cgroup-v2-memory-oom-group-002.sh" | 22 +++++++++------- .../cgroup-v2-memory-oom-group-003.sh" | 6 ++--- .../testcase/cgroup-v2-memory-pressure.sh" | 7 +++-- .../testcase/cgroup-v2-memory-swap-high.sh" | 11 ++++---- .../testcase/cgroup-v2-memory-swap-max.sh" | 12 ++++----- .../testcase/cgroup-v2-memory-zswap.sh" | 3 ++- .../testcase/cgroup-v2-pids-max-001.sh" | 2 +- ...13\350\257\225\346\212\245\345\221\212.md" | 4 --- 56 files changed, 232 insertions(+), 335 deletions(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" index 6579f69..8300e42 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/.gitignore" @@ -12,5 +12,4 @@ __pycache__/ Module.symvers modules.order compile_commands.json -tst_lib/cgroup_util/bin/* - +tst_lib/cgroup_util/bin/* \ No newline at end of file diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" index 0c7ecce..90d5cad 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight.sh" @@ -93,19 +93,16 @@ do_test() { msg "io serviced 2: $(cat "$CGROUP_TOPDIR"/blkio/$CHILD2/blkio.throttle.io_serviced)" # @测试步骤:5: 获取dd进程的读取速度 - read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) - read_speed2=$(grep -oP '\d+.\d+' "$TMP_FILE1" | tail -n 1) - read_speed3=$(grep -oP '\d+.\d+' "$TMP_FILE2" | tail -n 1) + read_speed1=$(grep 'copied' "$TMP_FILE0" | awk '{print $10}') + read_speed2=$(grep 'copied' "$TMP_FILE1" | awk '{print $10}') + read_speed3=$(grep 'copied' "$TMP_FILE2" | awk '{print $10}') msg "read_speed1: $read_speed1" msg "read_speed2: $read_speed2" msg "read_speed3: $read_speed3" # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 - if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" index e55ce7e..a97956b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-bfq-weight_device.sh" @@ -58,12 +58,13 @@ do_test() { if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" disk="sda" - disk_device="8:0" else msg "disk is /dev/vda" disk="vda" - disk_device="253:0" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:3: 保存当前调度器设置 original_scheduler=$(grep -oP '\[\K[^\]]+' /sys/block/$disk/queue/scheduler) @@ -73,9 +74,9 @@ do_test() { echo bfq >/sys/block/$disk/queue/scheduler # @测试步骤:5: 设置CHILD0\CHILD1\CHILD2的blkio.bfq.weight_device - echo "$disk_device 100" >"$CGROUP_TOPDIR"/blkio/$CHILD0/blkio.bfq.weight_device - echo "$disk_device 200" >"$CGROUP_TOPDIR"/blkio/$CHILD1/blkio.bfq.weight_device - echo "$disk_device 300" >"$CGROUP_TOPDIR"/blkio/$CHILD2/blkio.bfq.weight_device + echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/$CHILD0/blkio.bfq.weight_device + echo "$device_number 200" >"$CGROUP_TOPDIR"/blkio/$CHILD1/blkio.bfq.weight_device + echo "$device_number 300" >"$CGROUP_TOPDIR"/blkio/$CHILD2/blkio.bfq.weight_device # @测试步骤:6: 启动dd进程 sync @@ -90,19 +91,16 @@ do_test() { wait $task_pid0 # @测试步骤:7: 获取dd进程的读取速度 - read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) - read_speed2=$(grep -oP '\d+.\d+' "$TMP_FILE1" | tail -n 1) - read_speed3=$(grep -oP '\d+.\d+' "$TMP_FILE2" | tail -n 1) + read_speed1=$(grep 'copied' "$TMP_FILE0" | awk '{print $10}') + read_speed2=$(grep 'copied' "$TMP_FILE1" | awk '{print $10}') + read_speed3=$(grep 'copied' "$TMP_FILE2" | awk '{print $10}') msg "read_speed1: $read_speed1" msg "read_speed2: $read_speed2" msg "read_speed3: $read_speed3" - # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 - if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 + assert_true [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" index 35bfcd4..72dd8a4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_bps_device.sh" @@ -52,33 +52,31 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置blkio.throttle.read_bps_device,限制速度为1MB/s echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.read_bps_device # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs - dd iflag=direct if=$disk of=/dev/null bs=1M count=3 2>&1 | tee "$TMP_FILE" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=3 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 - read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') + read_bps=$(grep 'copied' "$TMP_FILE" | awk '{print $10}') msg "read_bps: $read_bps" up_read_bps=1.2 down_read_bps=0.8 # @预期结果:1: 如果读取速率在1MB/s左右,说明限速成功 - if [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ] && [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" index 8ec469f..64f63f1 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-read_iops_device.sh" @@ -52,20 +52,21 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置blkio.throttle.read_iops_device,限制速度为100 IO/s echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.read_iops_device # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs - dd iflag=direct if=$disk of=/dev/null bs=4k count=300 2>&1 | tee "$TMP_FILE" + dd iflag=direct if=/dev/$disk of=/dev/null bs=4k count=300 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" @@ -77,11 +78,8 @@ do_test() { down_read_iops=90 # @预期结果:1: 如果读取速率在100 IO/s左右,说明限速成功 - if [ "$(echo "$read_iops_per_second > $down_read_iops" | bc)" -eq 1 ] && [ "$(echo "$read_iops_per_second < $up_read_iops" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$read_iops_per_second > $down_read_iops" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_iops_per_second < $up_read_iops" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" index 6324ce3..583ff79 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_bps_device.sh" @@ -53,34 +53,31 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置blkio.throttle.write_bps_device,限制速度为1MB/s echo "$device_number 1048576" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.write_bps_device # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs - dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=3 oflag=direct 2>&1 | tee "$TMP_FILE" + dd if=/dev/$disk of="$TMP_WIRTE_FILE" bs=1M count=3 oflag=direct 2>&1 | tee "$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 - write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') + write_bps=$(grep 'copied' "$TMP_FILE" | awk '{print $10}') msg "write_bps: $write_bps" up_write_bps=1.2 down_write_bps=0.8 # @预期结果:1: 如果写入速率在1MB/s左右,说明限速成功 - if [ "$(echo "$write_bps > $down_write_bps" | bc)" -eq 1 ] && [ "$(echo "$write_bps < $up_write_bps" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi - + assert_true [ "$(echo "$write_bps > $down_write_bps" | bc)" -eq 1 ] + assert_true [ "$(echo "$write_bps < $up_write_bps" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" index 455df5f..789337a 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-blkio-throttle-write_iops_device.sh" @@ -52,20 +52,21 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置blkio.throttle.write_iops_device,限制速度为100 IO/s echo "$device_number 100" >"$CGROUP_TOPDIR"/blkio/$CGROUP/blkio.throttle.write_iops_device # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/blkio/$CGROUP/cgroup.procs - dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" + dd if=/dev/$disk of=/tmp/testfile bs=4k count=500 oflag=direct 2>&1 | tee "$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" @@ -77,11 +78,8 @@ do_test() { down_write_iops=90 # @预期结果:1: 如果写入速率在100 IO/s左右,说明限速成功 - if [ "$(echo "$write_iops_per_second > $down_write_iops" | bc)" -eq 1 ] && [ "$(echo "$write_iops_per_second < $up_write_iops" | bc)" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$write_iops_per_second > $down_write_iops" | bc)" -eq 1 ] + assert_true [ "$(echo "$write_iops_per_second < $up_write_iops" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" index 45f82cc..f834e38 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-001.sh" @@ -62,11 +62,9 @@ do_test() { msg "throttled_time: $throttled_time" # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_time均不为零 - if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then - assert_true [ "$throttled_time" -gt 0 ] - else - assert_false [ true ] - fi + assert_true [ "$nr_periods" -gt 0 ] + assert_true [ "$nr_throttled" -gt 0 ] + assert_true [ "$throttled_time" -gt 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" index ee7c542..d9fcb5f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpu-cfs-002.sh" @@ -62,12 +62,10 @@ do_test() { msg "throttled_time: $throttled_time" # @预期结果:1: cpu.stat文件中的nr_periods等于6s, nr_throttled和throttled_time等于0 - if [ "$nr_periods" -eq 6 ] && [ "$nr_throttled" -eq 0 ]; then - assert_true [ "$throttled_time" -eq 0 ] - else - assert_false [ true ] - fi - + assert_true [ "$nr_periods" -eq 6 ] + assert_true [ "$nr_throttled" -eq 0 ] + assert_true [ "$throttled_time" -eq 0 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" index 6b33f06..776c7e4 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-stat.sh" @@ -64,12 +64,10 @@ do_test() { sys_after=$(echo "$stat_after" | grep system | awk '{print $2}') # @预期结果:1:如果用户态和内核态CPU使用情况都有增加,则认为测试通过 - if [ "$user_after" -gt "$user_before" ] && [ "$sys_after" -gt "$sys_before" ]; then - assert_true [ true ] - return 0 - fi + assert_true [ "$user_after" -gt "$user_before" ] + assert_true [ "$sys_after" -gt "$sys_before" ] - return 1 + return 0 } tc_teardown() { diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" index b4cf26e..f73fc46 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuacct-usage.sh" @@ -60,16 +60,15 @@ do_test() { msg "usage_after: $usage_after ns" # @预期结果:1: 验证统计数据是否正确反映了CPU使用情况,即CPU使用时间增加 - assert_true [ "$usage_after" -gt "$usage_before" ] || { - msg "usage_after: $usage_after <= usage_before: $usage_before" - return 1 - } + assert_true [ "$usage_after" -gt "$usage_before" ] return 0 } tc_teardown() { msg "Cleaning up test environment" + # @清理工作: 将shell进程移出cgroup + echo $$ >"$CGROUP_TOPDIR"/cpuacct/cgroup.procs # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/cpuacct/$CGROUP return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" index bca78c8..a9d990e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-001.sh" @@ -109,10 +109,8 @@ do_test() { memory_usage_in_numa1=$(numastat -p $task_pid | awk 'END{print $3}') # @预期结果:1:进程在numa node1上有内存使用,在numa node0没有内存使用 - assert_true [ "$memory_usage_in_numa0" == "0.00" ] && [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] - - # @于其结果:2: 002: 进程在numa_node2上有内存使用,在numa_node3也有内存使用 - # assert_true [ "$(echo "$memory_usage_in_numa2 > 0" | bc)" -eq 1 ] && [ "$(echo "$memory_usage_in_numa3 > 0" | bc)" -eq 1 ] + assert_true [ "$memory_usage_in_numa0" = "0.00" ] + assert_true [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" index 60b9288..c084d53 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_migrate-002.sh" @@ -107,7 +107,8 @@ do_test() { memory_usage_in_numa1=$(numastat -p $task_pid | awk 'END{print $3}') # @预期结果:1: 进程在numa_node0上有内存使用,在numa_node1也有内存使用 - assert_true [ "$(echo "$memory_usage_in_numa0 > 0" | bc)" -eq 1 ] && [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] + assert_true [ "$(echo "$memory_usage_in_numa0 > 0" | bc)" -eq 1 ] + assert_true [ "$(echo "$memory_usage_in_numa1 > 0" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" index 60aec46..aa1211b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-001.sh" @@ -122,11 +122,9 @@ do_test() { abs_node0_diff=${node0_diff//-/} node1_diff=$(echo "scale=2; $aver_node1_pagecache - $node1_pagecache" | bc) abs_node1_diff=${node1_diff//-/} - if [ "$(echo "$abs_node0_diff >= 98" | bc)" -eq 1 ] && [ "$(echo "$abs_node1_diff <= 102" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$abs_node1_diff < 3" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$abs_node0_diff >= 98" | bc)" -eq 1 ] + assert_true [ "$(echo "$abs_node0_diff <= 102" | bc)" -eq 1 ] + assert_true [ "$(echo "$abs_node1_diff < 3" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" index af39db3..64cb32d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-memory_spread_page-002.sh" @@ -128,16 +128,10 @@ do_test() { abs_num0_diff=${num0_diff//-/} num1_diff=$(echo "scale=2; $aver_node1_pagecache - $node1_file_pages" | bc) abs_num1_diff=${num1_diff//-/} - if [ "$(echo "$abs_num0_diff > 48 " | bc)" ] && [ "$(echo "$abs_num0_diff < 52" | bc)" ]; then - assert_true [ true ] - else - assert_true [ false ] - fi - if [ "$(echo "$abs_num1_diff > 48" | bc)" ] && [ "$(echo "$abs_num1_diff < 52" | bc)" ]; then - assert_true [ true ] - else - assert_true [ false ] - fi + assert_true [ "$(echo "$abs_num0_diff > 48 " | bc)" -eq 1 ] + assert_true [ "$(echo "$abs_num0_diff < 52" | bc)" -eq 1 ] + assert_true [ "$(echo "$abs_num1_diff > 48" | bc)" -eq 1 ] + assert_true [ "$(echo "$abs_num1_diff < 52" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" index 1358913..c6039eb 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-mems.sh" @@ -108,13 +108,7 @@ do_test() { mems_allowed=$(cat /proc/$task_pid/status | grep "Mems_allowed_list" | awk '{print $2}') # @预测结果:2: 验证进程是否只在指定的内存节点上运行 - if [ "$mems_allowed" = "$first_online_mem" ]; then - msg "进程绑定到NUMA节点1" - assert_true [ true ] - else - msg "进程未绑定到NUMA节点1" - return 1 # 测试失败 - fi + assert_true [ "$mems_allowed" = "$first_online_mem" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" index 9b35c6b..d36f985 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" @@ -118,11 +118,8 @@ do_test() { # @预期结果:2: first_online_cpu和second_online_cpu利用率都不为0 echo $$ >"$CGROUP_TOPDIR"/cpuset/cgroup.procs - if [ "$(echo "$cpu0_user_time > 70.0" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$cpu1_user_time > 70.0" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$cpu0_user_time > 70.0" | bc)" -eq 1 ] + assert_true [ "$(echo "$cpu1_user_time > 70.0" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" index b9680f7..83c3ead 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-001.sh" @@ -73,11 +73,7 @@ do_test() { whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CGROUP/devices.list) # @预期结果:2: 允许访问设备的白名单为空 - if [ -z "$whitelist" ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ -z "$whitelist" ] # @测试步骤:6: 允许访问设备 echo "b $device_number rwm" >"$CGROUP_TOPDIR"/devices/$CGROUP/devices.allow @@ -86,11 +82,7 @@ do_test() { whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CGROUP/devices.list) # @预期结果:3: 允许访问设备的白名单包含设备号 - if [ "$(echo "$whitelist" | grep -c "$device_number")" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$whitelist" | grep -c "$device_number")" -eq 1 ] # @测试步骤:8: 将当前shell进程加入cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" index c85b191..acaa6f7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-devices-002.sh" @@ -63,11 +63,7 @@ do_test() { whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CHILD0/devices.list) # @预期结果:1: CHILD0白名单中包硬盘设备 - if [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 1 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 1 ] # @测试步骤:5: 在父cgroup中禁用块设备访问(包含了硬盘设备) echo "b *:* rwm" >"$CGROUP_TOPDIR"/devices/$CGROUP/devices.deny @@ -76,11 +72,8 @@ do_test() { whitelist=$(cat "$CGROUP_TOPDIR"/devices/$CHILD0/devices.list) # @预期结果:2: 此时CHILD0白名单将不再包含硬盘设备 - if [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$whitelist" | grep -c "$device_number_major:$device_number_minor")" -eq 0 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" index 654a006..3d9c733 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-freezer-001.sh" @@ -45,12 +45,7 @@ do_test() { freezer_state=$(cat "$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state) # @预期结果:1: 当前cgroup状态为THAWED - if [ "$freezer_state" == "THAWED" ]; then - assert_true [ true ] - else - msg "测试失败: cgroup状态为$freezer_state, 而不是THAWED" - assert_false [ true ] - fi + assert_true [ "$freezer_state" == "THAWED" ] # @测试步骤:2: 创建一个后台进程,定期输出到文件 { @@ -78,12 +73,7 @@ do_test() { msg "diff: $diff" # @预期结果:2: 文件最后更新时间比现在时间至少差5s - if [ $diff -ge 5 ]; then - assert_true [ true ] - else - msg "测试失败: 进程没有被冻结" - assert_false [ true ] - fi + assert_true [ $diff -ge 5 ] # @测试步骤:6: 将cgroup状态设置为THAWED echo "THAWED" >"$CGROUP_TOPDIR"/freezer/$CGROUP/freezer.state @@ -98,12 +88,7 @@ do_test() { msg "diff: $diff" # @预期结果:3: 文件最后更新时间跟当前时间一致, 误差最大为1s - if [ $diff -le 1 ]; then - assert_true [ true ] - else - msg "测试失败: 进程没有被解冻" - assert_false [ true ] - fi + assert_true [ $diff -le 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" index 5cf181e..67e8bd0 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-001.sh" @@ -82,11 +82,8 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt大于0 - if [ "$MAX_USAGE" -eq 2097152 ]; then - assert_true [ "$FAILCNT" -gt 0 ] - else - assert_false [ true ] - fi + assert_true [ "$MAX_USAGE" -eq 2097152 ] + assert_true [ "$FAILCNT" -gt 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" index 881bbbc..02608e7 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-002.sh" @@ -81,11 +81,8 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 - if [ "$MAX_USAGE" -eq 2097152 ]; then - assert_true [ "$FAILCNT" -eq 0 ] - else - assert_false [ true ] - fi + assert_true [ "$MAX_USAGE" -eq 2097152 ] + assert_true [ "$FAILCNT" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" index 2c7ebbb..abb7ba3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-003.sh" @@ -76,11 +76,8 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 - if [ "$FAILCNT" -gt 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$FAILCNT" -gt 0 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" index fc188e3..5a7aa2f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-limit_in_bytes-004.sh" @@ -78,11 +78,9 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于1GB, failcnt等于0 - if [ "$MAX_USAGE" -eq 1073741824 ] && [ "$FAILCNT" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$MAX_USAGE" -eq 1073741824 ] + assert_true [ "$FAILCNT" -eq 0 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" index 6ddd17d..053536d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-001.sh" @@ -76,11 +76,7 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 - if [ "$FAILCNT" -gt 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$FAILCNT" -gt 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" index 7748e53..1e6ac6e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-002.sh" @@ -77,11 +77,8 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: max_usage_in_bytes等于2MB, failcnt等于0 - if [ "$MAX_USAGE" -eq 2097152 ] && [ "$FAILCNT" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$MAX_USAGE" -eq 2097152 ] + assert_true [ "$FAILCNT" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" index 31b6677..2ea0090 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-003.sh" @@ -76,11 +76,7 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: failcnt大于0 - if [ "$FAILCNT" -gt 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$FAILCNT" -gt 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" index 9efc791..cab559b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-hugetlb-rsvd-limit_in_bytes-004.sh" @@ -78,11 +78,8 @@ do_test() { msg "failcnt: $FAILCNT" # @预期结果:1: failcnt等于0 - if [ "$MAX_USAGE" -eq 1073741824 ] && [ "$FAILCNT" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ "$MAX_USAGE" -eq 1073741824 ] + assert_true [ "$FAILCNT" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" index b5d3e70..55d42aa 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-limit_in_bytes.sh" @@ -61,16 +61,10 @@ do_test() { # @预期结果:1: 在误差允许的范围内最大内存使用量等于50M且oom_kill大于0 max_usage_in_bytes=$(echo "$max_usage_in_bytes / 1024 /1024 " | bc ) - if [ "$max_usage_in_bytes" -eq "50" ] && [ "$oom_kill" -gt "0" ]; then - # @预期结果:2: 内存达到memory.limit_in_bytes的次数大于0 - if [ "$failcnt" -gt "0" ]; then - assert_true [ true ] - else - assert_false [ true ] - fi - else - assert_false [ true ] - fi + assert_true [ "$max_usage_in_bytes" -eq "50" ] + assert_true [ "$oom_kill" -gt "0" ] + # @预期结果:2: 内存达到memory.limit_in_bytes的次数大于0 + assert_true [ "$failcnt" -gt "0" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" index fb6f5f3..a87fe2e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-memsw-limit_in_bytes.sh" @@ -65,12 +65,10 @@ do_test() { # @预期结果:1: 在误差允许的范围内最大内存使用量等于50M且oom_kill大于0 max_memsw_usage_in_bytes=$(echo "$max_memsw_usage_in_bytes / 1024 /1024 " | bc ) - if [ "$max_memsw_usage_in_bytes" -eq "50" ] && [ "$oom_kill" -gt "0" ]; then - # @预期结果:2: 内存达到memory.memsw.limit_in_bytes的次数大于0 - assert_true [ "$memsw_failcnt" -gt 0 ] - else - assert_false [ true ] - fi + assert_true [ "$max_memsw_usage_in_bytes" -eq 50 ] + assert_true [ "$oom_kill" -gt 0 ] + # @预期结果:2: 内存达到memory.memsw.limit_in_bytes的次数大于0 + assert_true [ "$memsw_failcnt" -gt 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" index 9d0a7ec..9d2a222 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-pressure_level.sh" @@ -59,11 +59,7 @@ do_test() { done # @预期结果:1: 临时文件应该非空,有内存压力通知 - if [ -s "$TMP_FILE" ]; then - assert_true [ true ] - else - assert_false [ true ] - fi + assert_true [ -s "$TMP_FILE" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" index 0e553a9..69fa1b5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-memory-soft_limit_in_bytes.sh" @@ -62,11 +62,8 @@ do_test() { msg "oom_kill: $oom_kill" # @预期结果:1: 最大内存使用量超过了50M且oom_kill等于0 - if [ "$max_usage_in_bytes" -gt "52428800" ]; then - assert_true [ "$oom_kill" -eq "0" ] - else - assert_false [ true ] - fi + assert_true [ "$max_usage_in_bytes" -gt "52428800" ] + assert_true [ "$oom_kill" -eq "0" ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" index e024c25..84cda10 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-net_cls-001.sh" @@ -91,7 +91,8 @@ do_test() { # @预期结果:2: 在误差允许范围内,检查是否限制了带宽 kill -9 "$task_pid" - assert_true [ "$(echo "$bitrate > $down_bitrate" | bc)" -eq 1 -a "$(echo "$bitrate < $up_bitrate" | bc)" -eq 1 ] + assert_true [ "$(echo "$bitrate > $down_bitrate" | bc)" -eq 1 ] + assert_true [ "$(echo "$bitrate < $up_bitrate" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" index 2067b2a..6768042 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-perf_event.sh" @@ -67,11 +67,9 @@ do_test() { msg "cpu_clock: $cpu_clock" # @预期结果:1: 因为CGROUP中有两个进程, 所以cpu-clock在误差允许的范围内等于2s - if [ "$(echo "$cpu_clock > 1.8" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$cpu_clock < 2.2" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$cpu_clock > 1.8" | bc)" -eq 1 ] + assert_true [ "$(echo "$cpu_clock < 2.2" | bc)" -eq 1 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" index d20c60d..f4894e8 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-001.sh" @@ -58,7 +58,7 @@ do_test() { if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then assert_true [ "$FAILCNT" -gt 0 ] else - assert_false [ true ] + return 1 fi return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" index b427b20..1042dbc 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-002.sh" @@ -55,11 +55,8 @@ do_test() { FAILCNT=$(grep max "$CGROUP_TOPDIR"/pids/$CGROUP/pids.events | awk '{print $2}') # @预期结果:1: PID_NUM为2 - if [ "$PID_NUM" -eq 2 ]; then - assert_true [ "$FAILCNT" -eq 0 ] - else - assert_false [ true ] - fi + assert_true [ "$PID_NUM" -eq 2 ] + assert_true [ "$FAILCNT" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" index 0712a53..2d8e7b6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-pids-003.sh" @@ -66,7 +66,7 @@ do_test() { if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then assert_true [ "$FAILCNT" -gt 0 ] else - assert_false [ true ] + return 1 fi return 0 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" index a2e9dd0..6a675f3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-pressure.sh" @@ -107,11 +107,11 @@ do_test() { assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] # @预期结果:2: 触发器应该被触发 + is_trigered=-1 if grep -q "event triggered" "$TMP_FILE"; then - assert_true [ true ] - else - assert_false [ true ] + is_trigered=0 fi + assert_true [ "$is_trigered" -eq 0 ] return 0 } @@ -119,7 +119,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 清理后台进程 - kill -9 $task_pid1 $task_pid2 + kill -9 "$task_pid1" "$task_pid2" # @清理工作: 删除cgroup rmdir "$CGROUP_TOPDIR"/$CGROUP # @清理工作: 删除临时文件 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" index 2d5e09f..06cf964 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" @@ -51,23 +51,24 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置io.max,限制rbps为1MB/s echo "$device_number rbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd iflag=direct if="$disk" of=/dev/null bs=1M count=3 &>"$TMP_FILE" + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=3 &>"$TMP_FILE" # @测试步骤:4: 获取dd进程的读取速度 - read_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') + read_bps=$(grep 'copied' "$TMP_FILE" | awk '{print $10}') msg "read_bps: $read_bps" up_read_bps=1.2 down_read_bps=0.8 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" index d9cea6d..9538990 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" @@ -52,23 +52,24 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置io.max echo "$device_number wbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd if=$disk of="$TMP_WIRTE_FILE" bs=1M count=3 oflag=direct &>"$TMP_FILE" + dd if=/dev/$disk of="$TMP_WIRTE_FILE" bs=1M count=3 oflag=direct &>"$TMP_FILE" # @测试步骤:4: 获取dd进程的写入速度 - write_bps=$(grep -o '[0-9.]\+ MB/s' "$TMP_FILE" | awk '{print $1}') + write_bps=$(grep 'copied' "$TMP_FILE" | awk '{print $10}') msg "write_bps: $write_bps" up_write_bps=1.2 down_write_bps=0.8 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" index 72fa28c..fbb76b5 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" @@ -51,20 +51,21 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置io.max echo "$device_number riops=100" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd iflag=direct if=$disk of=/dev/null bs=4K count=500 &>"$TMP_FILE" + dd iflag=direct if=/dev/$disk of=/dev/null bs=4K count=500 &>"$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" index 5082012..0ea0576 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" @@ -51,20 +51,21 @@ do_test() { # @测试步骤:1: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 设置io.max echo "$device_number wiops=100" >"$CGROUP_TOPDIR"/$CGROUP/io.max # @测试步骤:3: 启动一个dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd if=$disk of=/tmp/testfile bs=4k count=500 oflag=direct &>"$TMP_FILE" + dd if=/dev/$disk of=/tmp/testfile bs=4k count=500 oflag=direct &>"$TMP_FILE" time=$(grep -oP '(?<=, )\d+\.\d+(?= s)' "$TMP_FILE") msg "time: $time" diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" index c8d6934..3cfda04 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-pressure.sh" @@ -54,13 +54,14 @@ do_test() { # @测试步骤:2: 获取硬盘设备 if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" - disk="/dev/sda" - device_number="8:0" + disk="sda" else msg "disk is /dev/vda" - disk="/dev/vda" - device_number="253:0" + disk="vda" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:3: 设置io.max,限制rbps为1MB/s echo "$device_number rbps=1048576" >"$CGROUP_TOPDIR"/$CGROUP/io.max @@ -70,7 +71,7 @@ do_test() { # @测试步骤:5: 启动两个dd进程 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs - dd iflag=direct if="$disk" of=/dev/null bs=1M count=5 + dd iflag=direct if=/dev/$disk of=/dev/null bs=1M count=5 echo $$ >"$CGROUP_TOPDIR"/cgroup.procs # @测试步骤:6: 读取io.pressure文件 @@ -82,11 +83,11 @@ do_test() { assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] # @预期结果:2: 触发器应该被触发 + is_trigered=-1 if grep -q "event triggered" "$TMP_FILE"; then - assert_true [ true ] - else - assert_false [ true ] + is_trigered=0 fi + assert_true [ "$is_trigered" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" index 04f2e9a..c77016f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" @@ -61,20 +61,21 @@ do_test() { if [[ -e /dev/sda ]]; then msg "disk is /dev/sda" disk="sda" - disk_device="8:0" else msg "disk is /dev/vda" disk="vda" - disk_device="253:0" fi + major_device_number=$(stat -c '%t' /dev/$disk) + minor_device_number=$(stat -c '%T' /dev/$disk) + device_number="$major_device_number:$minor_device_number" # @测试步骤:2: 启用io.cost.qos - echo "$disk_device enable=1 ctrl=auto" >"$CGROUP_TOPDIR"/io.cost.qos + echo "$device_number enable=1 ctrl=auto" >"$CGROUP_TOPDIR"/io.cost.qos # @测试步骤:3: 设置CHILD0\CHILD1\CHILD2的io.weight - echo "$disk_device 100" >"$CGROUP_TOPDIR/$CHILD0/io.weight" - echo "$disk_device 200" >"$CGROUP_TOPDIR/$CHILD1/io.weight" - echo "$disk_device 300" >"$CGROUP_TOPDIR/$CHILD2/io.weight" + echo "$device_number 100" >"$CGROUP_TOPDIR/$CHILD0/io.weight" + echo "$device_number 200" >"$CGROUP_TOPDIR/$CHILD1/io.weight" + echo "$device_number 300" >"$CGROUP_TOPDIR/$CHILD2/io.weight" # @测试步骤:4: 启动dd进程 echo $$ >"$CGROUP_TOPDIR/$CHILD0/cgroup.procs" @@ -90,9 +91,9 @@ do_test() { wait $task_pid # @测试步骤:5: 获取dd进程的读取速度 - read_speed1=$(grep -oP '\d+.\d+' "$TMP_FILE0" | tail -n 1) - read_speed2=$(grep -oP '\d+.\d+' "$TMP_FILE1" | tail -n 1) - read_speed3=$(grep -oP '\d+.\d+' "$TMP_FILE2" | tail -n 1) + read_speed1=$(grep 'copied' "$TMP_FILE0" | awk '{print $10}') + read_speed2=$(grep 'copied' "$TMP_FILE1" | awk '{print $10}') + read_speed3=$(grep 'copied' "$TMP_FILE2" | awk '{print $10}') msg "read_speed1: $read_speed1" msg "read_speed2: $read_speed2" msg "read_speed3: $read_speed3" @@ -110,7 +111,7 @@ do_test() { tc_teardown() { msg "this is tc_teardown" # @清理工作: 关闭io.cost.qos - echo "$disk_device enable=0" >"$CGROUP_TOPDIR"/io.cost.qos + echo "$device_number enable=0" >"$CGROUP_TOPDIR"/io.cost.qos # @清理工作: 将shell进程移出cgroup echo $$ >"$CGROUP_TOPDIR/cgroup.procs" # @清理工作: 删除cgroup diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" index e0f3128..41a55f6 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-high-001.sh" @@ -62,12 +62,14 @@ do_test() { sleep 2 # @预期结果:2: 分配成功 - if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then - assert_false [ true ] - else - msg "分配成功" - assert_true [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_alloc=-1 + else + is_alloc=0 fi + assert_true [ "$is_alloc" -eq 0 ] + kill -9 $task_pid # @测试步骤:5: 分配50MB页缓存 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" index de34374..7aadd78 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-max.sh" @@ -61,12 +61,13 @@ do_test() { sleep 2 # @预期结果:2: 分配失败 - if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then - msg "分配失败" - assert_true [ true ] - else - assert_false [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_alloc=-1 + else + is_alloc=0 fi + assert_false [ "$is_alloc" -eq 0 ] # @测试步骤:5: 分配50MB页缓存 echo $$ >"$CGROUP_TOPDIR"/$CGROUP/cgroup.procs @@ -101,7 +102,7 @@ do_test() { # @测试步骤:8: 读取memory.peak if [ ! -f "$CGROUP_TOPDIR"/$CGROUP/memory.peak ]; then - assert_true [ true ] + return 0 else memory_peak=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.peak) memory_peak=$(echo "$memory_peak / 1024 / 1024" | bc) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" index 709929f..cc6bd47 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-events.sh" @@ -54,12 +54,13 @@ do_test() { sleep 2 # @预期结果:1: 分配失败 - if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then - msg "分配失败" - assert_true [ true ] - else - assert_false [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_alloc=-1 + else + is_alloc=0 fi + assert_false [ "$is_alloc" -eq 0 ] # @测试步骤:4: 读取memory.events中的oom字段 oom_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/memory.events | grep oom | awk 'NR==1 {print $2}') diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" index f447668..1d2a1ac 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-001.sh" @@ -69,11 +69,13 @@ do_test() { sleep 1 # @预期结果:1: CHILD中的进程都被kill - if [ "$(wc -c <"$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_killed=0 + else + is_killed=-1 fi + assert_true [ "$is_killed" -eq 0 ] # @测试步骤:6: 获取CHILD的memory.events中的oom_kill oom_kill_cnt=$(grep "oom_kill" "$CGROUP_TOPDIR"/$CHILD/memory.events | awk '{print $2}') @@ -90,7 +92,7 @@ do_test() { # @测试步骤:8: 获取CGROUP的oom_group_kill oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') if [ -z "$oom_group_kill_cnt" ]; then - assert_true [ true ] + return 0 else # @预期结果:4: oom_group_kill_cnt为1 assert_true [ "$oom_group_kill_cnt" -eq 1 ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" index 04d3885..76323e3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-002.sh" @@ -71,23 +71,27 @@ do_test() { sleep 1 # @预期结果:1: CHILD中的进程都被kill - if [ "$(wc -c <"$CGROUP_TOPDIR/$CHILD/cgroup.procs")" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CHILD/cgroup.procs) + if [ -z "$pids" ]; then + is_killed=0 + else + is_killed=-1 fi + assert_true [ "$is_killed" -eq 0 ] # @预期结果:2: PARENT中的进程都被kill - if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then - assert_true [ true ] - else - assert_false [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_killed=0 + else + is_killed=-1 fi + assert_true [ "$is_killed" -eq 0 ] # @测试步骤:7: 获取CGROUP的oom_group_kill oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') if [ -z "$oom_group_kill_cnt" ]; then - assert_true [ true ] + return 0 else # @预期结果:4: oom_group_kill_cnt为1 assert_true [ "$oom_group_kill_cnt" -eq 1 ] diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" index 0bef7d2..7b2438c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" @@ -80,18 +80,16 @@ do_test() { # @测试步骤:9: 获取CGROUP的oom_group_kill oom_group_kill_cnt=$(grep "oom_group_kill" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk '{print $2}') if [ -z "$oom_group_kill_cnt" ]; then - assert_true [ true ] + echo "Warning: oom_group_kill count not found in $CGROUP_TOPDIR/$CGROUP/memory.events" else # @预期结果:4: oom_group_kill_cnt为1 assert_true [ "$oom_group_kill_cnt" -eq 1 ] fi - # @测试步骤:10: 尝试kill有OOM_SCORE_ADJ_MIN的进程 + # @测试步骤:10: 尝试kill有OOM_SCORE_ADJ_MIN的进程, 进程task_pid被kill kill -9 $task_pid || assert_false [ true ] # @预期结果:3: 进程task_pid被kill - assert_true [ true ] - return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" index 1d68f67..bf571ae 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-pressure.sh" @@ -73,12 +73,11 @@ do_test() { assert_true [ "$(echo "$avg10 > 0" | bc)" -eq 1 ] # @预期结果:2: 触发器应该被触发 - msg "file content: $(cat "$TMP_FILE")" + is_trigered=-1 if grep -q "event triggered" "$TMP_FILE"; then - assert_true [ true ] - else - assert_false [ true ] + is_trigered=0 fi + assert_true [ "$is_trigered" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" index e21ac02..84f3a9b 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" @@ -66,12 +66,13 @@ do_test() { sleep 2 # @预期结果:2: 分配成功 - if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then - assert_false [ true ] - else - msg "分配成功" - assert_true [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_alloc=-1 + else + is_alloc=0 fi + assert_true [ "$is_alloc" -eq 0 ] kill -9 $task_pid # @测试步骤:5: 分配50M匿名内存的进程 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" index 56fbc37..becbfce 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" @@ -60,13 +60,13 @@ do_test() { sleep 5 # @预期结果:1: 分配失败 - if [ "$(wc -c <"$CGROUP_TOPDIR/$CGROUP/cgroup.procs")" -eq 0 ]; then - msg "分配失败" - assert_true [ true ] - else - msg "分配成功" - assert_false [ true ] + pids=$(cat "$CGROUP_TOPDIR"/$CGROUP/cgroup.procs) + if [ -z "$pids" ]; then + is_alloc=-1 + else + is_alloc=0 fi + assert_false [ "$is_alloc" -eq 0 ] # @测试步骤:4: 获取CGROUP的momory.events中的oom oom_cnt=$(grep "oom" "$CGROUP_TOPDIR"/$CGROUP/memory.events | awk 'NR==1 {print $2}') diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" index d115918..6348b29 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-zswap.sh" @@ -38,7 +38,8 @@ tc_setup() { # @预置条件: 启用memory控制器 echo "+memory" >"$CGROUP_TOPDIR"/cgroup.subtree_control || return 1 # @预置条件: 查看系统是否启用了zswap - if ! dmesg | grep zswap &>/dev/null; then + enabled=$(cat /sys/module/zswap/parameters/enabled) + if [ "$enabled" = 'N' ]; then skip_test "系统未启用zswap" fi diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" index 700cd21..85c7809 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-001.sh" @@ -62,7 +62,7 @@ do_test() { # @测试步骤:5: 获取最大进程数 if [ ! -f "$CGROUP_TOPDIR"/$CGROUP/pids.peak ]; then - assert_true [ true ] + return 0 else peak_cnt=$(cat "$CGROUP_TOPDIR"/$CGROUP/pids.peak) # @预期结果:2: 最大进程数为2 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" index bedd836..7804fd8 100644 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/\346\265\213\350\257\225\346\212\245\345\221\212.md" @@ -1,7 +1,3 @@ -目录: - -[TOC] - # 测试环境 **OpenCloudOS 8:** -- Gitee From f29adce9543df51ab20296164d0649248a137baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 15 Aug 2024 20:51:15 +0800 Subject: [PATCH 36/37] =?UTF-8?q?=E6=8C=89=E8=A6=81=E6=B1=82=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cgroup-v1-cpuset-sched_load_balance.sh" | 2 +- .../testcase/cgroup-v2-cpu-max-burst-001.sh" | 7 ++----- .../testcase/cgroup-v2-cpu-max-burst-002.sh" | 7 ++----- .../tst-cgroup/testcase/cgroup-v2-cpu-max.sh" | 8 +++----- .../tst-cgroup/testcase/cgroup-v2-io-max-001.sh" | 7 ++----- .../tst-cgroup/testcase/cgroup-v2-io-max-002.sh" | 7 ++----- .../tst-cgroup/testcase/cgroup-v2-io-max-003.sh" | 7 ++----- .../tst-cgroup/testcase/cgroup-v2-io-max-004.sh" | 7 ++----- .../tst-cgroup/testcase/cgroup-v2-io-weight.sh" | 7 ++----- .../testcase/cgroup-v2-memory-oom-group-003.sh" | 5 ++++- .../testcase/cgroup-v2-memory-reclaim-001.sh" | 7 ++----- .../testcase/cgroup-v2-memory-reclaim-002.sh" | 7 ++----- .../testcase/cgroup-v2-memory-swap-high.sh" | 15 +++++---------- .../testcase/cgroup-v2-memory-swap-max.sh" | 15 +++++---------- .../testcase/cgroup-v2-pids-max-002.sh" | 7 ++----- .../testcase/cgroup-v2-pids-max-003.sh" | 2 +- 16 files changed, 39 insertions(+), 78 deletions(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" index d36f985..cf3a06c 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v1-cpuset-sched_load_balance.sh" @@ -102,7 +102,7 @@ do_test() { elif [ "$(echo "$cpu0_user_time < 3" | bc)" -eq 1 ]; then assert_true [ "$(echo "$cpu1_user_time > 70.0" | bc)" -eq 1 ] else - assert_false [ true ] + return 1 fi # @测试步骤:7: 启用负载平衡 diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" index 5e61d35..cb10c42 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-001.sh" @@ -64,11 +64,8 @@ do_test() { burst_usec=$(echo "$cpu_stat" | grep burst_usec | awk '{print $2}') # @预期结果:1: cpu.stat文件中的burst_usec和nr_bursts均大于0 - if [ "$nr_bursts" -gt 0 ]; then - assert_true [ "$burst_usec" -eq 50000 ] - else - assert_false [ true ] - fi + assert_true [ "$nr_bursts" -gt 0 ] + assert_true [ "$burst_usec" -eq 50000 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" index 7521822..d3e486f 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max-burst-002.sh" @@ -62,11 +62,8 @@ do_test() { msg "burst_usec: $burst_usec" # @预期结果:1: cpu.stat文件中的burst_usec和nr_bursts均等于0 - if [ "$nr_burst" -eq 0 ]; then - assert_true [ "$burst_usec" -eq 0 ] - else - assert_false [ true ] - fi + assert_true [ "$nr_burst" -eq 0 ] + assert_true [ "$burst_usec" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" index ff4f21a..23eb632 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-cpu-max.sh" @@ -62,11 +62,9 @@ do_test() { msg "nr_periods: $nr_periods, nr_throttled: $nr_throttled, throttled_usec: $throttled_usec" # @预期结果:1: cpu.stat文件中的nr_periods和nr_throttled,throttled_usec均大于0 - if [ "$nr_periods" -gt 0 ] && [ "$nr_throttled" -gt 0 ]; then - assert_true [ "$throttled_usec" -gt 0 ] - else - assert_false [ true ] - fi + assert_true [ "$nr_periods" -gt 0 ] + assert_true [ "$nr_throttled" -gt 0 ] + assert_true [ "$throttled_usec" -gt 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" index 06cf964..e518164 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-001.sh" @@ -74,11 +74,8 @@ do_test() { down_read_bps=0.8 # @预期结果:1: 如果读取速率在1MB/s左右,说明限速成功 - if [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$read_bps > $down_read_bps" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_bps < $up_read_bps" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" index 9538990..d8e358e 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-002.sh" @@ -75,11 +75,8 @@ do_test() { down_write_bps=0.8 # @预期结果:1: 如果写入速率在1MB/s左右,说明限速成功 - if [ "$(echo "$write_bps > $down_write_bps" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$write_bps < $up_write_bps" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$write_bps > $down_write_bps" | bc)" -eq 1 ] + assert_true [ "$(echo "$write_bps < $up_write_bps" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" index fbb76b5..ee63117 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-003.sh" @@ -78,11 +78,8 @@ do_test() { down_read_iops=90 # @预期结果:1: 如果读取速率在100 IO/s左右,说明限速成功 - if [ "$(echo "$read_iops_per_second > $down_read_iops" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$read_iops_per_second < $up_read_iops" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$read_iops_per_second > $down_read_iops" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_iops_per_second < $up_read_iops" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" index 0ea0576..786644d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-max-004.sh" @@ -78,11 +78,8 @@ do_test() { down_wirte_iops=90 # @预期结果:1: 如果读取速率在100 IO/s左右,说明限速成功 - if [ "$(echo "$write_iops_per_second > $down_wirte_iops" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$write_iops_per_second < $up_wirte_iops" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$write_iops_per_second > $down_wirte_iops" | bc)" -eq 1 ] + assert_true [ "$(echo "$write_iops_per_second < $up_wirte_iops" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" index c77016f..9ec86c3 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-io-weight.sh" @@ -99,11 +99,8 @@ do_test() { msg "read_speed3: $read_speed3" # @预期结果:1: CHIlD0的读取速度小于CHILD1的读取速度, CHILD1的读取速度小于CHILD2的读取速度 - if [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ]; then - assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$(echo "$read_speed1 < $read_speed2" | bc)" -eq 1 ] + assert_true [ "$(echo "$read_speed2 < $read_speed3" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" index 7b2438c..67740a0 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-oom-group-003.sh" @@ -87,9 +87,12 @@ do_test() { fi # @测试步骤:10: 尝试kill有OOM_SCORE_ADJ_MIN的进程, 进程task_pid被kill - kill -9 $task_pid || assert_false [ true ] + ret=0 + kill -9 $task_pid || ret=-1 # @预期结果:3: 进程task_pid被kill + assert_true [ "$ret" -eq 0 ] + return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" index 592fbc7..32f3436 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-001.sh" @@ -80,11 +80,8 @@ do_test() { msg "diff: $diff" diff_max=45 diff_min=35 - if [ "$diff" -gt $diff_min ]; then - assert_true [ "$diff" -lt $diff_max ] - else - assert_false [ true ] - fi + assert_true [ "$diff" -gt $diff_min ] + assert_true [ "$diff" -lt $diff_max ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" index 1f6775a..d2d3976 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-reclaim-002.sh" @@ -78,11 +78,8 @@ do_test() { msg "diff: $diff" diff_max=45 diff_min=35 - if [ "$diff" -gt $diff_min ]; then - assert_true [ "$diff" -lt $diff_max ] - else - assert_false [ true ] - fi + assert_true [ "$diff" -gt $diff_min ] + assert_true [ "$diff" -lt $diff_max ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" index 84f3a9b..c4858d2 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-high.sh" @@ -102,19 +102,14 @@ do_test() { TOLERANCE=$(echo "($aver_memory_current + 30) * 0.1" | bc) diff=$((aver_memory_current - 30)) abs_diff=${diff#-} - if [ "$aver_memory_current" -ne 0 ]; then - assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$aver_memory_current" -ne 0 ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + TOLERANCE=$(echo "($aver_memory_current + $aver_memory_swap_current + 50) * 0.03" | bc) diff=$((aver_memory_current + aver_memory_swap_current - 50)) abs_diff=${diff#-} - if [ "$aver_memory_current" -ne 0 ]; then - assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$aver_memory_current" -ne 0 ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" index becbfce..af2b745 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-memory-swap-max.sh" @@ -109,19 +109,14 @@ do_test() { TOLERANCE=$(echo "($aver_memory_current + 30) * 0.1" | bc) diff=$((aver_memory_current - 30)) abs_diff=${diff#-} - if [ "$aver_memory_current" -ne 0 ]; then - assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$aver_memory_current" -ne 0 ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] + TOLERANCE=$(echo "($aver_memory_current + $aver_swap_current + 50) * 0.03" | bc) diff=$((aver_memory_current + aver_swap_current - 50)) abs_diff=${diff#-} - if [ "$aver_memory_current" -ne 0 ]; then - assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] - else - assert_false [ true ] - fi + assert_true [ "$aver_memory_current" -ne 0 ] + assert_true [ "$(echo "$abs_diff < $TOLERANCE" | bc)" -eq 1 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" index bc88d27..8969447 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-002.sh" @@ -58,11 +58,8 @@ do_test() { msg "fail cnt: $fail_cnt" # @预期结果:1: pid_num为2 - if [ "$pid_num" -eq 2 ]; then - assert_true [ "$fail_cnt" -eq 0 ] - else - assert_false [ true ] - fi + assert_true [ "$pid_num" -eq 2 ] + assert_true [ "$fail_cnt" -eq 0 ] return 0 } diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" index 30beb44..e5d2f82 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-pids-max-003.sh" @@ -69,7 +69,7 @@ do_test() { if grep -q "Resource temporarily unavailable" "$TMP_FILE"; then assert_true [ "$fail_cnt" -gt 0 ] else - assert_false [ true ] + return 1 fi return 0 -- Gitee From ce01144dd75c41418dd63acf367a8fce7fd67bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Tue, 3 Sep 2024 18:18:01 +0800 Subject: [PATCH 37/37] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A2=AB=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=B3=A8=E9=87=8A=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testcase/cgroup-v2-freeze-002.sh" | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" index b6036a4..4edbd0d 100755 --- "a/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" +++ "b/\344\270\212\346\211\213issue_\344\275\234\345\223\201\346\226\207\344\273\266\345\244\271/\351\273\204\351\223\255\346\266\233-\351\252\214\350\257\201Linux_Kernel_Cgroup_V1\345\222\214V2\345\220\204\345\255\220\346\250\241\345\235\227\347\232\204\345\212\237\350\203\275/tst-cgroup/testcase/cgroup-v2-freeze-002.sh" @@ -101,33 +101,33 @@ do_test() { # # @测试步骤:7: 冻结CGROUP echo 1 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze - # # @预期结果:2: CGROUP, CHILD0, CHILD1的cgroup.event中的frozen字段为1 + # @预期结果:2: CGROUP, CHILD0, CHILD1的cgroup.event中的frozen字段为1 frozen=$(grep frozen "$CGROUP_TOPDIR"/$CGROUP/cgroup.events | awk '{print $2}') assert_true [ "$frozen" -eq 1 ] - # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') - # assert_true [ "$frozen" -eq 1 ] - # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') - # assert_true [ "$frozen" -eq 1 ] - - # # @测试步骤:8: 解冻CHILD0, CHILD10, CHILD100 - # echo 0 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.freeze - # echo 0 >"$CGROUP_TOPDIR"/$CHILD10/cgroup.freeze - # echo 0 >"$CGROUP_TOPDIR"/$CHILD100/cgroup.freeze - - # # @预期结果:3: CHILD00, CHILD1000的cgroup.event中的frozen字段为1 - # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') - # assert_true [ "$frozen" -eq 1 ] - # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1000/cgroup.events | awk '{print $2}') - # assert_true [ "$frozen" -eq 1 ] - - # # @测试步骤:9: 解冻CGROUP - # echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze - - # # @预期结果:4: CHILD00, CHILD2的cgroup.event中的frozen字段为0 - # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') - # assert_true [ "$frozen" -eq 0 ] - # frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD2/cgroup.events | awk '{print $2}') - # assert_true [ "$frozen" -eq 0 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD0/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:8: 解冻CHILD0, CHILD10, CHILD100 + echo 0 >"$CGROUP_TOPDIR"/$CHILD0/cgroup.freeze + echo 0 >"$CGROUP_TOPDIR"/$CHILD10/cgroup.freeze + echo 0 >"$CGROUP_TOPDIR"/$CHILD100/cgroup.freeze + + # @预期结果:3: CHILD00, CHILD1000的cgroup.event中的frozen字段为1 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD1000/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 1 ] + + # @测试步骤:9: 解冻CGROUP + echo 0 >"$CGROUP_TOPDIR"/$CGROUP/cgroup.freeze + + # @预期结果:4: CHILD00, CHILD2的cgroup.event中的frozen字段为0 + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD00/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] + frozen=$(grep frozen "$CGROUP_TOPDIR"/$CHILD2/cgroup.events | awk '{print $2}') + assert_true [ "$frozen" -eq 0 ] return 0 } -- Gitee

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